1、首先說一下gtk、qt與xlib之間的關係:服務器
QT是直接調用xlib庫的,GTK並未直接調用xlib,而是使用更低層的函數庫GDK和Glib。這種結構使得Gtk能夠更方便地移植到其它系統上,或使用與XWindows系統無關的圖形庫。ide
2、KDE、GNOME、QT和GTK直接關係:函數
KDE和GNOME是窗口管理器,啓動他們後咱們進入了可視化操做(圖形界面),既然須要顯示圖形,天然少不了與X協議的服務器軟件打交道,既然QT和GTK進一步封裝了X協議,而且他們提供了更爲豐富的窗口及控制機制,因而在QT基礎上實現的窗口管理器叫KDE,在GTK基礎上實現的窗口管理器叫GNOME.spa
再次提示:KDE和GNOME並不僅是窗口管理器,同時提供了桌面、菜單等等。blog
3、一般在xlib函數中須要指定特定的Display以及相應widget的Window(xwindow id)。接口
爲了在Gtk應用中使用xlib相關函數,咱們須要找到在gtk與xlib之間的橋樑。get
Gtk是在Gdk的基礎上進行封裝和延伸的,Gdk也將經常使用的Xlib函數進行封裝,所以gdk爲gtk庫提供了與Xlib相關聯的函數,qt
在gdk/gdkx.h中能夠看到定義了GdkWindow與Xlib中結構的變量訪問,如GDK_WINDOW_XID獲得Window(xid),it
Display能夠經過XOpenDisplay(NULL)或者GDK_WINDOW_XDISPLAY。io
獲得這些後,想更變一下窗體控件的屬性就簡單了。
例如:
GtkWidget *win = NULL;
win = gtk_window_new (Gtk_WINDOW_TOPLEVEL);
Display *display = XOpenDisplay(NULL);
XResizeWindow (display, GDK_WINDOW_XID (win->window), 200, 200); //更改win的size
XFlush (display); //即時刷新
可使用以下接口:
GtkWindow *win;
GdkWindow *window = gtk_widget_get_window(win);
const Window xwin = GDK_WINDOW_XID(window);
Display * const display=GDK_WINDOW_XDISPLAY(window);
來獲取Window 的id以及Display。