X Window研究笔记(4)



4.X Window的分层视图


X Window是一个严重依赖硬件环境的系统,输入依赖于输入设备,像键盘、鼠标和触摸屏等,输出设备依赖于显卡和显卡提供的接口。为了隔离与硬件的耦合,保持良好的可移植性,分层设计是必然的选择。X Window的分层视图如下所示:


 X Window研究笔记(4)_客户端程序



DIX(与底层无关的核心代码): DIX是与平台无关的核心代码,DIX之意可能是指“不依赖任何硬件设备”的代码。它主要包括:



1.对下列资源的管理(有些资源的实现是硬件相关的,但对它们的管理是硬件无关的)。


●Window 提供窗口的创建/销毁,属性修改,和基于树形的管理和遍历操作等。

●Pixmap 是继承DrawableRec的,实现一些像画线这样的基本绘图操作。

●Screen 是对显示设备的抽象,一个Card可以有多个Screen,DIX提供像AddScreen和FreeScreen等函数管理Screen。

●Device 主要是指对输入设备,像键盘、鼠标和触摸屏的管理。

●Colormap 调色板的创建/销毁,修改和查询等操作。

●Font为客户端应用程序提供字体管理,比如打开/查询/显示/关闭字体等操作。

●Cursor 光标的创建/销毁。

●Graphics Contexts绘图上下文,包括像字体,颜色,线条类型等信息,提供GC的创建/销毁和修改属性等操作。


2.处理客户端的请求。


3.输入事件的分发。


这一部分的代码主要集中programs/Xserver/dix目录下。


EXT(扩展功能) :可以认为X Window的大部分功能特性都是在扩展中模块实现,这样可以根据需要进行裁剪。X Window提供大约40来个扩展模块。


  1. Panorami:在公共场合和电视台常常需要超大屏幕的显示器,像一堵墙一样,要生产这样显示设备成本高,制造难度大,一般取而代之的方案是,用多个显示器拼装起来,比如,用16个显示器可以拼装出4x4的显示矩阵。本扩展模块的功能就是让一台机器上支持多个显示器,并把显示数据送到相应的显示器上。
  2. Bezier:我们都知道像TrueType之类的矢量字体都是靠Bezier曲线来圆滑其线条的。本扩展模块可能就是做这件事的,不过好像X Window中并没有使用它。
  3. Shape:大多数时候,我们看到的窗口都是一个方块,对一般用户来说并不是什么障碍,而在有时候,像一个娱乐性的软件,需要把窗口做成奇形怪状的,以增加对用户的吸引力。Shape扩展提供了一些功能用来创建非矩形的窗口。
  4. Shm:X Window和客户端程序之间一般只是传递一些参数,数据量不大,对性能不会造成太大的影响。但有时可能要传递一些大块数据,比如说像图片,对性能就有较大明显的影响了,Shm扩展提供了共享内存的支持,以避免大块数据的传输。
  5. EVI:X Window的Core服务提供了获取Visual的基本信息,有时候这些基本信息对客户端程序来说,是不够充分的。于是就出现了EVI(extended visual info)。
  6. Pex: 不知是什么东西,没有找到相关的文档和源码。可能是一个过时的扩展吧。
  7. Multibuffer:提供多缓冲区。
  8. XInput:扩展输入设备。提供对键盘鼠标等之外的输入设备的支持。
  9. XTest:测试扩展模块。除了测试之外,还可以用来支持软件键盘等虚拟输入设备。
  10. BigReq: X Window本身对请求包的数据大小是有限制,通过这个扩展模块可以支持大的数据包。
  11. MITMisc:一些杂项功能的扩展。就提供了两个功能X_MITSetBugMode/ X_MITGetBugMode。
  12. ScreenSaver: 支持屏幕保护功能。
  13. Xv:提供对视频播放如DVD、MPEG的支持和优化。
  14. XvMC提供对视频播放如DVD、MPEG的支持和优化。
  15. Sync:提供对多个客户端进行同步的机制。
  16. Xkb:键盘扩展。不清楚到底扩展什么。
  17. XCMisc: 杂项功能。
  18. Record:它可以把X Window的事件和请求都记录下来,主要用于测试目的。
  19. Lbx:Fast Server.
  20. Dbe: 双缓冲支持。
  21. Xag:应用程序分组管理。X Window只知道窗口之间的父子兄弟关系,并不知道这些窗口属于哪个应用程序。本扩展模块可以把窗口按AP分组。
  22. Security:提供安全扩展,即认证机制。
  23. Xp:打印功能。
  24. Xcup:对颜色映射的支持。
  25. DPMS:显示电源管理。
  26. FontCache:字体缓存。
  27. XFree86Bigfont: 大字体支持。
  28. XFree86VidMode: 显示模式管理。
  29. XFree86Misc:杂项功能。
  30. XFree86DGA:显示加速功能。
  31. XFree86DRI:直接渲染。
  32. Glx:OpenGL支持。
  33. DarwinGlx:Darwin的OpenGL支持。
  34. DPS: Display Postscript,没有找到相关的文档和源码。
  35. Render: 渲染扩展,增强X Window的画图功能。
  36. RandR:对窗口的旋转和调整大小支持。
  37. Res:资源管理支持。
  38. DMX: Panorami要求所有显示器连接在一台电脑上,这常常有些难度,DMX允许这显示器在不同的机器上。


扩展模块的初始化是在miinitext.c里完成的,在函数InitExtensions中,它会把所需要的模块一一初始化。


OS(与特定OS相关的代码): 这一部分主要包括如下功能:

  1. Scheduling and Request Delivery
  2. New Client Connections
  3. Reading Data from Clients
  4. Sending Events, Errors And Replies To Clients
  5. Font Support
  6. Memory Management
  7. Client Scheduling
  8. Other OS Functions
  9. Idiom Support


DDX(与设备相关的代码):所有与设备相关的功能,都是集成在X Server中的,客户端程序只知道”事件”, 而不知道设备的存在。关于输入和输出设备,在后续的章节中,我们会做专门的介绍。


(待续)