Xlib 函数库

来源:百度文库 编辑:神马文学网 时间:2024/05/05 12:40:00
Xlib 函式库:


作者: 谢东翰


A.      简介:

X Window 系统是 UNIX 世界中标准的图形操作接口,它是在 1984 年由麻省理工资讯科学系与迪吉多公司合作开发的一个项目计划,其目是要发展一个兼具可移植性与网络通透性的窗口系统。该项目计划首度发表的是第十版的窗口系统 (X10),到了1987 年发表了第十一版 (X11),历经多年的开发演进,到了 1994 年发表了 X11R6,也就是目前 UNIX 系统上通行的版本。而原本负责此项目计划的成员,也在 1996 底组成了一个称为 X Consortium 的组织,持续 X11R6 的开发与维护,而其最新的改进版是去年才问世的 X11R6.5。

由于 X Window 项目计划的出现,使得各 UNIX 厂商与软件开发组织可以以 X Consortium所发展的程序代码为蓝本,在他们的系统上建立图形化窗口环境。为了达到完整的可移植性与网络通透性,各厂商与软件开发组织所实作出来的 X Window 版本都遵守相同的协议,即 X 协议,同时也采用同样的函式库呼叫接口。因此,只要是 X Window环境下开发出来的程序,原则上都可以不需修改而移植到其它平台的 X Window 环境(只要它的 X Window 版本与原开发环境的版本相同或更早即可) 编译执行。而在 GNU/Linux、FreeBSD 等 x86 平台的自由 UNIX 操作系统中,其 X Window 系统是来自 XFree86 计划,顾名思议,该计划的主要目的是提供一个免费、自由的X Window 系统给 x86 个人计算机上的 UNIX 使用。而原先 GNU/Linux、FreeBSD 等是在 x86 计算机下开发的,但近年来它们已逐渐移植到 DEC Alpha, Sparc .... 等高阶的计算机系统上去,因此 XFree86 也顺应做了移植,可以在那些非 x86 的硬件系统上执行了。该计划也是依照 X Consortium 的标准而开发的,例如这两三年来通行的XFree86-3.3.X 系列,主要就是以 X11R6.3 为蓝本。 .

但到了近一两年来情况稍有改变,由于 GNU/Linux 平台上的多国语言与 Unicode 支持的需求日益迫切,同时为了顺应近年来新的软应体技术,使得传统的 X11R6 实作方式已渐渐不缚使用。然而 X Consortium 在这些部分的开发脚步却不够快,或甚至仍未起步,故到了 XFree86-4.0.X 系列,除了遵循 X11R6.4 的标准以外,同时更进一步地开发了 Unicode 的支持、TrueType 字型支持、模块化显示卡驱动程序、高速绘图接口、并逐步修正过去 X Consortium 所发表的程序代码中的错误 .... 等。可以这么说,XFree86-4.0.X 系列比起过去的版本有着相当长足的进步。而这些改进,未来也许会逐步出现在 X Consortium 新版的 X11R6 中。

X Window 系统采取的是 Server/Client 的模型而运作。

所谓的 Server 指的是X Server, 它通常掌管一个完整的 Display。根据定义,一个传统的 Display 包含一个显示器、一个键盘、及一个鼠标,或者还有其它选择性的输出入装置,换句话说,它就是一个完整的图型桌面装置。而 Client 指的是在此 Display 中执行的所有X Window 应用程序,它们需要在屏幕上绘图、需要接收鼠标、键盘等输入 .... 等,都必须向 X Server 发出请求,由 X Server 代为完成。而 X Server 与 Client 之间的沟通协议就称之为 X 协议。此 X 协议不仅可用于本机的 Display (亦即 X Server与 Client 都在同一部机器上执行),它更具备了网络的通透性,也就是 X Server 与Client 可以在不同机器上执行,例如将远程的 Client 窗口显示到本地的 X Server上,而本地的使用者在使用时就和操作本机执行的 Client 一样,不会有分别。此网路的通透性正是 X Window 系统最强大的特点之一。由 X Server 掌控的 Display 只是图形接口的底层平台而已,它还不是我们平常所接触到的桌面环境。 .

