歡迎您光臨本站 註冊首頁

從程序員的角度看xwindows

←手機掃碼閱讀     火星人 @ 2014-03-12 , reply:0
  前言

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



[火星人 ] 從程序員的角度看xwindows已經有661次圍觀

http://coctec.com/docs/program/show-post-72408.html