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