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实例,并返回给调用者。
网友评论