美文网首页
minigui 4.0 源代码分析(三)

minigui 4.0 源代码分析(三)

作者: RonZheng2010 | 来源:发表于2020-11-23 09:44 被阅读0次

    1. MSGQUEUE与MSG

    MSGQUEUE是消息队列,MSG是队列中的消息。后面还有一节说明进一步的细节。

    关于MSGQUEUE,

    • 成员msg[]是用作环形缓存的数组,成员writepos是推送消息的位置,readpos是获取消息的位置。
    • 成员wait是“有消息待处理”的信号量,
    • 成员sync_msg是“有同步消息待处理”的信号量。

    1.1 创建消息队列

    mg_InitMsgQueue()创建消息队列。用户可以指定队列大小,缺省值为32。

    1.2 向队列推送消息

    Kernel_QueueMessage()用于向队列中推送消息。

    2. 用户输入输出

    2.1 INPUT

    INPUT定义用户输入子系统。

    • 成员id是名称。
    • 成员函数init_input()初始化子系统
    • 成员函数get_mouse_xy()/set_mouse_xy()读取/设置鼠标位置,
    • 成员函数get_keyboard_state()得到键盘状态。
    • 成员函数wait_event()/wait_event_ex()获取输入消息。

    全局数组inputs[]定义一系列的输入子系统,其中每个子系统与特定设备相关。这里指定系统名称、系统初始化函数。

    INPUT inputs [] = {
      {"dummy", InitDummyInput, TermDummyInput},
      {"pc_xvfb", InitPCXVFBInput, TermPCXVFBInput},
      {"nexus", InitNexusInput, TermNexusInput},
      ...
    };
    

    这里说明的例子还是gvfb提供的虚拟设备“pc_xvfb”。

    2.2 设备pc_xvfb

    如前所说,minigui进程通过unix socket与gvfb进程连接。

    gvfb进程捕捉输入消息,通过unix socket通道发给minigui进程。Minigui进程根据消息类型,相应地构造自己的消息XVFBEVENT,发送给minigui进程的顶层窗口HWND_DESKTOP。

    2.3 XVFBEVENT

    XVFBEVENT定义输入事件。

    • 成员event_type是事件类型
    • 成员key是键盘消息的数据,这是个XVFBKEYDATA结构
    • 成员mouse是鼠标消息的数据,这是个XVFBMOUSEDATA结构

    2.4 mg_InitIAL()

    mg_InitIAL()初始化输入输出子系统。

    • 根据指定的名字,在数组inputs[]中查找INPUT实例。这里是”pcxvfb”。
    • 调用INPUT::Init_Input(),初始化INPUT结构。其中设置INPUT的其他成员函数。。这里调用InputPCXVFBInput(),将pcxvfb提供的wait_event()设置为成员函数wait_event()。

    2.5 IAL_WaitEvent()

    IAL_WaitEvent()等待用户输入,得到相应的输入事件。这里它调用pxxvfb提供的wait_event()。其中,

    • 调用mg_select(),在__mg_pcxvfb_client_sockfd上等待,这是在PCXVFB_VideoInit()中创建的socket。
    • 等待返回后,调用read_socket()在socket上读取event类型。然后根据event类型,读取event数据。
    • 构造输入事件,也就是XVFBEVENT实例,并返回给调用者。

    相关文章

      网友评论

          本文标题:minigui 4.0 源代码分析(三)

          本文链接:https://www.haomeiwen.com/subject/gvwuiktx.html