Xlib - C语言的X接口是一个参考指南,以低层C语言接口的X窗口系统协议。它既不是编写X Window系统的教程,也不是用户指南。相反,它提供了库中每个函数的详细描述以及相关背景信息的讨论。Xlib - C语言X Interface假定对图形窗口系统和C编程语言有基本的了解。其他高级抽象(例如,由工具包为X提供的抽象)构建在Xlib库之上。有关这些高级库的更多信息,请参阅适当的工具包文档。X Window System协议为X的行为提供了一个确定的单词。虽然这里出现了其他信息,但是协议文档是统治文档。
为了介绍X编程,本章讨论:
X窗口系统概述
错误
标准头文件
泛型值和类型
Xlib中的命名和参数约定
编程注意事项
字符集和编码
格式规范
X窗口系统概述
本书中使用的一些术语对X来说是惟一的,而其他窗口系统中常见的一些术语在X中有不同的含义。
X窗口系统支持一个或多个包含重叠窗口或子窗口的屏幕。屏幕是一种物理监视器和硬件,可以是彩色、灰度或单色。每个显示器或工作站可以有多个屏幕。一台X服务器可以为任意数量的屏幕提供显示服务。一个用户拥有一个键盘和一个指针(通常是鼠标)的一组屏幕称为显示。
X服务器中的所有窗口都按照严格的层次结构排列。在每个层次结构的顶部是一个根窗口,它覆盖每个显示屏幕。每个根窗口都被子窗口部分或全部覆盖。除根窗口外,所有窗口都有父窗口。通常每个应用程序至少有一个窗口。子窗口可能有自己的子窗口。通过这种方式,应用程序可以在每个屏幕上创建任意深度的树。X为windows提供图形、文本和栅格操作。
子窗口可以比其父窗口大。也就是说,部分或全部子窗口可以扩展到父窗口的边界之外,但是所有到窗口的输出都被父窗口剪切。如果一个窗口的多个子窗口具有重叠的位置,则其中一个子窗口被认为位于其他子窗口之上或高于其他子窗口,从而使它们变得模糊。输出到其他窗口覆盖的区域将被窗口系统抑制,除非该窗口具有后备存储。如果一个窗口被第二个窗口遮挡,则第二个窗口只遮挡第二个窗口的祖先,这些祖先也是第一个窗口的祖先。
窗口的边框宽度为零或多个像素,可以是您喜欢的任何图案(像素图)或纯色。一个窗口通常有一个背景图案,但并不总是这样,当它被打开时,会被窗口系统重新绘制。子窗口使父窗口变得模糊,父窗口中的图形操作通常由子窗口剪切。
每个窗口和pixmap都有自己的坐标系统。坐标系的横坐标是X轴,纵坐标是Y轴,原点在左上角[0,0]。坐标是积分的,以像素为单位,与像素中心重合。对于一个窗口,原点位于窗口内左上角的边框内。
X不保证保存windows的内容。当一个窗口的一部分或全部被隐藏起来,然后重新显示在屏幕上时,它的内容可能会丢失。然后,服务器向客户机程序发送一个Expose事件,通知它需要重新绘制窗口的部分或全部。程序必须准备根据需要重新生成windows的内容。
X还提供了图形对象的离屏存储,称为Pixmap 。单平面(深度1)像素图有时称为位图。Pixmaps可以在大多数图形函数中与windows互换使用,也可以在各种图形操作中用于定义模式或tile。窗口和位图一起称为Drawable 。
Xlib中的大多数函数只是将请求添加到输出缓冲区。这些请求稍后将在X服务器上异步执行。返回存储在服务器中的信息值的函数不会返回(也就是说,它们会阻塞),直到接收到显式的响应或发生错误。您可以提供一个错误处理程序,它将在报告错误时被调用。
如果客户机不希望请求异步执行,它可以在请求之后调用XSync, XSync将阻塞,直到发送并处理所有先前缓冲的异步事件。作为一个重要的副作用,Xlib中的输出缓冲区总是通过调用任何从服务器返回值或等待输入的函数来刷新。
许多Xlib函数将返回一个整数资源ID,这允许您引用存储在X服务器上的对象。这些类型可以是Window、Font、Pixmap、Colormap、Cursor和GContext,如文件中定义的那样。这些资源由请求创建,并由请求或连接关闭时销毁(或释放)。这些资源中的大多数都可以在应用程序之间共享,实际上,窗口是由窗口管理器程序显式地操作的。字体和光标在多个屏幕上自动共享。字体根据需要加载和卸载,并由多个客户机共享。字体通常缓存在服务器中。Xlib不支持在应用程序之间共享图形上下文。