我们所用的桌面环境是由「桌面管理程序 (Window Manager)」所提供,它拥有方便的菜单选单、激活应用程序的按扭图标、可以帮我们放漂亮的底图、及管理桌面上所有的窗口 .... 等等的功能,事实上,「桌面管理程序」在 X Server的眼中,也不过是一个 X Client 而已,只是它的功能比较特殊,专门负责管理整个工作桌面。由于 X Window 系统并不将桌面管理程序内建在 X Server 或 Display 中,因而给我们一个弹性: 我们可以依自己的喜好挑选桌面管理程序来用。这类的桌面管理程序可以说形形色色,有功能小巧阳春的 twm 与 fvwm、有长得很像 Windows 95 接口的 fvwm95、有相当眩丽的 enlightment、而有的功能甚至超越了单纯的桌面管理程序,还同时提供了一组链接库与应用程序、管理工具等等,让我们的桌面更加好用,如 KDE或 Gnome 等。 而这些形形色色的 X 应用程序 (Client) 与 X Server 之间的沟通管道,就是实作并传输 X 协议的 X Window 底层函式库: Xlib。Xlib 在 X Window 中的地位,就好象 libc在整个操作系统中的地位一样。若要做进一步的模拟,X Server 的角色就如同操作系统的核心,libc 提供了系统核心系统呼叫的窗口,同样的 Xlib 可以直接与 X Server 连系传送讯息。若要撰写 X Window 的应用程序,则最底层可用的函式库就是 Xlib。


B.      Xlib 概观:


在 X Window 的世界里,可以说所有的动作都是由「事件 (Event)」所触发并完成的,不论是对 X Client 或是 X Server 都是一样。从 X Client 的角度来看,每个 X 应用程序内部都有一个处理事件的循环 (event loop),程序静静地等待事件的发生,一旦 Xlib 截获一个属于该应用程序的事件并传送给它时,该事件就会在事件处理循环中产生相应的动作,处理完后,又会回到原点,等待下一个事件的发生。可能发生的事件有很多种,像是其它的窗口传来讯息、键盘鼠标有了动作、桌面管理程序要求改变窗口的大小状态 .... 等等。

同样的,在 X Server 这边也是等待事件发生,以提供适当的服务。它同时还监控着整个 Display 的所有装置,如果有任何讯号输入 (如来自键盘或鼠标的输入) 时,它会将该讯号打包成「事件」的包裹,经由 Xlib 传送给等待接收讯号的 Client (即前景窗口)。由于 X Window 具备网络的通透性,故在设计时特别考虑到网络传输效率的问题。如果网络速度不够快时,每次 Client 一有服务请求就要求 X Server 马上响应,显然太缺乏效率了。因此在 Xlib 中有一个事件的缓冲区,当 Client 提出一连串的服务请求时,这些请求并没有马上送往 X Server,而是暂时保留在缓冲区中,等到必须要送出的时间点时,才会一口气送出,而让 X Server 将这一连串的服务请求一口气处理完毕。通常这个时间点是发生在 Client 送完了一连串的请求后,停下来等待下一个属于它的事件时,或者 Client 呼叫了 Xlib 中特定的函式要求 Xlib 马上将它的请求发送给 X Server。 !

此种以「事件处理」为基础的运作模式,使得 X Window 的程序写起来,与一般的程序有些不一样。同时一个窗口的程序由于牵涉到许多可调整的细节,像是窗口大小、颜色、底图样式、线条粗细、字型 .... 等等,因而使得程序内部会用到的数据结构与函式呼叫往往会很复杂。但大体而言,一个标准的 X Window 程序其内部的基本执行程序大至如下:

1.       呼叫函式 XOpenDisplay() 与 X Server 取得连系。

2. 初始化自己的窗口,包括一切属性设定,同时要将一些窗口属性的「提示」告诉桌   面管理程序。注意这里只是「提示」而已,因为桌面管理程序管理所有的窗口,在   某些情况下它可能无法完全按照应用程序的要求来执行 (例如应用程序要求了超过   桌面范围的窗口位置) ,故它多少会自行调整一下。但大体而言它会尽可能按照应   用程序的「提示」做到。

3. 设定应用程序窗口欲接收的「事件」种类,依应用程序的不同,其希望接收的事件   也不同,若程序不需要的事件就不用接收,如此就可以省下不必要的效率浪费。

4. 进入事件循环,等待事件,处理事件,直到程序结束。 !

