The X New Developer’s Guide——第一章 基本概念

  1. 第一章Xwindow概念

      本章的目的在于介绍你需要的理解的基本Xwindow概念和技术。如果你已经掌握了这些概念,那么你已经准备好深入挖掘后续的章节了。



第一节 X服务器/客户端

         Xwindow系统被设计为允许多个程序共享访问一组通用硬件。硬件包括键盘鼠标之类的输入设备,以及视频适配器和与之相连的显示器等输出设备。有一个进程被设计为硬件的控制者并允许多路程序访问,这个进程我们称之为X服务器,它提供硬件到应用程序的服务。事实上,X服务器是通过键盘鼠标和显示器等为用户提供服务的。

就像很多CS架构的系统一样,X服务器可以并发地为客户端提供服务。X服务器比大多数客户端运行时间都长,并且不停地监听着新客户端的连接。

         大多数用户可能仅仅在单个笔记本电脑或个人桌面系统上使用过X。在这种情况下,X客户端和X服务器运行在同一台电脑上。无论怎样,X为客户端和服务器的通信定义了一组协议流。这个协议可以通过网络通信,如此客户端和服务器就可以运行在不同的机器上进行连接。不幸的是,在这种模型下客户端和服务器的标签可能会混淆。你可能会在你面前的笔记本上运行着X服务器,并显示着由一个远程的强大机器产生的图形界面。在大部分的其他模型中,笔记本应该是一个文件共享之类的客户端,HTTP等类似的服务则运行在远程的强大机器上。在这种情况下,重要的是要提醒自己,键盘和鼠标连接到X服务器(意思是鼠标键盘在哪,哪就是服务器),也就是所有客户端(终端窗口、web浏览器、文档编辑器)的一个连接端点。


第二节 X实例

       本节描述了X的基本部分以及它们如何工作。这也是所有的东西(名词/概念等)都要被立刻提出的地方,所以本节可能会有些凌乱。

1.输入

        如前边提到的,X服务主要处理两类硬件:输入设备和输出设备。令人惊奇的是,处理输入往往是这两者中困难和复杂的。输入设备多元,并发,以及高度依赖复杂的用户配置。

a.键盘输入

        X服务器其中一个任务就是处理键盘打字,并发送相应的按键事件到对应的客户端程序。在一个简单的X配置中,一个客户端在某个时刻占有输入焦点,那么大部分的按键事件将会发给该客户端。依赖于窗口管理器的配置,焦点可能会因为移动鼠标/点击鼠标/使用热键/或者通过控制面板显示可用的客户端等而转移到其他窗口上去。占有焦点的客户端通常会通过某种方式高亮显示,因此用户就知道他们的输入将会跑到哪里。客户端可以使用钩链(后续描述)来覆盖原本送往焦点客户端的键盘事件。

        当今世上有多种多样的键盘。这是由于不同的语言要求,不同的国家标准,以及硬件厂商试图差异化他们的产品等原因造成的。这种多样化导致从硬件键值keycode)到文本输入的按键映射,成为一个极具挑战和复杂的过程。在按键事件中X服务器仅仅报告一个简单的8位键值(keycode)。服务器还提供了一个从键值(keycode)到键符(keysym)的键盘映射,键符代表了按键的符号(例如A”,”Enter”,”Shift”等)。单纯的键值在一个给定的会话之外是没有固定意义的。在不同的键盘上/不同的服务器上/不同的配置上/或不同的操作系统上,同一个按键也可能产生不同的键值。键符是一个固定分配的常量,这也是应用程序应该关心的。X键盘(XKB)扩展提供了复杂的配置和布局处理,这也是原始协议里缺失的额外按键处理功能。Xlib及其工具也为高层的输入功能提供了输入方法,例如组合键处理或者复杂的按键序列映射(举个例子,亚洲语言输入)。

b.鼠标输入

        X协议定义了输入指针(跟编程概念没关系)。指针在屏幕上会以一个光标呈现;它通常会被一个鼠标或类似的输入设备控制。应用程序可以控制光标的图像。X核心协议包涵了简单的双色光标图像支持(简单说就是黑白光标)。渲染Render)扩展提供了32位真彩色的光标支持。该支持通常可通过libXcursor库访问。

        指针设备向客户端报告移动事件以及按钮按压释放事件。X服务器的默认配置是单个指针。指针从连接到X服务的所有指针类型设备来聚合移动和按钮事件:举个例子,笔记本的触摸板和外置USB鼠标。用户也可以通过Xinput扩展2.0来使用多指针XMPX)功能,以便使能多个光标并为它们分配设备。在MPX下,每一个指针都有它自己的输入焦点。每一个指针都配有其所在客户端的/为其提供输入的键盘。(老外冗长的宾语从句真TMD也是醉了)

c.触控板输入

        同基本输入相比,触控版在客户端上仅仅作为移动指针和产生按钮事件的其他设备而出现。客户端如果想使用超越鼠标模拟的功能,可以用Xinput扩展2.2或更新的版本(随Xorg1.12发行),如此就可以支持多点触摸的事件报告。

d.触摸屏输入

        [XXXwrite me –po8]

        ……这哥们竟然没写。

