1,進入點main/main-lite.c main函數
他的功能是調用InitGUI函數初始化MINIGUI,最終調用使用者程式MiniGUIMain
它是一個封裝器,縮減MINIGUI啟動過程。
MINIGUI的伺服器和使用者程式是靠程式名稱來區別的,如果你的客戶程式是取mginit的話,
他就 會以伺服器的方式啟動。而不管能不能啟動起來。
2,進入InitGUI函數,這很重要,它是整個初始化的封裝器。
它的運行按照步驟來的,其中有個變數STEP記錄這個步驟。
(1):InitMisc 如其名,初始化一些不好分類的功能。
1):首先確定是不是用的內部資源,不是的話,調用LookForEtcFile,
就找MINIGUI設定檔,一般是/usr/local/etc/MiniGui.cfg
2):初始化剪下板功能InitClipBoard
3):調用LoadEtcFile把設定檔中的資訊匯入hMgEtc(設定物件控制代碼)
(2): 對於LITE模式,mginit 啟動時檢查是否還有一個mginit,如果有的話就退出,
這裡邊會在/var/tmp下面建立MINIGUI MGINIT 檔案,比如剛剛調試MINIGUI時,
就很有可能MGINIT非正常退出,這兩個檔案就不會被刪除,下次
MGINIT 就無法正常啟動。注意檢查/var/tmp。
(3):InitGAL
初始化圖形抽象層,這個工作量比較大,移植MINIGUI主要的工作就在這裡了,
還有下面的輸入抽象層,我現在用的ARM44B0X的板子上面的LCD是240x128單色
的與正常顯示器差距比較大,由於對MINIGUI認識不夠,現在還不能正確估計工作量。
即使移植成功,也會使得很多功能受到限制。
1):獲得gal_engine的值
2):GAL_VideoInit (engine, 0)//根據設定檔初始化相應的視頻輸出VIDEO結構。
這個函數相當重要,使得MINIGUI與相應的視頻硬體聯絡起來,做了視頻初始化的大部分事情。重點就是初始化全域變數current_video(GAL_VideoDevice結構)。
1):判斷是否初始化過了,也就是檢查current_video是不是null 指標,不是的話,初始化工作。否則調用GAL_VideoQuit()銷毀佔用的資源(c++編程思想)。
2):根據傳遞過來的engine名稱,在bootstrap表中尋找響應的項(又是FOR迴圈,找到之後首先是判斷 bootstrap[i]->available();如果可用,就調用其建構函式create();(這也是物件導向編程思想,MINIGUI可能是受LINUX影響很大,很多程式風格,
和代碼上都和LINUX有相似之處。我也同樣認為LINUX源碼中物件導向設計實現的很巧妙。 對我以後的程式寫作都會有很大的影響。)按照MINIGUI的分層設計思想,移植相對來說變的容易,你可以參照其他GAL檔案,對照著關鍵的資料結構,實現其中的指標函數,讓其上層調用就可以了,應為都是低層的功能函數,是程式運行基石,對其時效性,正確性都有想當高的要求,這是其困難所在。我們新手一般考慮不到這些問題,考慮如何填充其
相應位置的函數。
3):獲得defaultmode的值
4):解析高度,寬度,深度,並設定current_video(GAL_VideoDevice結構)的相應位置。
5):檢查設定檔中的參數,與實際的硬體支援比較,給使用者提出意見:可能會迷惑用戶端程式。
6):初始化RGBMAP,這個地方的原理不懂,有時間還要查相關資料,學習理解。
(4):InstallSEGVHandler ();//功能不清楚
(5):InitGDI
根據MINIGUI編譯配置,初始化編譯進來的字型。
(6):InitScreenDC ();//初始化螢幕輸出裝置
(7):InitWindowElementColors();
(8):初始化共用資源,根據自己的名稱,如果是mginit 就從檔案中匯入,如果是用戶端程式就通訊串連
mginit,串連共用資源。
(9):InitResource ();//初始化私人資源
(10):InitLWEvent();進關鍵的輸入抽象初始化了。MINIGUI和WINDOWS系統一樣,把任何輸入都抽象
成事件,最重要的就是鍵盤和滑鼠。他的設計思想,APT介面都和WINDOWS保持一致,如果學過WINDOWS
APT編程,MINIGUI程式也容易寫出來。
1):GetDblclickTime();獲得雙擊時間。
2):GetTimeout();
3):InitIAL();//這個函數很重要,他負責把輸入裝置和MINIGUI聯絡起來。讓我們進去好好
分析。其作用是解析ial_engine,mdev,mtype。並根據這些資料在inputs[]數組中尋找相應的
輸入裝置
1):找到相應的輸入裝置表,如果找不到的話,就用第一個DUMMY
2):IAL_InitInput (cur_input, mdev, mtype);是個宏,
#define IAL_InitInput (*cur_input->init_input);
調用相應輸入裝置的建構函式。這個是實質的初始化程式
4):ResetMouseEvent();
5):ResetKeyEvent();
(11):判斷是是什麼程式,如果是mginit的話,就啟動ServerStartup ();否則
ClientStartup ();
到此,MINIGUI庫初始化完成。