Skip to content
Stone Kang edited this page Dec 9, 2013 · 1 revision

#代码结构概要#

##模块列表##

  • window_manager: 窗口管理器,是服务器端主要的控制部分。服务器端可执行程序在此。
  • server_lib: 服务器库,支持窗口管理器的运行,负责处理客户端发送给服务器的消息(将它们对应到某个底层的函数调用),以及向客户端发送用户事件的消息(比如某些鼠标点击、控件移动等事件)等。
  • comm: 消息传递系统。这部分是服务器和客户端公有的,用于在两者之间传递消息。它同时还记录了所有的消息类型(参见message.h, request.h, respond.h)。server_lib和client_lib都使用这里面的功能和数据类型。同时comm模块也包含底层的消息接收函数,在检测到消息到来(检测方法)之后,通过函数指针调用使用者指定的处理函数(调用位置)。
  • event: 输入事件模块。这个模块处理键盘和鼠标的输入,用了一些相当原始的底层方法,对键盘输入的处理甚至跳过了stdin,而是直接打开键盘设备文件,读取内核提供的消息。用这种方法,即便是判断大小写都需要手工判断shift键是否处于按下状态。这里面的函数会被window_manager作为函数指针插入到comm模块的检测列表中,由comm统一控制。
  • graph: 图形模块。这是绘图部分的核心,分成两部分:
    • graph_lower: 底层绘制函数。比如绘制一个像素绘制一条横向直线清空屏幕等。功能相同的函数都放在独立的文件里,所以一般一个文件就一个函数,除了那些可以分成很多步的之外,比如绘制一个像素
    • graph_engine: 这是对上面底层函数的包装,基本上跟上面的函数一一对应。因为图形模块内部表示屏幕的结构有两种,分别是graphics_devicescreen,上面的底层函数使用的是后者,而engine部分的函数则将使用前者。分成这两层是有实际意义的,但是解释起来比较困难。如果某个时候需要自己写一个新的绘制函数的话,就会发现这样做的好处。
  • util: 这个模块比较杂,包含若干不相关的子模块,但它们都是在整个系统里常用的功能或数据。
    • base_type: 这里面定义了一些常用的数据类型,例如与平台无关的整数类型,布尔类型和指针类型等。(但是这些其实系统都提供了,不需要自己写的。我想过要把这个去掉,但是项目里几乎到处都用到了这些,只能保留。)
    • color: 颜色支持。最开始就只有一个表示颜色的结构体,后来增加了对透明的支持,所以有了一个透明混合的函数
    • config_parser: 配置文件解析。很多控件支持从用户配置文件读取默认的样式信息,它们的格式是统一的,用这个config_parser可以很容易地获取。
    • data_structures: 常用数据结构,如链表、队列、栈、树等,还有鼠标指针。
    • geometry: 跟几何相关的算法,比如判断点是否在区域内等等。
    • log: 将信息记录到屏幕上的常用宏。一般用在出错的时候,这些宏可以自动显示出系统的错误信息。
  • application: 客户端的用户程序库。这里面的功能是用户程序经常用到的,比如初始化退出添加窗口等等。
  • client_lib: 跟server_lib对应,是客户端用于通信的库。这里的函数几乎跟服务器支持的功能一一对应,比如绘制图形、注册窗口等。当调用这里的某个函数时,它会向服务器发送一条消息,请求对应的行为。
  • widget: 控件库,包含用户程序可以使用的所有控件。这可以理解为系统中相当高层的部分了。目前还比较少,正在不断增加。但由于控件越来越复杂,开发进度也会逐渐变慢。开发过程中很可能发现底层存在的问题,这时就需要对其他部分进行修改。另外,开发某个控件可能需要目前没有的底层支持,这是也会需要先完善其他部分。

##模块关系## Module structure

Clone this wiki locally