程序大部分的工作都是在事件循环中运作,包括重画窗口本身,因为自己的窗口可能会被别的窗口遮住,当别的窗口移开时,桌面管理程序就会送一个「要求窗口重画」的事件过来。因此,Xlib 内部的函式中,除了用在应用程序初始化与其它特殊用途以外,其余几乎都是用在处理事件循环中。这些函式群大至可分类如下:  1.       与 X Server 连系、取得 X Server 内部可用资源与相关信息等。
2.       窗口的产生、属性设定、与桌面管理程序沟通及发送「提示」等。
3.       绘图函式群与绘图属性设定。其中绘图属性指的是 Graphics Context (GC), 它是   一个大型的数据结构,可用来指定线条粗细、字型与点数、颜色、底图 .... 等等。
4.       颜色处理与色板 (即可用的颜色数与颜色种类) 设定。
5.       事件种类与各事件的处理方式,包括取得键盘的输入与鼠标的动作等。
6. 程序国际化。在旧版 X11R5 的时候,已开始有程序国际化的鶵型,但在某些方面还   不够完整,直到 X11R6 才接近成熟。这里的程序国际化包括 FontSet 的概念、   X Locale 的设定、国际化文字输出 (绘图)、输入 (输入法程序与 XIM 协议)、复   合字符串 (Compond Text) 的处理 .... 等等。而在 XFree86-4.0.X 系列,还多了一   组 Unicode/UTF-8 的处理函式,内容相当丰富。
7. 各窗口应用程序之间的通讯机制。主要有三种,由简单到复杂依序为「讯息事件」的   发送、使用窗口的 property 通讯、以及使用 Selection 机制通讯。越复杂者所能   通讯的资料量越大、能处理的资料型态可以越多样、同时也越可靠。 ..
8. 资源管理与使用者设定。前面我们已说过一个 X Window 的程序可调整的部分相当多,   而这些可调的部分可以以一个特别的格式存在特定的「资源档」中,如使用者 HOME   目录下的 .Xdefaults 或 .Xresources 檔中。因此,Xlib 提供了一组特别的函式   用来取得这些资源文件的资料。
9. 桌面管理程序专用的函式群与相当协议,这些函式赋与程序管理桌面与其它应用程序   窗口的能力。


C. 各式各样的 Tool Kit:

由上可知,使用 Xlib 直接来开发应用程序可能不是件容易的事,因为中间牵涉到许多窗口与图形接口的低阶操作,过程很复杂,故程序写起来会很长。

为了方便 X Window的程序开发,因而有各式各样的 Tool Kit 出现。

这些 Tool Kit 多半是以函式库的形式存在,但有些是编写成直译语言 (script) 的形式,在使用上更为方便。不论是何种形式,它们都是以 Xlib 为基础建构起来,它们将每个 X Window 程序都必须的窗口初始化工作、事件循环与事件处理、各窗口间的通讯、长用的图形接口组件 .... 等等冗长的程序代码,包装成几个简单的函式,可以让程序开发者直接使用。

故使用 Tool Kit可以让程序写起来较为干净简洁,有助于提升程序开发的质量。在这些 Tool Kit 中,特别引进了在 Xlib 中没有特别强调的概念,称之为 Widget Set。简而言之,Widget Set 可以视为一个图形接口的「外观」或「样式」,它可以很简单只是一两个图形组件,如一个简单窗口,或窗口中某个按扭,也可以复杂到形成一个具备特殊功能的窗口,如接受文字输入的窗口,还可以将文字 Cut/Copy/Paste 到别的窗口上 .... 等。所有的 Tool Kit 中几乎都内建了许多 Widget Set,而这些 Widget Set的外观、功能在不同的 Tool Kit 间或多或少会有差异。因此,使用不同的 Tool Kit设计出来的程序,可以让人一眼看出来其风格的不同。 目前常见的 Tool Kit 有许多种,大至分类如下:

1. libXt, libXaw: 这是 X11R6 系统中内建的 Tool Kit,让我们除了使用 Xlib 之余       也可以试着用它们来撰写程序。大部分的 X11R6 内附的工具程序或应用程序       都是用这两个 Tool Kit 写成的。另外,还有两种称为 Xaw3D 与 Xaw95,可       以让 libXaw 的程序外披上 3D 三维效果或像微软 Windows 95 窗口的外衣 2. Motif/Lesstif: Motif 可以说是过去在 X11R5 时代最强大的一个 Tool Kit,同时       也是当时业界采行的标准。几乎绝大部分在当年开发的商业软件都是用 Motif       写成的。由于 Motif 是商业软件,故在某些场合下无法使用 (最近它的授权       限制较为放宽了),为了让自由软件世界也可以使用以 Motif 为基础的软件,       因而出现了 Lesstif。它可以说是模仿 Motif 的接口重新实作的 Tool Kit,       以自由软件的授权散布,但目前它只完成到相当于 Motif-1.2 版的呈度而已,       而 Motif-2.X 版的兼容与支持目前仍在开发中。

