上一篇文章以 memo.c 與 push_button.c 介紹了 Xt and Motif Programming,今天這篇文章就正式地介紹 GTK+ Programming,並與 X Intrinsic Toolkit 的 Function Call 來做個對照。
目前最熱門的 GUI Development Toolkit 是 Qt 而不是 GTK+,那筆者為何不選 Qt 而是 GTK+ ?這當然是有原因 (license and support fee, royalty fee, performance issue, lock-in issue and switching cost ...),原本是有寫了一些緣由,但考慮到寫了得罪人,所以決定刪除,就請讀者自行決定。
GTK+,royalty free 而且無須公開與 business domain 有關的程式碼,再加上 C compiler 就可以跟它做編譯與連結,因此跟舊有的一些程式碼以及 library 的包容性比較高,所以筆者最後選擇了 GTK+2.0 (雖然 GTK+-3.0 已經問世,但舊的 GTK+-2.0 就已經夠用;在 Ubuntu Linux 之下,鍵入 sudo apt-get install libgtk2.0)。
OK,現在就來看一下一個 GTK+ 的範例程式 demo_button.c:
< Main Part >

< Callback Part >

GTK+ 的 Function Call 與 X Intrinsic Toolkit Function Call 的類似對應,筆者已經註寫在程式當中,讀者可以自行查詢 Function Call 的說明並做個對照。
< Makefile for GTK+-2.0 Programming >

執行:


GTK+ 與 X Intrinsic Toolkit 的底層都是 X library,所以兩者的機制是大同小異,基本觀念是一樣的;更精確地說,GTK+ 與 X library 之間還夾了一個 GDK library,另外 GTK+ 的底層還有一個跟 X Window 無關的 library 叫做 GLib,是跟 data structure 有關的 library,例如 list 與 hash 等等。此外,GTK+ 把與 widget 有關的 event 叫做 signal,例如 GtkButton widget 支援 clicked、enter、leave、pressed、以及 released 等 signal,並透過 GLib 的 g_signal_connect() 來建立 widget signal 與 widget callback 的關係;這裡要注意的是,GTK+ 的 widget signal 實際上就是 widget event,這個 signal 跟 Unix System Call 裡面的 signal 是不同的東西,希望讀者不要搞混了!
順道一提的是,筆者不太欣賞 GLib 的 naming convention -- g_blahblahblah, 只有一個字母 g 來做為 prefix,顯得有些單薄與不太專業的感覺,取名為 glib_blahblahblah 應該會更好;signal_connect() 在 Gtk 1.x 版本時是放在 Gtk Layer,但在後續的版本中則被移到 GLib Layer。其實跟 widget 有關的 signal,或更精確的說,widget 專有的 signal,留在 Gtk Layer 就好,何必移到 GLib Layer 之中呢?GLib Layer 之中的 signal 應該是要放跟 widget 無關的 signal 會比較好,不該放進 GLib 與 Gtk 都可共用的 signal,兩個 Layer 的 signal 要切乾淨會比較好;筆者個人見解,僅供參考。
透過 GTK+ program 與 X Intrinsic Toolkit program 相互對照,就很好理解 GTK+ program 的設計邏輯;當然,GTK+ widget set 比 Xt widget set 與 Motif widget set 豐富許多,也多做了很多事情,真的要好好感謝這些為 GTK+ library 做出貢獻的工程師們。
下一則: Xt and Motif Programming -- memo.c,push_button.c
限會員,要發表迴響,請先登入












