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是不是空指针,不是的话,初始化工作。否则调用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库初始化完成。