MiniGUI源碼走讀

作者:Hily 原始鏈接:http://hily.me/blog/2007/05/minigui-code-reading/
版權聲明:可以轉載,轉載時務必以超鏈接形式標明文章原始出處作者信息版權聲明

注:這裏是針對以下配置的MiniGUI v1.3.3進行解讀:
使用thread模式
資源內置(Resource Incore)
使用舊版本GAL
使用native gal引擎
支持RBF字體
不支持鼠標

Author: Hily Jiang
Email&Gtalk: hilyjiang at Gmail
Blog: http://hily.me/blog/

0. 主函數main()
主函數main()在src/main/main.c中定義,主要運行過程如下:
InitGUI():用於初始化GUI;
MiniGUIMain():進入用戶應用程序主體;
TerminateGUI():用戶應用程序退出後執行它釋放資源,最後退出minigui。

1 初始化GUI:InitGUI()
位於src/kernel/init.c中,主要過程:
InitMisc():初始化配置;
InitGAL():初始化圖形抽象層;
InstallSEGVHandler():指定信號處理函數;
InitGDI():初始化圖形設備接口;
InitWindowElementColors():初始化窗體顏色;
InitLWEvent():初始化底層事件;
InitFixStr():初始化固定字符串;
InitMenu():初始化菜單;
InitControlClass():初始化控制類;
InitAccel():初始化加速器;
SystemThreads():開闢系統線程;
SetKeyboardLayout():設置鍵盤佈局;
SetCursor():設置鼠標;
SetCursorPos():設置鼠標位置;
TerminateMgEtc():INCORE_RES時該函數爲空。

1.1 初始化配置:InitMisc()
位於src/misc/misc.c中,函數主體就是調用這個文件頭文件misc.h中的InitMgEtc()。
InitMgEtc()的作用就是獲取src/sysres/mgetc.c中定義的MiniGUI運行時的配置,並分配一個句柄hMgEtc指向配置對象。
配置信息保存在一個ETC_S類型的結構MGETC中,它在src/sysres/mgetc.c中定義。

1.2 初始化圖形抽象層:InitGAL()
位於src/gal/gal.c中,運行過程如下:
檢查可用的圖形引擎數NR_GFXES,即該文件中gfxes[]數組的元素個數,若無可用引擎信息,則返回錯誤;
GetMgEtcValue()從配置中讀取配置的GAL引擎名稱;
接着查找gfxes[]數組中是否有匹配的引擎,找到後用cur_gfx指向該引擎信息,如果沒有找到,則返回錯誤;
接着用GAL_InitGfx()檢測當前引擎的初始化函數是否返回成功。

1.2.1 初始化GAL引擎:GAL_InitGfx()
GAL_InitGfx是一個宏定義,位於include/oldgal.h中,它調用src/gal/native/native.c中對當前引擎的圖像函數進行初始化。

1.3 指定信號處理函數:InstallSEGVHandler()
位於src/kernel/init.c中,它的作用就是指定一些信號和信號處理函數。
指定的信號有:SIGSEGV(段錯誤)、SIGTERM(終止信號)和SIGINT(中斷信號)。
指定的信號處理函數爲:segvsig_handler,也在這個文件中定義。
在程序接收到指定的三個信號時,segvsig_handler會釋放資源並退出程序執行。

1.4 初始化圖形設備接口:InitGDI()
位於src/gdi/gdi.c中,運行過程如下:
InitTextBitmapBuffer():這個函數始終返回true,似乎沒什麼用了;
InitIncoreRBFonts():初始化內嵌的RBF字體;
InitSysFont():初始化系統字體;
InitFreeClipRectList():初始化空閒方形區域塊列表;
初始化互斥鎖__mg_gdilock(GDI鎖)和dcslot(DCSlot鎖);
dc_InitClipRgnInfo():初始化Device Context(設備環境)的範圍;
dc_Init_ScreenDC():初始化屏幕的DC。

1.4.1 初始化RBF字體:InitIncoreRBFonts()
位於src/font/rawbitmap.c中,運行過程如下:
可用字體數爲NR_RBFONTS,即該文件中incore_rbfonts[]數組的元素個數;
檢查當前所有可用的字體的信息是否正確,包括:
字符集:fontGetCharsetFromName();
是否支持該字符集:GetCharsetOps();
字體寬度:fontGetWidthFromName();
字體高度:fontGetHeightFromName()。
接着初始化設備字體信息,包括字體信息,操作函數等;
最後把設備字體增加到字體列表中。

