很多人在用 Xwindow,但是他們是在用一些包裝掩蓋下的 Xwindow,那些包裝有些很不穩(wěn)定,占用大量資源,以至于有人說(shuō) Xwindow 是垃圾。其實(shí) Xwindow 是一個(gè)非常出色的圖形系統(tǒng),你應(yīng)該抱怨的是那些不穩(wěn)定的包裝,而不是 Xwindow 本身。
Xwindow 是非常巧妙的設(shè)計(jì),很多時(shí)候它在概念上比其它窗口系統(tǒng)先進(jìn),以至于經(jīng)過(guò)很多年它仍然是工作站上的工業(yè)標(biāo)準(zhǔn)。許多其它窗口系統(tǒng)的概念都是從 Xwindow 學(xué)來(lái)的。
Xwindow 可以說(shuō)的東西太多了。下面只分辨一些容易混淆的概念,提出一些正確使用它的建議。
分辨 X server 和 X client
這是我被別人問(wèn)了好多次的問(wèn)題,我實(shí)在不想再對(duì)人說(shuō)一遍了,所以寫(xiě)在這里偷個(gè)懶,嘿嘿。
很多熟悉 Internet 原理的人首次遇到 Xwindow 的這兩個(gè)概念都會(huì)搞錯(cuò)。如果他從一臺(tái) Windows 機(jī)器上使用 Exceed 通過(guò) XDMCP 登錄到一臺(tái) Sun 服務(wù)器,他就說(shuō) Exceed 是客戶端(client),而 Sun 機(jī)器是服務(wù)器 (server)。這就完全搞錯(cuò)了。
理解了 Xwindow 的工作原理,這個(gè)區(qū)別就會(huì)很明顯。X server 不是指你登錄的那臺(tái)機(jī)器,而是指一個(gè)程序,它負(fù)責(zé)在某臺(tái)機(jī)器上接受客戶的要求,在屏幕上顯示客戶請(qǐng)求的圖形,并且把消息(鍵盤(pán),鼠標(biāo),窗口消息)通知客戶程序。
比如上面例子里的 Exceed 就是一個(gè) X server,它負(fù)責(zé)控制那臺(tái) Windows 機(jī)器上的顯示(display),Sun 機(jī)器上的程序,xterm, xxgdb, dtwm(CDE的窗口管理器),……是客戶程序。它們通常會(huì)使用 TCP 6000 號(hào)端口連接 Windows 機(jī)器,而Windows機(jī)器的 6000 號(hào)端口是由 Exceed bind 和 listen 的,怎么樣,我們的 Internet 專家,Exceed 看起來(lái)是一個(gè) server 吧 :)
比如,當(dāng)你通過(guò) telnet 啟動(dòng) Sun 機(jī)器上的 xterm,就會(huì)在 Exceed 的屏幕上顯示一個(gè)窗口。實(shí)際發(fā)生的事情是: xterm 請(qǐng)求連接 Windows 機(jī)器的 6000 號(hào)端口,與Exceed 跟 Exceed 連接,然后xterm請(qǐng)求得到資源,然后 xterm 請(qǐng)求在屏幕上顯示一個(gè)窗口。
你在 xterm 的窗口里按下"A"鍵時(shí),Exceed 會(huì)把這個(gè)事件通知 xterm 進(jìn)程,然后 xterm 會(huì)發(fā)送數(shù)據(jù)報(bào),請(qǐng)求 Exceed, “請(qǐng)?jiān)谧鴺?biāo)(100,30)處顯示一個(gè)字母A,然后在后面顯示一個(gè)矩形作為光標(biāo)。”,這樣你的 xterm 窗口里就會(huì)多顯示一個(gè)字母。
這下你理解了嗎?不?那還是自己多用用,體會(huì)體會(huì)吧。
Xwindow 的網(wǎng)絡(luò)透明性
剛才那個(gè) Exceed 用戶,他的客戶程序不僅可以運(yùn)行在那臺(tái) Sun 機(jī)器上,而且可以運(yùn)行在網(wǎng)絡(luò)里其它的機(jī)器上,或者在本機(jī)上。比如他有可能同時(shí)通過(guò) telnet 登錄到幾臺(tái) Sun 工作站,幾臺(tái) Linux PC,他可以在那些機(jī)器上都起動(dòng) xterm,在這臺(tái) Windows 機(jī)器上的 Exceed 上顯示。如果它安裝了 cygwin,他還可以啟動(dòng)本機(jī)上的 cygwin里 的 xterm,用同樣的方式顯示。
如果他使用 xrdb 在本機(jī)的 Exceed 設(shè)置了 xterm 的樣式,比如背景 midnightblue, 前景 白色,字體 -*- adobe-courier-*,……,那么,Sun, Linux, cygwin 里的 xterm,雖然沒(méi)有經(jīng)過(guò)配置,但是它們知道:“這個(gè) X server 要求我用這個(gè)背景色,這個(gè)前景色,這個(gè)字體……”,它們會(huì)在你的屏幕上顯示同樣風(fēng)格的窗口。
使用鼠標(biāo)選擇一段字符,然后就可以在另外的程序里按鼠標(biāo)中間,把字符粘貼過(guò)去。不論這個(gè)程序運(yùn)行在哪里。
看看更大的一個(gè)圖景:你的屏幕上有三臺(tái)機(jī)器上的 xterm, 兩臺(tái)機(jī)器上的 gvim,兩臺(tái)機(jī)器上的 mozilla 在顯示,而它們都受本機(jī)的 FVWM 操縱,它們之間可以隨意進(jìn)行拷貝粘貼…… 從這里你可以初步體會(huì)到 Xwindow 的網(wǎng)絡(luò)透明性,它使你方便的操作很多機(jī)器。
什么是窗口管理器?
很多人不知道窗口管理器是怎么回事。他們認(rèn)為 Gnome 和 KDE 是窗口管理器,認(rèn)為窗口管理器就是能夠提供一個(gè)工具條,能夠配置桌面背景,能夠設(shè)置很多菜單的東西。而其實(shí),窗口管理器只是 Gnome 和 KDE 的一部分,它的主要功能是你平時(shí)根本沒(méi)有注意,但是卻非常重要的操作。窗口管理器的主要功能是:移動(dòng)窗口,改變窗口大小,圖標(biāo)化(最小化)窗口,改變窗口層疊順序……
通常的X客戶程序不需要知道有人想移動(dòng)它,它只知道乖乖聽(tīng)窗口管理器的話。如果沒(méi)有窗口管理器運(yùn)行,你的程序會(huì)一個(gè)堆一個(gè),你沒(méi)有辦法操縱被蓋在下面的程序,你只能使用最上面一個(gè)程序,而且你不能移動(dòng)它,你不能改變它的大小。這樣的系統(tǒng)根本不能用!
其實(shí)你的窗口上的標(biāo)題,按鈕,漂亮的邊框,全都是窗口管理器提供的,而不是程序自己的,這樣你用窗口管理器就能改變?nèi)魏未翱诘臉邮搅恕.?dāng)你點(diǎn)擊關(guān)閉窗口的那個(gè)按鈕,你其實(shí)點(diǎn)擊的是窗口管理器放在你的程序窗口上面的一個(gè)小窗口,發(fā)現(xiàn)它受到點(diǎn)擊后,窗口管理器就會(huì)通知那個(gè)程序:“喂!有人想關(guān)掉你,你自己準(zhǔn)備準(zhǔn)備后事,然后退出吧。”
不同的機(jī)器在本機(jī)顯示的窗口,由窗口管理器統(tǒng)一裝飾和指揮。比如,窗口管理器決定: xterm 窗口上面都應(yīng)該有四個(gè)按鈕,一個(gè)在左邊,點(diǎn)擊它會(huì)顯示窗口操作菜單,另外三個(gè)在右邊,分別是最大化,最小化和關(guān)閉。窗口都使用 7pixel 厚的邊框,窗口首次出現(xiàn)的時(shí)候首先在桌面上找一個(gè)空位置,如果找不到,就找一個(gè)能夠最少的遮蓋其它窗口的位置……
這些都是窗口管理器的職責(zé)。
Gnome 和 KDE 是什么?
有人把 Gnome 和 KDE 叫做窗口管理器,甚至還有人把它們叫做 Xwindow。經(jīng)??吹接腥藛?wèn):“裝哪種 Xwindow 好啊?Gnome 還是 KDE?” 其實(shí)你不安裝 Gnome 和 KDE 也可以使用 Xwindow.
Gnome 和 KDE 是“桌面系統(tǒng)”,一種很多程序和函數(shù)庫(kù)的集合。它們的設(shè)計(jì)目的是提供一致的方便的操作方式來(lái)滿足普通用戶的需要。它們不但包含窗口管理器,還有很多實(shí)用程序和應(yīng)用程序,比如配置程序,工具條,編輯器,繪圖工具…… 其實(shí) Gnome 可以和很多窗口管理器合作,在歷史上, Gnome 使用過(guò)的窗口管理器包括 englightenment, sawmill, sawfish, metacity。KDE 的窗口管理器叫做 kwin。
你也知道,設(shè)計(jì)整整一套應(yīng)用程序:編輯器,繪圖程序,瀏覽器,…… 是非常不容易的。所以它們肯定是不如專用的編輯器,繪圖程序,瀏覽器的。不過(guò)要求不太高的用戶也可以用它們。[!--empirenews.page--]
用 Xwindow 做一個(gè)有趣的試驗(yàn)
現(xiàn)在我們來(lái)做一個(gè)試驗(yàn)來(lái)引起你對(duì) Xwindow 的興趣。
很多人離開(kāi)了 xdm 就不知道怎樣啟動(dòng) "Xwindow" 了。其實(shí) Xwindow 的啟動(dòng)方式很簡(jiǎn)單。
首先,啟動(dòng)你的 X server。在 Linux 下,你可以直接輸入 "X&",讓一個(gè) X server 在后臺(tái)運(yùn)行。這樣,一個(gè)占據(jù)整個(gè)屏幕的布滿斜紋的窗口(根窗口)就出現(xiàn)了。如果是 Exceed 或者 X-win32,你需要把屏幕設(shè)置為 "single window" 才能看到這個(gè)窗口。
接著,Linux 用戶需要用 xauth 給你的 X server 設(shè)置一個(gè)密碼,這樣別人就不能非法連接你的 X server。你需要 Ctrl-Alt-F1切換到tty1才能輸入這個(gè)命令。Exceed 和 X-win32 的用戶不需要這步。以下的例子只用 Linux 作為實(shí)例,其它系統(tǒng)的用戶可以依葫蘆畫(huà)瓢。
xauth add :0 . `mcookie`
好了,現(xiàn)在你可以試試啟動(dòng)一個(gè) xterm 到這個(gè) X server 上:
xterm -display :0
按 Alt-F7 切換到 X,你看到了一個(gè)不受窗口管理器管理的 xterm。試試移動(dòng)它呢?再切換到 tty1 啟動(dòng)另一個(gè) xterm,兩個(gè) xterm 重合了嗎?你怎樣在第一個(gè) xterm 里輸入呢?這樣用起來(lái)很痛苦吧?那么你可以在 xterm 里啟動(dòng)一個(gè)窗口管理器,比如 twm,直接運(yùn)行 "twm&" 就行了。
你發(fā)現(xiàn)xterm的窗口都被加上了標(biāo)題欄,按鈕和邊框,你現(xiàn)在可以移動(dòng)它們了。試試把 twm 殺死,看看那些標(biāo)題欄,按鈕,邊框是不是都消失了?你知道了窗口管理器的作用了吧。
現(xiàn)在告訴你怎樣不用 XDMCP broadcast,繞過(guò) CDE 的登陸界面,而使用 Sun 機(jī)器上的 CDE。其實(shí)你只需要把剛才那個(gè)例子里的 "twm" 換成 CDE 的窗口管理器 dtwm 就行了,或者啟動(dòng) dtsession。它們一般在 /usr/dt/bin 下。Sun 還有另外一個(gè)窗口管理器叫做 OpenLook, 它在系統(tǒng)里的名字叫做 olwm,你自己找找吧。
現(xiàn)在如果你自己在 Sun 機(jī)器上裝一個(gè) FVWM,你知道怎么繞過(guò) CDE 登錄而啟動(dòng) FVWM 了吧?你不需要成為 root 就可以使用你喜歡的FVWM了。
.Xdefaults 文件的作用
弄明白 X 的工作原理后,你就可以使用 .Xdefaults 來(lái)配置你的程序了。有人不理解 .Xdefaults 是用來(lái)干什么的,喜歡用 shell alias 出一些帶有很多參數(shù)的命令,或者寫(xiě)一些 shell script,里面只有一行帶有很多參數(shù)的程序調(diào)用,然后他說(shuō): “.Xdefaults 沒(méi)用。”
其實(shí) .Xdefaults 比起這些辦法有很多好處。首先,幾乎所有的 X 客戶程序都可以從 .Xdefaults 文件得到配置信息,比如前景色,背景色,字體…… 這樣你可以在同一個(gè)文件里配置所有 X 程序的樣式,而不用寫(xiě)那么多 shell script。
另外,如果你用 xrdb .Xdefaults 把這些配置信息寫(xiě)入到根窗口的數(shù)據(jù)結(jié)構(gòu)里,不是本地機(jī)器上的 X 程序也會(huì)遵守同樣的樣式。比如如果你的 .Xdefaults 里面有這些內(nèi)容:
XTerm.background: midnightblue
XTerm.foreground: white
然后你用 xrdb ~/.Xdefaults,那么所有的 xterm 都會(huì)使用 midnightblue 作為背景色,使用白色顯示字符。這些配置,用X術(shù)語(yǔ)叫資源(resource)。
有時(shí)候你會(huì)開(kāi)很多 xterm 窗口在機(jī)器上,它們來(lái)自不同的遠(yuǎn)程機(jī)器,這時(shí)候如果它們都用同樣的樣色和字體,你就不容易分辨它們了。比如有一天,我在實(shí)驗(yàn)室的PC機(jī)上打開(kāi)了很多 xterm,它們來(lái)自本機(jī),實(shí)驗(yàn)室的 Sun 服務(wù)器,我宿舍的機(jī)器和數(shù)據(jù)庫(kù)實(shí)驗(yàn)室一臺(tái) HP 服務(wù)器。在我走之前,想關(guān)閉本地的機(jī)器,我輸入 “shutdown -h now” 在一個(gè)我自認(rèn)是本地的 xterm 上,結(jié)果,等了一會(huì)兒,我回頭看到機(jī)器沒(méi)關(guān)掉,只是那個(gè) xterm 停止了響應(yīng)。我一拍腦袋:糟了,我把宿舍的機(jī)器給關(guān)掉了!
為了避免這種情況,你可以在不同的機(jī)器上編輯不同的 .Xdefaults,而不使用 xrdb 在根窗口導(dǎo)入這些配置。這樣不同的機(jī)器上的 xterm 使用不同的顏色,你就不容易搞錯(cuò)了。
怎樣更加深入的了解 Xwindow?
哎喲!我本來(lái)想寫(xiě)很多東西,后來(lái)發(fā)現(xiàn)要需要寫(xiě)的實(shí)在太多了。我沒(méi)那么多時(shí)間,沒(méi)辦法,給參考書(shū)目吧,你們自己去看。
學(xué)習(xí)使用 Xwindow 不是學(xué)習(xí)使用 Gnome,KDE,…… 很多書(shū)籍教用戶怎樣使用 Gnome, KDE 的菜單,配置程序…… 結(jié)果到了最后用戶還是沒(méi)能知道 Xwindow 是怎么回事。用那些菜單誰(shuí)不會(huì)啊?真是浪費(fèi)大家時(shí)間。
學(xué)習(xí) Xwindow,其實(shí)最好的一個(gè)辦法是看看 Xlib 編程的書(shū)籍,你可以在圖書(shū)館找到這樣的書(shū),我推薦 O'reily 的那本 Xlib 程序設(shè)計(jì)書(shū)(我忘了名字了),雖然它很老,但是那上面講解的 Xwindow 的工作原理一直都沒(méi)有變過(guò)。
如果你不會(huì)編程序,你可以不看編程的部分而得到很多深入的概念上的認(rèn)識(shí),比如窗口屬性,字體,顏色,…… 這些東西在你使用 Xwindow 時(shí)會(huì)有很大幫助。如果你真的要編寫(xiě) Xlib 程序,這本書(shū)就過(guò)時(shí)了一點(diǎn),你最好到 www.x.org去免費(fèi)下載最新的 Xlib 手冊(cè)來(lái)看。