網路城邦
上一篇 回創作列表 下一篇   字體:
GTK+ Programming -- demo_button.c (compared with X Intrinsic Toolkit)
2018/02/13 17:27:54瀏覽778|回應0|推薦6

上一篇文章以 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 做出貢獻的工程師們。

 


《隨興攝影筆記簿》

( 創作其他 )
推薦文章 列印 加入我的文摘
上一篇 回創作列表 下一篇

引用
引用網址:https://classic-blog.udn.com/article/trackback.jsp?uid=chungchia&aid=110308643