3. Qt/KDE: Qt 是一个用 C++ 对象导向式语言完成的 Tool Kit (前者的 Tool Kit,       包括 Xlib 都是 C 语言的接口)。它是由 Trolltech 公司所发展的,它不仅    是继 Motif 之后功能最齐全且完备的 Tool Kit,同时使用上比 Motif 容易,    而且还跨平台: 可以同时跨 UNIX 与微软窗口系统的平台。因此,使用 QT 开       发的程序,理论上可以在不需修改 (只图形接口部分的程序代码) 而可以直接在       UNIX 与微软窗口系统上编译使用。       KDE 是以 Qt 为基础而完成的桌面环境系统,它是目前自由软件世界使用最广       泛的桌面环境系统之一。它不仅是桌面管理程序而已,同时还有一组完整的应       用程序、工具程序、与函式库、程序开发工具。使用它的函式库,可以让应用    程序与整个 KDE 系统整合在一起,而享有 KDE 环境所有的资源与服务,当然,       也继承了 Qt 所有的特性。       由于 KDE 是以 GPL 的自由软件,而 Qt 是商业公司发展的软件,二者在软件       授权上不兼容,故曾经有一度引发自由软件世界的困扰,而无法完全普级使用。       直到近一两年来,Trolltech 公司终于同意让某些 Qt 版本以 GPL 授权散布,       局面才壑然开朗。Qt 的 GPL 化,可以说是自由软件世界相当欢欣鼓舞的一刻。 .

4. gtk+/Gnome: gtk+ 与 Gnome 的组合与 Qt/KDE 的组合很像,也是企图开发出一套功       能强大的 Tool Kit 与桌面环境系统,它们的开发者是 GNU。事实上,它们的    开发正是源自于早年 Qt 不是自由软件的困扰。尽管现在困扰已消失了,但这       一套系统仍继续往前走,同时 Qt 与 gtk+ 两大阵营也开使合作,共同开发二       者可互通或兼容的程序发展接口。       gtk+ 原本并没有要发展成完整的 Tool Kit 的企图,刚开始时只是 GNU 的一       个图型影像处理程序 Gimp 背后的一个函式库而已,到了 Gnome 开始发展时才       逐渐往完整的 Tool Kit 方向发展。它最大的特色是可以和各式各样的程序语       言结合使用,包括 C/C++, Ada, Perl, Python, 而其它像 JavaScript,        Guile, Objective-C, Pascal .... 等等也在开发中,故使用上弹性相当大。

5. Tcl/Tk: Tcl 是一种直译式 (script) 的语言,我们只需写几个简单的指令,透过       Tcl 直译器就可执行许多复杂的工作,而 Tk 则是以 Tcl 语言为基础完成的       Tool Kit,它可能是撰写 X Window 应用程序中最方便使用的 Tool Kit。除了以上这些常见的 Tool Kit 以外,还有许多足繁不及备载,像是 libforms 或Java/JavaScript 之类等等。 参考资料:


1. X Consortium: http://www.x.org/

2. XFree86 Project: http://www.xfree86.org/

3. Xlib Programming:
       a. Xlib - C Language X Interface, by X Consortium Standard
          ftp://ftp.x.org/pub/R6.4/xc/doc/hardcopy/X11/xlib.PS.Z

       b. The Definitive Guides to the X Window System
          Volume 1, Xlib Programming Manual (for Version 11)
          Author: Adrian Nye
          Publish: O'Reilly

       c. The Definitive Guides to the X Window System
          Volume 2, Xlib Reference Manual (for Version 11)
          Author: Adrian Nye
          Publish: O'Reilly

       d. The Definitive Guides to the X Window System 本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系。
          R6 Update for the R5 Editions of vols. 1, 2, 4, & 5
          Programmer's Supplement for Release 6 of the X Window System.
          Author: Adrian Nye
          Publish: O'Reilly

4. libXt:  The Definitive Guides to the X Window System
          Volume 4, X Toolkit Intrinsics Programming Manual
          Author: Adrian Nye and Tim O'Reilly.
          Publish: O'Reilly

5. Motif:
       a. http://www.opengroup.org/motif/

       b. The Definitive Guides to the X Window System
          Volume 3/3M: X Window User's Guide for X11/OSF Motif
          Author: Valerie Quercia and Tim O'Reilly. 成功的人生,需要自己去经营,别再说了,莫再等了,现在就为自己的人生做好规划,为人生点亮一盏明灯,赢在人生起跑点上。
          Publish: O'Reilly

6. Lesstif: http://www.lesstif.org/

7. Qt:  http://www.trolltech.com/products/qt/
   KDE: http://www.kde.org/

8. Gtk+:  http://www.gtk.org/
   Gnome: http://www.gnome.org/

9. Tcl/Tk:
       a. http://www.scriptics.com/

       b. References: http://cui.unige.ch/eao/www/TclTk.html