minigui 初始化分析

來源:互聯網
上載者:User

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庫初始化完成。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.