e.高级输入设备和技术

       [Makewhot write this? or steal from http://who-t.blogspot.com? --alanc]

         让whot去写?或从这哥们的博客偷?


2.GetImage:从显示读

        X服务器不会去追踪它向显示器(display)画了什么。一旦数据(bits)在帧缓冲(framebuffer)中被渲染,X服务器的责任就结束了。如果数据需要被重新渲染(比如它们被临时遮盖),那么X服务器会请求客户端——通常是一个复合管理器(比如窗口管理器)或是一个原始绘制该图像的应用程序,去重新绘制这些数据。

在一些情形下,大部分尤其是截屏,客户端需要直接回读帧缓冲的内容。X协议为这种情况提供了GetImage请求。

         GetImage有一些缺点,应该避免使用它,除非你绝对需要。GetImage通常极其缓慢,由于现代图形硬件和软件路径优化的情况下输出像素渲染造成的。GetImage也很难正确使用。在这里,比X协议的任何地方都更让硬件明显地暴露给客户端。请求的帧缓冲内容会被按照帧缓冲的对齐/填充/字节序方式呈现给客户端。XlibXCB中的通用库代码可用于处理这些复杂的东西,并将接收到的帧缓冲转化为有用的东西。然而,使用这些代码将进一步减慢处理过程。


3.输出

a.渲染/栅格化

        原始的X协议最初定义了一组核心渲染操作,比如画线,多边形填充,以及复制图片缓存等。这些并没有跟着图形硬件一起进化,以及跟随现代应用程序期望的方向。所以这些主要用于老旧的应用程序。

现代应用程序使用很多种的客户端渲染库,比如用于二维图形渲染的Cairo,或三维图形渲染的OpenGL。这些库会将图像推送至X服务器显示,或者透过X服务器直接作用于本地的视频硬件,利用GPU加速和其他硬件的特性。

b.多边形渲染模式

          ……这哥们没写


4.DisplayScreen

        X将机器的资源划分为显示(Display)和屏幕(Screen)Display通常是单个X服务器连接的所有设备,并为单个用户显示单个会话。系统可能会有多个Display,例如multi-seat设置,或甚至系统控制台的多个虚拟终端。每一个Display都有一组输入设备以及一个或多个Screen与之关联。Screen是一个可以显示或移动窗口的Display子集——但是窗口无法跨越多个Screen显示,或从一个Screen移动到另一个Screen。输入设备可以在同一个X服务器上的所有Screen上与窗口交互,比如移动光标从一个Screen到另一个Screen。原始的Screen只能和一个显示器关联,但是现代技术已经允许多个显示设备组合成一个逻辑Screen或单一的分离设备。

当客户端连接上服务器时,你必须指定你要连接哪一个Display,要么通过$DISPLAY环境变量,要么通过应用程序选项例如-display”--display”X(7)man手册里有完整的DISPLAY语法文档,不过一个典型的Display语法是:hostname:display.screen。使用本地连接时hostname”可以省略,并且当你使用默认screen的时候.screen”也可以不用,剩下最小的display使用范例就是:display”,例如通常在机器上默认的X服务使用:0”


5.图形上下文

        图形上下文(GC)是一个结构体,用来存储X绘画操作的共享状态和通用值,以避免给每个请求重复发送同样的参数。客户端必要的时候可以分配附加的图形上下文,以便有能力为不同的GC设置分配其适当的不同值。


6.颜色和视觉

        X太老了,以至于当它被设计出来的时候大部分用户使用的还是单色显示器,只有黑色和白色像素可供选择,甚至硬件厂商都不能达成一致什么是0什么是1。那些额外花了上千美元的可以有48位的颜色,可以从调色板中选择到256种颜色的像素。但是在2012年的现在,任何没有32位色的(设备或其使用者)都是勒德分子。不过,很多复杂性仍在这里应该有人解释……(意思是可能基于某些原因而存在这样的设备)


7.同步和刷新连接

        就如通信章节里所描述的,X协议试图通过尽可能多的异步来避免延迟。这一点尤其被新手程序员注意到,他们调用了渲染功能,但是奇怪为什么没有发生错误却没有看到期望的输出结果。由于绘图操作不需要等待X服务器的响应,他们只是放在客户端的输出请求缓冲区,而不是发送给X服务器,直到缓冲区因为某些原因而被刷新。缓冲区在填满时会自动刷新,但它需要大量的命令来填充默认32kb大小的Xlib缓冲区。当一个函数被调用以阻塞等待来自服务器的响应时,XlibXCB会去刷新缓冲区(尽管两者的功能来自不同的设计模型——详情见XlibXCB章节)。最后,客户端可以明确地调用XlibXFlush()XCBxcb_flush()函数发送缓冲区中所有的有序请求到X服务器。客户端可以调用XlibXSync()XCBxcb_aux_sync()函数,来刷新缓冲区并等待X服务器在缓冲完成处理所有的请求。


8.窗口系统对象

       X使用了多种对象。

a.窗口

        在X中,窗口简单来讲就是屏幕上一个可以绘画的区域。窗口放置在一个树形结构,根窗口被X服务器创建并覆盖整个屏幕界面,并伴随着X服务器一直存在。所有的其他窗口都是根窗口或其他窗口的子窗口。大多数用户所认为的窗口UI元素,其实仅仅是窗口层次结构中的一层而已。

(未完待续)……


你可能感兴趣的:(Xwindow)