X Window研究笔记(4)
转载时请注明出处和作者联系方式
作者联系方式:李先静 <xianjimli at hotmail dot com>
4.X Window的分层视图
X Window是一个严重依赖硬件环境的系统,输入依赖于输入设备,像键盘、鼠标和触摸屏等,输出设备依赖于显卡和显卡提供的接口。为了隔离与硬件的耦合,保持良好的可移植性,分层设计是必然的选择。X Window的分层视图如下所示:
DIX(与底层无关的核心代码): DIX是与平台无关的核心代码,DIX之意可能是指“不依赖任何硬件设备”的代码。它主要包括:
1.对下列资源的管理(有些资源的实现是硬件相关的,但对它们的管理是硬件无关的)。
●Window 提供窗口的创建/销毁,属性修改,和基于树形的管理和遍历操作等。
●Pixmap 是继承DrawableRec的,实现一些像画线这样的基本绘图操作。
●Screen 是对显示设备的抽象,一个Card可以有多个Screen,DIX提供像AddScreen和FreeScreen等函数管理Screen。
●Device 主要是指对输入设备,像键盘、鼠标和触摸屏的管理。
●Colormap 调色板的创建/销毁,修改和查询等操作。
●Font为客户端应用程序提供字体管理,比如打开/查询/显示/关闭字体等操作。
●Cursor 光标的创建/销毁。
●Graphics Contexts绘图上下文,包括像字体,颜色,线条类型等信息,提供GC的创建/销毁和修改属性等操作。
●Pixmap 是继承DrawableRec的,实现一些像画线这样的基本绘图操作。
●Screen 是对显示设备的抽象,一个Card可以有多个Screen,DIX提供像AddScreen和FreeScreen等函数管理Screen。
●Device 主要是指对输入设备,像键盘、鼠标和触摸屏的管理。
●Colormap 调色板的创建/销毁,修改和查询等操作。
●Font为客户端应用程序提供字体管理,比如打开/查询/显示/关闭字体等操作。
●Cursor 光标的创建/销毁。
●Graphics Contexts绘图上下文,包括像字体,颜色,线条类型等信息,提供GC的创建/销毁和修改属性等操作。
2.处理客户端的请求。
3.输入事件的分发。
3.输入事件的分发。
这一部分的代码主要集中programs/Xserver/dix目录下。
EXT(扩展功能) :可以认为X Window的大部分功能特性都是在扩展中模块实现,这样可以根据需要进行裁剪。X Window提供大约40来个扩展模块。
- Panorami:在公共场合和电视台常常需要超大屏幕的显示器,像一堵墙一样,要生产这样显示设备成本高,制造难度大,一般取而代之的方案是,用多个显示器拼装起来,比如,用16个显示器可以拼装出4x4的显示矩阵。本扩展模块的功能就是让一台机器上支持多个显示器,并把显示数据送到相应的显示器上。
- Bezier:我们都知道像TrueType之类的矢量字体都是靠Bezier曲线来圆滑其线条的。本扩展模块可能就是做这件事的,不过好像X Window中并没有使用它。
- Shape:大多数时候,我们看到的窗口都是一个方块,对一般用户来说并不是什么障碍,而在有时候,像一个娱乐性的软件,需要把窗口做成奇形怪状的,以增加对用户的吸引力。Shape扩展提供了一些功能用来创建非矩形的窗口。
- Shm:X Window和客户端程序之间一般只是传递一些参数,数据量不大,对性能不会造成太大的影响。但有时可能要传递一些大块数据,比如说像图片,对性能就有较大明显的影响了,Shm扩展提供了共享内存的支持,以避免大块数据的传输。
- EVI:X Window的Core服务提供了获取Visual的基本信息,有时候这些基本信息对客户端程序来说,是不够充分的。于是就出现了EVI(extended visual info)。
- Pex: 不知是什么东西,没有找到相关的文档和源码。可能是一个过时的扩展吧。
- Multibuffer:提供多缓冲区。
- XInput:扩展输入设备。提供对键盘鼠标等之外的输入设备的支持。
- XTest:测试扩展模块。除了测试之外,还可以用来支持软件键盘等虚拟输入设备。
- BigReq: X Window本身对请求包的数据大小是有限制,通过这个扩展模块可以支持大的数据包。
- MITMisc:一些杂项功能的扩展。就提供了两个功能X_MITSetBugMode/ X_MITGetBugMode。
- ScreenSaver: 支持屏幕保护功能。
- Xv:提供对视频播放如DVD、MPEG的支持和优化。
- XvMC提供对视频播放如DVD、MPEG的支持和优化。
- Sync:提供对多个客户端进行同步的机制。
- Xkb:键盘扩展。不清楚到底扩展什么。
- XCMisc: 杂项功能。
- Record:它可以把X Window的事件和请求都记录下来,主要用于测试目的。
- Lbx:Fast Server.
- Dbe: 双缓冲支持。
- Xag:应用程序分组管理。X Window只知道窗口之间的父子兄弟关系,并不知道这些窗口属于哪个应用程序。本扩展模块可以把窗口按AP分组。
- Security:提供安全扩展,即认证机制。
- Xp:打印功能。
- Xcup:对颜色映射的支持。
- DPMS:显示电源管理。
- FontCache:字体缓存。
- XFree86Bigfont: 大字体支持。
- XFree86VidMode: 显示模式管理。
- XFree86Misc:杂项功能。
- XFree86DGA:显示加速功能。
- XFree86DRI:直接渲染。
- Glx:OpenGL支持。
- DarwinGlx:Darwin的OpenGL支持。
- DPS: Display Postscript,没有找到相关的文档和源码。
- Render: 渲染扩展,增强X Window的画图功能。
- RandR:对窗口的旋转和调整大小支持。
- Res:资源管理支持。
- DMX: Panorami要求所有显示器连接在一台电脑上,这常常有些难度,DMX允许这显示器在不同的机器上。
扩展模块的初始化是在miinitext.c里完成的,在函数InitExtensions中,它会把所需要的模块一一初始化。
OS(与特定OS相关的代码): 这一部分主要包括如下功能:
- Scheduling and Request Delivery
- New Client Connections
- Reading Data from Clients
- Sending Events, Errors And Replies To Clients
- Font Support
- Memory Management
- Client Scheduling
- Other OS Functions
- Idiom Support
DDX(与设备相关的代码):所有与设备相关的功能,都是集成在X Server中的,客户端程序只知道”事件”, 而不知道设备的存在。关于输入和输出设备,在后续的章节中,我们会做专门的介绍。
(待续)