常見方案:Qt/Embedded、FLTK、Microwindows、GTK+。選型需考量:定制改造難度、改造後體積大小。本文深度分析 **GTK+ 運行於 X,X 運行於 framebuffer** 方案。
社區大量裁剪工作,最知名 TinyX:移除不需代碼、去除 XLIB 靜態資料(顏色管理、弧形、粗線條等),顯著縮小體積。經裁剪後 GTK+/X 效率甚至優於 GTK+/FB 和 Qt/E,XLIB 對應用開發支援更好、開發更高效。
刪除 GtkGamma、GtkHRuler、過時 GtkList(被 GtkCList 取代)、不需 GtkFrame 邊框等。
主題引擎機制不夠靈活、硬編碼多、主題即額外代碼段增加體積。需簡化:按鈕大小涉及邊框寬度、x/y 位置、預設間距/位置常量、焦點獲取等參數。嵌入式不需如此完整,依實際需求精簡代碼。面向對象繼承窗口 Widget 特性作為子類亦有效。
GTK+ 假定窗口嵌套關係,但嵌入式常見軟鍵盤超出窗口範圍。需為 GtkWindow 增加特性:將軟鍵盤視為特殊子窗口,處理按鍵事件並轉發給工具欄。回調函數註冊至原始窗口,增加介面創建/響應按鍵事件。小螢幕下簡化捲動條(去邊框、單條)。
痛點:GTK+ 大型 Widget 風格與 X 傳統字體管理結合導致問題。GtkStyle 大型物件,不同字體大小窗口各持唯一 GtkStyle 浪費記憶體。X 將不同外形視為不同字體,難以動態變粗/變大。
在 GtkWidget 結構加入 GdkFont *font:
gtk_widget_set_font_bold(widget, TRUE);
gtk_widget_set_font_enlarge(widget, 1); // 基礎字體放大 1 號
邏輯:設定了 widget->font 使用它,否則回退 widget->style->font。比直接用 X 字體名稱靈活得多。
輕量級開源 X 窗口管理器。嵌入式策略:最上層窗口獲取焦點,僅對話框可移動顯示標題欄。管理內部/外部應用窗口,Socket 連接命名,支援窗口堆疊控制、焦點轉移通知。