前言
X Window System 是一套 Client-Server 体系结构的窗口系统,它是现代Unix 系统 (包括 Linux、FreeBSD etc.) 所必备的图形界面。本文以 programmer 的观点,对 X Window System 的几个重要特征做介绍,让读者在开始撰写 X 应用程序前,先有个清晰的 X 概念: (笔者将假设你已熟悉于 X Window 环境中工作)
What is X Window System
在 1984 年前,有许多商业公司开始为 UNIX 系统开发图形用户接口 (GUI),由于每个公司所发展的图形接口规格不一致,而且所开发的系统大都依赖于各公司所用的计算机系统 (Mainframe、Mini Computer、WorkStation 等),结果各个图形接口不仅无法彼此沟通,要让应用程序能在多个系统上执行,更是一件困难的事;同时由于接口规格不一,程序撰写的方法也会随平台而有所不同,programmer 也因此增加了不少困扰。
一个使用者很容易就能熟悉如 Microsoft Windows 或 Apple Macintosh 等图形接口系统,但对程序员 来说,写 Windows 的程序和写 Machintosh 的程序,其方法与风格是完全不同的两回事 (因为程设接口不一致);再者,这些窗口系统都局限于硬件环境与操作系统制造厂商,可在 Mcrosoft Windows 平台上跑的程序,既无法拿到 Macintosh 上执行,也只限在 PC 环境中使用 (这边所指的是包含了图形接口程序代码的程序)。
有鉴于此,麻省理工学院 (MIT,Massachusetts Institute of Technology) 便在 1984 年开始了 Client-Server 架构的 X Window System 发展计划。X Window 发展的目标,就是『要提供一个与硬件无关、统一的、网络透明的 (Network Transparent) 图形接口环境』,让各种操作系统与计算机硬件都能执行 X Window (与硬件无关),程序设计的方法一致 (统一的),并且能透过网络来分享其它计算机上的 X 资源。
Client-Server 体系结构
图一
X Server 与 X Client
X Window System 是一个 【Client-Server 结构】的图形接口系统。X Client 指的便是各式各样的应用程序 (文书处理、数据库应用、网络软件等),而 X Server 主要在处理来自 X Client applications 的 请求,在屏幕上绘制图形 (所以又称为 Display Server);并且负责管理可用的字形与屏幕可用的颜色等系统资源,读取使用者的输入 (来自键盘或鼠标),传送键盘、鼠标事件与窗口状态信息给 X Client (也就是应用程序)。
X Protocol
在 X Window System 中,X Server 与 X Client 都是透过 X Protocol 来交换讯息,X Protocol 定义了 X Server 与 X Client 间的讯息交换格式。关于 X Protocol,读者在接触更多 X Programming 的信息后,会慢慢体会到它的存在;目前不妨暂时将 X Protocol 在 X Window System 中所扮演的角色,想象为 HTTP 协议在 Web Server 与 Web Client (Browser) 间所扮演的沟通角色一样。
在 X Window System 中比较特殊的一点,就是 X Protocol 允许 X Server 与 X Client 能跨网络来交换讯息,这意味着 X Server 与 X Client 不限制都得在同一台机器上执行,可在不同的计算机上同时执行。
如图二所示,X Server 与 X Client 在同一台计算机上执行。本例假设执行 xinit script 后,刚激活 X Server 时所见到的画面,其中左上角的窗口为 X Server 激活后,xinit 会顺便执行的 X Terminal (一个 X Client)。如果只想激活 X Server,不跑其它 X Client,只要输入 X 指令执行即可,执行后通常只会看到一个灰色底的桌面 (desktop,又称之为 RootWindow)。
图三则是 X Server 与 X Client 在不同计算机上执行的例子。我们可以在自己的计算机上激活 X Server后,再 Telnet 联机至其它计算机 (如图中之 Computer 2 及 Computer 3),将其它计算机上 X Clients 的执行结果,传回到自己的屏幕上。当然 X Server 一定得在使用者自己的计算机上执行,这样我们才能看到应用程序 (X Clients) 的执行结果为何。
读到这里,读者或许会对此处所讲的【Client-Server 结构】一词有些疑虑,那是因为在 X Window System 的世界里,X Client 与 X Server 间的【Client-Server 架构】关系,和一般计算机科学中的【Client-Server 结构】一词,两者语意有些不同。一般而言,Server 指的是在网络上提供某种服务的程序,如 FTP、HTTP、BBS、Email 等 Service;而 Client 则是向这些 Servers 要求服务的程序,像是 Browser、Email Client (pine、kmail) 等等的。而在 X Window System 中,X Client 指的是可在网络上任何计算机上执行的各种应用程序,他们的执行结果必须传到某个屏幕显示器上,而负责将执行结果缯制到屏幕上与管理各种系统资源的程序,便是 X Server。
对于写 X Client 的 programmers 来说,X Client 与 X Server 在不同计算机上执行,并不影响程序的撰写的方法。因为 X Client 会从 DISPLAY 这个环境变量取得 X Server 的位置,在执行时期才决定应该将执行结果传给哪一个 X Server。这些都是因为使用 X Protocol 的关系,X Protocol 使得 X Server 与 X Client (也许是在本地机器上,也许在网络上) 的实际位置变成透明的 (programmer 看不见,也不须知道),这种特性我们称之为「网络透明」(Network Transparent)。
还有一点值得注意,大部份的窗口系统都与底层的操作系统习习相关,没有底层的操作系统就不能存活,但是 X 不是操作系统的一部份,我们可将 X 安装在各种操作系统上,如 UNIX 系列 (FreeBSD、 Linux 等等),IBM OS/2、Microsoft Windows 甚至 DOS 都可以。因此,更能充分利用与分享各平台上的 server 与 client 资源。
Display 与 Screen
从前面的说明我们已经知道,所谓的 X Server 就是 Display Server,它主要负责图形缯制与讯息事件的处理。接下来要介绍的也是 X Window System 另一个特别的功能:「一个 Display Server 可以控制多个 Screen (屏幕显示器) 的输出」。笔者直接以下图来说明:
图四
从图中可看出,如果你有多个 Screen (屏幕显示器),你就可控制 Display Server,叫它把 X Clients 的执行结果输出到任一个 Screen 上。Screen 的编号都是从 0 开始,如果你只有一台计算机、一个屏幕,那就只会有 Screen 0 了。
甚至,你还可在同一台计算机上跑多个 X Server,这对使用其它窗口系统 (例如 Microsoft Windows) 的使用者可能很觉得会疑惑,但熟悉 Linux/FreeBSD 系统的人,一定都知道 UNIX 系统上有多个 Virtual Terminal 可用。一样的道理,当你激活 X Server 时,X Server 会占用 tty7 这个 Terminal,如果你再激活第二个 X Server,那它就会使用 tty8 Terminal。激活第二个 X Server 的方法如下 (Display Number 也和 Screen Number 一样从 0 开始算起,所以指令参数会是 :1):
xinit -- :1
或是:
startx -- :1
之前提到,xinit script 除了激活 X Server 外,还会顺带执行 xterm 这个应用程序;而 startx script 则除了激活 X Server 外,还会根据你的环境设定文件去设定一些系统资源 ,像是字形、颜色、语系设定及激活指定的应用程序与预设的 Window Manager 等 (见后述)。如果只想激活第二个 X Server,而不跑任何 X Client,则指令为 X :1;只不过,以这种方式激活单纯的 X Server 后,你只会看到一个灰色的桌面与一个「X」状的鼠标光标,没办法输入指令或执行任何应用程序,此时若要关闭 X Server,请按【CTRL + ALT + BACKSPACE】键。
激活多个 X Server 后,要切换至第一个 X Server 请按 【CTRL + ALT + F7】键,要切换至第二个 X Server 的方法则为【CTRL + ALT + F8】键,以此类推。
The Window Manager
在 X Window System 中,Window Manager 是个很重要的一个 X Client 应用程序。所谓的 Window Manager ,顾名思义就是负责管理其它窗口 (X Clients) 的程序,包括让你移动窗口,放大、缩小窗口,并且会为每个窗口加上一些一致性的外观装饰 (decorations:标题列、缩小、放大图标等装饰)。
笔者认为,读者从上面的文字中,可能还是无法弄清楚到底什么是 Window Manager,不过我们倒是可以反过来,尝试看看没有跑 Window Manager 时,会是怎样的情况。很简单,试试执行 xinit script 来激活 X Server 与 xterm,结果会如图二一般,只看到个简陋到极点的 X Terminal ,连个窗口标题列、选单都没有,也没办法用鼠标来移动窗口。
不要关闭 X Server,在这个 X Terminal 中,输入 fvwm2 来开启 F(?) Virtual Window Manager,结果如图五。继续,我们在图五标题为 ""login"" 的窗口中 (即原来的 xterm,被 fvwm2 做过了装饰),按下【CTRL + C】关掉 fvwm2,然后再输入 kfm 开启 K Window Manager,结果会如图六。我想读者这个时候应该可稍为感觉得到,没有 Window Manager (如图二) 与有 Window Manager (如图五及图六) 之间的差异;如果仔细去比较与实际操作,就会发现两个 Window Manager (fvwm2 及 kfm) 对桌面上各窗口外观装饰 (decorations) 所做的改变,以及操作感觉的不同。
注:读者可用自己系统上的 Window Manager 来测试,不限定用 fvwm2 或 kfm。记住,Window Manager 也是个 client,读者可善用 X 的跨网络特性,联机至其它有 fvwm2 或 kfm 的计算机上,将其执行结果传回。至于将远程 X Client 执行结果传回的方法,请读者参阅相关文件。)
图五
图六
目前已经有非常多套 Window Manager,诸如 fvwm、fvwm95、afterstep、Enlightment、mwm (Motif Window Manager)、Lesstif、WindowsMaker以及 Kwm (K Window Manager) 等等,每一套 Window Manager 都有其特色,可让你的桌面有完全不一样的外观与感觉 (Look and Feel)。在 http://www.plig.org/xwinman/ 中收集了各种 Window Managers 的简介与比较信息,读者不妨上个网去瞧个究竟。
X Programming APIs
Xlib
如果读者有注意的话,在图一的 X Client 方块上应该会看到 Xlib 的字样。The X Library (Xlib) 是 X Window 最低阶的程序设计接口,它在 X Window System 中的角色,就好比 Windows APIs (或说 Windows SDK) 在 Microsoft Windows 的角色一样,算是最接近窗口系统的程序设计接口,Xlib 的功能也只有最基本的缯图和讯息事件的处理。
由于 Xlib 只能使用 C/C++ 语言来写,程序的撰写比较低阶复杂。因此,通常我们都会选择 X Toolkits (GUI Libraries) 来撰写 X 的应用程序。
X Tookits
所谓的 X Toolkits,其实就是 menus、labels、buttons 或是 scrollbars 等「User InterfaceComponents」的函式库,在 X 世界中这些 User Interface Components 都称为「widgets」。
特别的一点,就是 X Toolkits 有很多套可用,比较知名的如 Motif、OpenLook、TCL/Tk 以及 Qt/KDE 与 GTK+/Gnome 等等。这些函式库设计出来的「widget set」各有各的特色,呈现出的外观也不同,所以也算的上是 X Window System 中的一项特色。
关于 XFree86、KDE 与 Gnome
X11R6 与 XFree86
由于许多公司认同 X Window System 的优点,X 系统不断的被设计与改良并更新版本,目前最广为人知的版本为 X11 R6 (X Version 11,Release 6),为工业界的标准。
至于什么是 XFree86,XFree86 网站的说明如下:
The XFree86 Project, Inc is a non-profit organisation that produces XFree86. XFree86 is a freely redistributable implementation of the X Window System that runs on UNIX(R) and UNIX-like operating systems (and OS/2). The XFree86 Project has traditionally focused on Intel x86-based platforms (which is where the ``86 in our name comes from), but our current release also supports other platforms. One of our current goals is to increase the range of platforms that XFree86 runs on.
由此可知,XFree86 主要是给 x86-based 机器用的免费 X Window System,现在的 Linux、FreeBSD 等操作系统也都是与 XFree86 搭配使用居多。
KDE 与 Gnome
首先,容笔者说声「KDE and Gnome are *NOT* just window managers」。许多人一直将 KDE 或 Gnome 当成是 Window Manager,这种说法可以算对,也可以说只对了四分之一。正确的说,KDE 与 Gnome 应该算是 Desktop Environment,而不只是 Window Manager,因为 Window Manager 只是它们的一部份组件而已 (之前读者跑过的 kwm 便是 KDE 内建的 Window Manager)。
所谓的 Desktop Environment ,指的是「提供完整的 X 应用程序、设定工具、容易使用的桌面、开始菜单以及内建 Window Manager 的一整套程序」。最早有 Sun MicroSystems 的 CDE (Common Desktop Environment),而目前 Linux/FreeBSD 系统上普遍流行的 Desktop Environment 则为 KDE (The K Desktop Environment) 与 Gnome (GNU Network Object Model Environment) 这两套。
Desktop Environment 通常都会包含下列几个部份:
项目
说明
Applications
各式各样的应用软件,从一般的文书处理、网络软件、数据库处理工具到程序开发工具等等的。 KDE 附的软件通常都以 K 字母开头,如 Kpackage、Kdevelop、KMysql 等,而 Gnome 的软件则是以 G 字母开头,如 Gedit、GIMP、GnoRPM 等。
Desktop
一致性的桌面,面板工具 (Panel) 以及开始菜单 (Start up Menu) 等。并且在使用者离线时 (logout), Desktop Environment 也会将应用程序的执行状态记录下来,以便在下次使用者登入时恢复,这部份称之为「Session Management」。
Configure Tools
一些方便设定系统各种资源 (桌面环境、硬设备、网络设定以及各种服务器等) 的工具。
Window Manager
Desktop Environment 通常都会内建一个 Window Manager,来管理其它窗口并为窗口加上装饰,通常使用者也可以自行将内建的 Window Manager 换成自己特别喜好的。
OBRs
Object Request Brokers (ORBs) 为对象导向底层架构 (或说是组件环境),它可让程序更容易开发、重复使用与维护。
APIs
Desktop Environment 通常会提供一大套函式库,除了一般用途的函式库外,还包括之前提到的「widget set」函式库,以及用来增加生产效率的 Application Development Framework。
因此 Desktop Environment 都会提供其特别的程序设计接口 (Application Programming Interfaces, APIs),让 programmers 来呼叫其独特的函式库。
结语
本文是以一个 programmer 的观点,来看 X Window System 的各个重要特征,因此读者应该已熟悉 X 上各式应用程序的使用与操作。至于 X Window 的各种资源设定 (字形、窗口、激活环境) 与工具程序的使用办法,笔者也没有太多的着墨,为的只是想点出对 X Programming 有用的重要概念。
把观念先弄清楚会对你日后写程序有很大的帮助,读者也不会在刚开始接触 X Programming,就被一大堆的名词搞得晕头转向。希望读者在看过本文后,能对 X Window System 的【Client-Server 结构】以及【Window Manager】有个深刻的印象,因为他们在日后写 X 程序时,会常常被提到;同时也希望读者在知道【Desktop Environment】的意义后,可以清楚地分辨出哪些是 Window Manager,哪些是 Desktop Environment 。
参考资料
XFree86(TM) Home Page
http://www.xfree86.org/
http://www.fvwm.org/
Virtual Window Manager
Window Managers for X
http://www.plig.org/xwinman/
The K Desktop Environment
http://www.kde.org/
GNOME Project
http://www.gnome.org/
Kenton Lee X Window System Consulting
http://www.rahul.net/kenton/index.shtml
The X Programming APIs
http://mmlab.im.fju.edu.tw/~maa/xwindow/2000/2000011001.htm