1. 线程
1.1 SystemThreads()
SystemThreads()创建三个线程,它们的过程分别是DesktopMain()、TimerEntry()和EventLoop()。
1.2 DesktopMain()
DesktopMain()创建HWND_DESKTOP窗口,并处理它的消息。
-
调用mg_InitMsgQueueThisThread()创建属于该线程的消息队列MSGQUEUE。
-
调用init_desktop_win()。其中,
- 创建MAINWIN实例。这个实例是一个本地静态变量sg_desktop_win。
static MAINWIN sg_desktop_win;
- 指定其消息队列刚创建的消息队列。
- 指定DesktopWinProc()为窗口过程。
- 指定__mg_def_renderer为渲染器。
WINDOW_ELEMENT_RENDERER * __mg_def_renderer = &__mg_wnd_rdr_classic;
- 将窗口保存在全局变量__mg_dsk_win和__mg_hwd_desktop中。
PMAINWIN __mg_dsk_win; HWND __mg_hwnd_desktop;
- 直接调用窗口过程DesktopWinProc(),处理MSG_STARTSESSION消息。其中初始化窗口进一步的处理函数集。
- 向窗口投递MSG_ERASEDESKTOP消息。DesktopWinProc()处理消息时,绘制背景。
- 最后在循环中,调用GetMessage()得到消息,调用DesktopWinProc()处理它们。
处理MSG_STARTSESSION消息的步骤如下。
- 调用GetSysCharset()得到字符集。
- 调用DESKTOPOS::init()设置进一步的处理函数。包括创建DEF_CONTEXT实例,加载背景图、位置等。
- 创建菜单。
处理MSG_ERASEDESKTOP消息的步骤如下。
- 调用DESKTOPOPS::paint_desktop()绘制背景。其中调用SetBrushColor()设置背景色,调用FillBox()用背景色填充。
1.3 EventLoop()
EventLoop()从输入设备中读取事件并解析,相应向HWND_DESKTOP窗口的队列中投递消息。
- 调用IAL_WaitEvent()读取事件,也就是XVFBEVENT结构。
- 根据XVFBEVENT()的内容,构造消息。并调用QueueDeskMessage()投递消息。
1.4 TimerEntry()
TimerEntry()与窗口的定时器消息有关。在循环中执行以下步骤。
- 调用select()等待一段时间。
- 调用__mg_timer_action(),向HWND_DESKTOP窗口中投递消息,并调用sem_post()通知其消息队列的读者“有消息到达”。
网友评论