minigui 初始化分析

来源:互联网 发布:打印机的mac地址 编辑:程序博客网 时间:2024/05/03 01:45
 

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库初始化完成。
0 0
原创粉丝点击