一、首先說一下gtk、qt與xlib之間的關係:
QT是直接調用xlib庫的,GTK並未直接調用xlib,而是使用更低層的函數庫GDK和Glib。這種結構使得Gtk可以更方便地移植到其它系統上,或使用與XWindows系統無關的圖形庫。
二、KDE、GNOME、QT和GTK直接關係:
KDE和GNOME是窗口管理器,啓動他們後我們進入了可視化操作(圖形界面),既然需要顯示圖形,自然少不了與X協議的服務器軟件打交道,既然QT和GTK進一步封裝了X協議,並且他們提供了更爲豐富的窗口及控制機制,於是在QT基礎上實現的窗口管理器叫KDE,在GTK基礎上實現的窗口管理器叫GNOME.
再次提示:KDE和GNOME並不只是窗口管理器,同時提供了桌面、菜單等等。
三、通常在xlib函數中需要指定特定的Display以及相應widget的Window(xwindow id)。
爲了在Gtk應用中使用xlib相關函數,我們需要找到在gtk與xlib之間的橋樑。
Gtk是在Gdk的基礎上進行封裝和延伸的,Gdk也將常用的Xlib函數進行封裝,因此gdk爲gtk庫提供了與Xlib相關聯的函數,
在gdk/gdkx.h中可以看到定義了GdkWindow與Xlib中結構的變量訪問,如GDK_WINDOW_XID得到Window(xid),
Display可以通過XOpenDisplay(NULL)或者GDK_WINDOW_XDISPLAY。
得到這些後,想更變一下窗體控件的屬性就簡單了。
例如:
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。