1.4.2 初始化系統字體:InitSysFont()
位於src/font/sysfont.c中,運行過程如下:
利用GetMgEtcIntValue()從配置中讀取系統字體的數量,若字體數小於1則返回,若字體數大於6,則只使用前6種字體;
接着檢測這些字體信息是否正確,並創建邏輯字體;
最後將合法的字體根據配置一一填入對應的邏輯字體數組中。

1.4.3 初始化空閒方形區域塊列表:InitFreeClipRectList()
該宏定義位於include/gdi.h,它調用include/gdi.h中的InitBlockDataHeap()初始化空閒方形區域塊的信息(包括大小和個數)。

1.4.4 初始化設備環境的範圍:dc_InitClipRgnInfo()
位於src/gdi/gdi.c中,
InitClipRgn()

1.4.5 初始化屏幕的DC:dc_Init_ScreenDC()
位於src/gdi/gdi.c中,運行過程如下:
初始化DC設置:
調用SetClipRgn()設置該DC的區域範圍。

1.4.5.1 設置DC的區域範圍:SetClipRgn()
位於src/gdi/cliprect.c,運行過程如下:
IsRectEmpty():位於src/gdi/rect.c中,檢測區域是否爲空;
NormalizeRect():位於src/gdi/rect.c中,糾正錯誤的區域信息,即使區域left ClipRectAlloc():該宏定義位於include/gdi.h,它調用src/kernel/blockheap.c中的 BlockDataAlloc()從分配該區域的堆空間。

1.5 初始化窗體顏色:InitWindowElementColors()
位於src/sysres/syscfg.c中,通過調用src/gdi/draw.c中的RGB2Pixel()對顏色進行轉換。

1.6 初始化底層事件:InitLWEvent()
位於src/kernel/event.c中,運行過程如下:
GetDblclickTime():獲取雙擊間隔時間;
GetTimeout():獲取超時時間;
InitIAL():初始化輸入引擎;
ResetMouseEvent():重置鼠標事件;
ResetKeyEvent():重置鍵盤事件。

1.6.1 獲取雙擊間隔時間:GetDblclickTime()
位於src/kernel/event.c中,因爲不支持鼠標,配置文件中沒有mouse相關選項,該函數直接返回。

1.6.2 獲取超時時間:GetTimeout()
位於src/kernel/event.c中,因爲不支持鼠標,配置文件中沒有mouse相關選項,該函數直接返回。

1.6.3 初始化輸入引擎:InitIAL()
位於src/ial/ial.c中,運行過程如下:
獲取配置中ial_engine、mdev和mtype的配置信息;
查找配置的IAL引擎是否在該文件的inputs[]數組中,存在的話就把該引擎做爲當前的IAL引擎;
IAL_InitInput():調用inputs數組中的IAL引擎初始化函數初始化IAL引擎。

1.7 初始化固定字符串:InitFixStr()
位於src/kernel/fixstr.c中,初始化一個結構體FixStrHeap,暫時不能理解它的用處。

1.8 初始化菜單:InitMenu()
位於src/gui/menu.c中。

1.9 初始化控制類:InitControlClass()
位於src/gui/ctrlclass.c中,註冊配置中支持的控件類。

1.10 初始化加速器:InitAccel()
位於src/gui/accelkey.c中。

1.11 開闢系統線程:SystemThreads()
位於src/kernel/init.c中,運行過程如下:
InitDesktop():初始化桌面;
InitFreeQMSGList():初始化空閒消息隊列;
InitMsgQueue():初始化消息隊列;
DesktopMain:創建桌面線程;
TimerEntry:創建定時器線程;
EventLoop:創建事件循環線程。

1.11.1 初始化桌面:InitDesktop()
位於src/kernel/desktop.c中,運行過程如下:
InitZOrderInfo():初始化桌面疊放次序;
InitFreeClipRectList():初始化空閒方形區域塊列表;
InitSystemRes():初始化系統資源;
InitWndManagementInfo():初始化窗體管理信息。

1.12 設置鍵盤佈局:SetKeyboardLayout()
位於src/gui/keyboard.c中,在數組layouts[]中查找與指定鍵盤佈局名稱相同的鍵盤設置,找到後調用相應的鍵盤初始化函數對按鍵圖和按鍵函數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章