MiniGUI源码走读

注:这里是针对以下配置的MiniGUI v1.3.3进行解读:
使用thread模式
资源内置(Resource Incore)
使用旧版本GAL
使用native gal引擎
支持RBF字体
不支持鼠标
Author: Hily Jiang
Email&Gtalk: hilyjiang at Gmail
Blog:
http://hily.iyi.cn/
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

本文来自ChinaUnix博客,如果查看原文请点: http://blog.chinaunix.net/u/28285/showart_309634.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值