2 Star 0 Fork 1

凉拌茶叶 / The_X_New_Developers_Guide_zh_CN

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
04_X的现代扩展.md 7.17 KB
一键复制 编辑 原始数据 按行查看 历史
凉拌茶叶 提交于 2014-04-15 16:53 . 翻译完04

X的现代扩展

Alan Coopersmith

就像“服务器与客户端间的通信”一章中描述的那样,X Window系统在漫长的时间中通过X11协议的扩展机制逐渐进化,这种扩展机制使得X能够引入让服务器能够支持的新的协议请求、时间和错误。大多数扩展都有版本侦测机制,使得客户端能够知道该扩展支持哪些特性。

现代窗口系统需要的很多功能在X协议设计时还没有被开发出来。因此,大多数应用都扩展都依靠扩展来使用X在数十年间积累起来的功能。至少,应用的开发者需要知道这些扩展将如何影响他们的应用。

一些扩展由客户端直接使用,另一些则隐藏在X库之下(如Xlib或XCB)使得客户端并不直接地调用它们。比如,Big-Requests扩展允许库发送比X11协议原本允许的要大的请求;XC-MISC扩展允许库在原先的分配耗尽时请求新的XID段。

现代应用的开发者需要熟悉一下的扩展,因为它们的应用是在如今的世界是如此广泛而又重要:XKB,Xinput2,Composite,RandR,Xinerama和Sync。

XKB

键盘输入和键盘布局管理现在包括了区域键盘布局,vendor-specific键盘模型,和复杂的用户设置。这是远远复杂于X11协议原本的键盘支持所预期的。通过Xlib API编写程序的程序员会发现现在一些Xlib的键盘函数开始调用XKB支持了。另一些Xlib调用就显得粗糙而在应该用Xlib中的XKB的支持替代。

[Much more information is needed here. --po8]

Xinput 2

在核心协议中,输入设备间最明显的区别在于它们按钮的数量。这种输入模型很快就显得过于局促,因为用户们想将种类非常广泛的输入设备连接到Xserver上。许多扩展都尝试填平这条鸿沟。Xinput在1990年代早期胜出并成为标准,提供了对多种输入设备和输入类型的支持。Xinput在15年间几乎不变。随着笔记本和移动设备日益增长的需求,Xinput 2应运而生了。

这篇文章撰写时,最新的Xinput版本为Xinput 2.2,打包在Xorg 1.12发布中。Xinput 2.2添加了多点触控支持。比如,现在客户端可以区分单手指滑动和双指扫动。多点触控支持加入到之前版本的增强中。包括了通过在客户端和设备之间传递额外的元数据和设置信息来表达的输入设备属性;将来也会包括Multitouch X(MPX)特性。MPX允许多个X用户共享一个X桌面。每个用户将有用他们自己的鼠标和键盘驱动的单独的屏幕光标图像和输入焦点。

有关现代Xinput的更多信息,包括源码和设定示例详见Peter Hutterer的博客:http://who-t.blogspot.com/

Composite

X原本是为仅有几兆内存的电脑设计的。在这样的环境中,留不出完整保存每个窗口绘制的图像的内存。取而代之的是,仅有硬件帧缓冲的图像被存储下来,其中是当前屏幕显示的图像。当窗口被移动、激活或是被展现,客户端收到Expose事件告诉它们重绘窗口新的可见部分。不幸的是,这种重绘经常导致窗口在移动时出现闪动一类的现象。重绘也会导致应用的复杂度增加。每个应用必须保证能够有效地在任何时间重绘窗口的任何角落。这导致应用需要有内建的显示列表,维护内部光栅等等来胜任这项任务——原本任务在服务器提供的通用方式下运行得更好。

现代计算机有相当多的内存用于渲染。X现在可以用更多的内存来换取更快的响应,更少的屏幕重绘和更简单的应用。Composite扩展可以将所有所有窗口缓存到和当前屏幕无关的内存中。Composite扩展在需要的时候会将内存中的缓存组合到帧缓冲中,来生成屏幕上的图像。由于内容存储在栈中,Composite扩展能方法地调用外部的“合成管理器”客户端来生成任意“特效”——比如同时提供透明效果,模糊效果或阴影。

不幸的是,并不是所有环境都有Composite扩展,比如有些X设置下会出现一些不兼容。应用的作者必须保证应用能够恰当地处理Expose事件,并在Composite扩展被禁用的环境下测试这个功能。但是,Expose事件的处理在现代X应用中越发趋于简单;现在都假设应用重绘操作的性能不再是那么严肃的问题了。

RandR和Xinerama

X的Screen原本是直接对应与一个显示器。拥有多个显示器的用户有逻辑上分开的Screen对应与每个屏幕:没有办法使得窗口能够跨越屏幕或从一个屏幕移动到另一个屏幕。用户自然要求更多功能。因此,在90年代中期,X11R6.4添加了Xinerama扩展来将多个输出设备组合成一个逻辑屏幕使得窗口能在其间自由移动。Xinerama实际上在同一个扩展内提供了两组高度相关的功能:X服务器上多显示设备的组合,和在协议上允许客户端向X服务器查询每块逻辑屏幕的边界。

之后,硬件设备不断进步,先进技术被普及,使得单个的显示适配器能够驱动多个输出设备。Xinerama协议从支持多输出的显卡获取多个显示器的信息,尽管之前组合显示设备功能在这种情况下已经不再适用了。

用户同样要求在不重启X服务器的情况下能够改变显示器设置以及“热插拔”输出设备(比如把投影仪插到笔记本电脑上)。X Resize,Rotate和Reflect扩展(在reflection加入前缩写是XRandR——这个名字不变了)能够实现这些功能。XRandR 1.2和以后的版本现在允许查询和设置多显示器的布局。Xrandr 1.2同样也加入了设备属性,提供了额外针对特定设备的元数据和设置选项。Xrandr 1.3加入了transformations和panning支持。

不幸的是,如果你的应用想要知道屏幕布局,那么这两个扩展都要注意。并不是所有的系统都已经支持Xrandr 1.2:专有的驱动或服务器可能有点问题。Xinerama的multiplexer可能仍被设置成结合多个独立的显示适配器,但Xinerama或多或少地能够提供XRandR能提供的信息。只有XRandR允许你的应用注册以接收布局或设备信息变更的事件。

SYNC

X核心协议只保证它按照连接的接收顺序处理请求。并不能保证按照不同连接,或按照系统事件或时间来处理。X Synchronization(SYNC)可以使得系统处理这些情况。应用可以让X在一个连接上推迟处理之后的请求直到一个指定的同步时间点;应用同样可以让服务器在指定时间向客户端发送事件,比如在用户操作停止之后的闲置了一段时间后。

比如,一个不希望画面撕裂的客户端可能会向服务器发送所需的所有请求来刷新屏幕无关的像素映射,但要等到一个屏幕刷新间隔开始。客户端在这之后的屏幕刷新期间就能将像素映射复制到屏幕实际显示的窗口上,而不是在显示控制器正在更新窗口的时候。

如果标准的同步时间点由SYNC提供效率会很低,客户端就可以定义它们自己的刷新时间点。比如,这使得客户端的更新能与另一个协作的客户端的行为同步。

1
https://gitee.com/leo_song/The_X_New_Developers_Guide_zh_CN.git
git@gitee.com:leo_song/The_X_New_Developers_Guide_zh_CN.git
leo_song
The_X_New_Developers_Guide_zh_CN
The_X_New_Developers_Guide_zh_CN
master

搜索帮助