歡迎您光臨本站 註冊首頁

UNIX桌面的背後:理解Xwindow的工作原理

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

 

Xwindow 是非常巧妙的設計,很多時候它在概念上比其它窗口系統先進,以至於經過很多年它仍然是工作站上的工業標準。許多其它窗口系統的概念都是從 Xwindow 學來的。

Xwindow 可以說的東西太多了。下面只分辨一些容易混淆的概念,提出一些正確使用它的建議。
 

分辨 X server 和 X client

這是我被別人問了好多次的問題,我實在不想再對人說一遍了,所以寫在這裡偷個懶,嘿嘿。

很多熟悉 Internet 原理的人首次遇到 Xwindow 的這兩個概念都會搞錯。如果他從一台 Windows 機器上使用 Exceed 通過 XDMCP 登錄到一台 Sun 伺服器,他就說 Exceed 是客戶端(client),而 Sun 機器是伺服器(server)。這就完全搞錯了。

理解了 Xwindow 的工作原理,這個區別就會很明顯。X server 不是指你登錄的那台機器,而是指一個程序,它負責在某台機器上接受客戶的要求,在屏幕上顯示客戶請求的圖形,並且把消息(鍵盤,滑鼠,窗口消息)通知客戶程序。

比如上面例子里的 Exceed 就是一個 X server,它負責控制那台 Windows 機器上的顯示(display),Sun 機器上的程序,xterm, xxgdb, dtwm(CDE的窗口管理器),……是客戶程序。它們通常會使用 TCP 6000 號埠連接 Windows 機器,而Windows機器的 6000 號埠是由 Exceed bind 和 listen 的,怎麼樣,我們的 Internet 專家,Exceed 看起來是一個 server 吧

比如,當你通過 telnet 啟動 Sun 機器上的 xterm,就會在 Exceed 的屏幕上顯示一個窗口。實際發生的事情是: xterm 請求連接 Windows 機器的 6000 號埠,與Exceed 跟 Exceed 連接,然後xterm請求得到資源,然後 xterm 請求在屏幕上顯示一個窗口。

你在 xterm 的窗口裡按下"A"鍵時,Exceed 會把這個事件通知 xterm 進程,然後 xterm 會發送數據報,請求 Exceed, “請在坐標(100,30)處顯示一個字母A,然後在後面顯示一個矩形作為游標。”,這樣你的 xterm 窗口裡就會多顯示一個字母。

這下你理解了嗎?不?那還是自己多用用,體會體會吧。

Xwindow 的網路透明性

剛才那個 Exceed 用戶,他的客戶程序不僅可以運行在那台 Sun 機器上,而且可以運行在網路里其它的機器上,或者在本機上。比如他有可能同時通過 telnet 登錄到幾台 Sun 工作站,幾台 Linux PC,他可以在那些機器上都起動 xterm,在這台 Windows 機器上的 Exceed 上顯示。如果它安裝了 cygwin,他還可以啟動本機上的 cygwin里 的 xterm,用同樣的方式顯示。

如果他使用 xrdb 在本機的 Exceed 設置了 xterm 的樣式,比如背景 midnightblue, 前景 白色,字體 -*-adobe-courier-*,……,那麼,Sun, Linux, cygwin 里的 xterm,雖然沒有經過配置,但是它們知道:“這個 X server 要求我用這個背景色,這個前景色,這個字體……”,它們會在你的屏幕上顯示同樣風格的窗口。

使用滑鼠選擇一段字元,然後就可以在另外的程序里按滑鼠中間,把字元粘貼過去。不論這個程序運行在哪裡。

看看更大的一個圖景:你的屏幕上有三台機器上的 xterm, 兩台機器上的 gvim,兩台機器上的 mozilla 在顯示,而它們都受本機的 FVWM 操縱,它們之間可以隨意進行拷貝粘貼…… 從這裡你可以初步體會到 Xwindow 的網路透明性,它使你方便的操作很多機器。

什麼是窗口管理器?

很多人不知道窗口管理器是怎麼回事。他們認為 Gnome 和 KDE 是窗口管理器,認為窗口管理器就是能夠提供一個工具條,能夠配置桌面背景,能夠設置很多菜單的東西。而其實,窗口管理器只是 Gnome 和 KDE 的一部分,它的主要功能是你平時根本沒有注意,但是卻非常重要的操作。窗口管理器的主要功能是:移動窗口,改變窗口大小,圖標化(最小化)窗口,改變窗口層疊順序……

通常的X客戶程序不需要知道有人想移動它,它只知道乖乖聽窗口管理器的話。如果沒有窗口管理器運行,你的程序會一個堆一個,你沒有辦法操縱被蓋在下面的程序,你只能使用最上面一個程序,而且你不能移動它,你不能改變它的大小。這樣的系統根本不能用!

其實你的窗口上的標題,按鈕,漂亮的邊框,全都是窗口管理器提供的,而不是程序自己的,這樣你用窗口管理器就能改變任何窗口的樣式了。當你點擊關閉窗口的那個按鈕,你其實點擊的是窗口管理器放在你的程序窗口上面的一個小窗口,發現它受到點擊后,窗口管理器就會通知那個程序:“喂!有人想關掉你,你自己準備準備後事,然後退出吧。”

不同的機器在本機顯示的窗口,由窗口管理器統一裝飾和指揮。比如,窗口管理器決定: xterm 窗口上面都應該有四個按鈕,一個在左邊,點擊它會顯示窗口操作菜單,另外三個在右邊,分別是最大化,最小化和關閉。窗口都使用 7pixel 厚的邊框,窗口首次出現的時候首先在桌面上找一個空位置,如果找不到,就找一個能夠最少的遮蓋其它窗口的位置……

這些都是窗口管理器的職責。

Gnome 和 KDE 是什麼?

有人把 Gnome 和 KDE 叫做窗口管理器,甚至還有人把它們叫做 Xwindow。經常看到有人問:“裝哪種 Xwindow 好啊?Gnome 還是 KDE?” 其實你不安裝 Gnome 和 KDE 也可以使用 Xwindow.

Gnome 和 KDE 是“桌面系統”,一種很多程序和函數庫的集合。它們的設計目的是提供一致的方便的操作方式來滿足普通用戶的需要。它們不但包含窗口管理器,還有很多實用程序和應用程序,比如配置程序,工具條,編輯器,繪圖工具…… 其實 Gnome 可以和很多窗口管理器合作,在歷史上,Gnome 使用過的窗口管理器包括 englightenment, sawmill, sawfish, metacity。KDE 的窗口管理器叫做 kwin。

你也知道,設計整整一套應用程序:編輯器,繪圖程序,瀏覽器,…… 是非常不容易的。所以它們肯定是不如專用的編輯器,繪圖程序,瀏覽器的。不過要求不太高的用戶也可以用它們。

用 Xwindow 做一個有趣的試驗

現在我們來做一個試驗來引起你對 Xwindow 的興趣。

很多人離開了 xdm 就不知道怎樣啟動 "Xwindow" 了。其實 Xwindow 的啟動方式很簡單。

首先,啟動你的 X server。在 Linux 下,你可以直接輸入 "X&",讓一個 X server 在後台運行。這樣,一個佔據整個屏幕的布滿斜紋的窗口(根窗口)就出現了。如果是 Exceed 或者 X-win32,你需要把屏幕設置為 "single window" 才能看到這個窗口。

接著,Linux 用戶需要用 xauth 給你的 X server 設置一個密碼,這樣別人就不能非法連接你的 X server。你需要Ctrl-Alt-F1切換到tty1才能輸入這個命令。Exceed 和 X-win32 的用戶不需要這步。以下的例子只用 Linux 作為實例,其它系統的用戶可以依葫蘆畫瓢。

xauth add :0 . `mcookie`

好了,現在你可以試試啟動一個 xterm 到這個 X server 上:

xterm -display :0

按 Alt-F7 切換到 X,你看到了一個不受窗口管理器管理的 xterm。試試移動它呢?再切換到 tty1 啟動另一個 xterm,兩個 xterm 重合了嗎?你怎樣在第一個 xterm 里輸入呢?這樣用起來很痛苦吧?那麼你可以在 xterm 里啟動一個窗口管理器,比如 twm,直接運行 "twm&" 就行了。

你發現xterm的窗口都被加上了標題欄,按鈕和邊框,你現在可以移動它們了。試試把 twm 殺死,看看那些標題欄,按鈕,邊框是不是都消失了?你知道了窗口管理器的作用了吧。

現在告訴你怎樣不用 XDMCP broadcast,繞過 CDE 的登陸界面,而使用 Sun 機器上的 CDE。其實你只需要把剛才那個例子里的 "twm" 換成 CDE 的窗口管理器 dtwm 就行了,或者啟動 dtsession。它們一般在 /usr/dt/bin 下。Sun 還有另外一個窗口管理器叫做 OpenLook, 它在系統里的名字叫做 olwm,你自己找找吧。

現在如果你自己在 Sun 機器上裝一個 FVWM,你知道怎麼繞過 CDE 登錄而啟動 FVWM 了吧?你不需要成為 root 就可以使用你喜歡的FVWM了。

.Xdefaults 文件的作用

弄明白 X 的工作原理后,你就可以使用 .Xdefaults 來配置你的程序了。有人不理解 .Xdefaults 是用來幹什麼的,喜歡用 shell alias 出一些帶有很多參數的命令,或者寫一些 shell script,裡面只有一行帶有很多參數的程序調用,然後他說:“.Xdefaults 沒用。”

其實 .Xdefaults 比起這些辦法有很多好處。首先,幾乎所有的 X 客戶程序都可以從 .Xdefaults 文件得到配置信息,比如前景色,背景色,字體…… 這樣你可以在同一個文件里配置所有 X 程序的樣式,而不用寫那麼多 shell script。

另外,如果你用 xrdb .Xdefaults 把這些配置信息寫入到根窗口的數據結構里,不是本地機器上的 X 程序也會遵守同樣的樣式。比如如果你的 .Xdefaults 裡面有這些內容:

XTerm.background: midnightblue

XTerm.foreground: white

然後你用 xrdb ~/.Xdefaults,那麼所有的 xterm 都會使用 midnightblue 作為背景色,使用白色顯示字元。這些配置,用X術語叫資源(resource)。

有時候你會開很多 xterm 窗口在機器上,它們來自不同的遠程機器,這時候如果它們都用同樣的樣色和字體,你就不容易分辨它們了。比如有一天,我在實驗室的PC機上打開了很多 xterm,它們來自本機,實驗室的 Sun 伺服器,我宿舍的機器和資料庫實驗室一台 HP 伺服器。在我走之前,想關閉本地的機器,我輸入 “shutdown -h now” 在一個我自認是本地的 xterm 上,結果,等了一會兒,我回頭看到機器沒關掉,只是那個 xterm 停止了響應。我一拍腦袋:糟了,我把宿舍的機器給關掉了!

為了避免這種情況,你可以在不同的機器上編輯不同的 .Xdefaults,而不使用 xrdb 在根窗口導入這些配置。這樣不同的機器上的 xterm 使用不同的顏色,你就不容易搞錯了。

怎樣更加深入的了解 Xwindow?

哎喲!我本來想寫很多東西,後來發現要需要寫的實在太多了。我沒那麼多時間,沒辦法,給參考書目吧,你們自己去看。

學習使用 Xwindow 不是學習使用 Gnome,KDE,…… 很多書籍教用戶怎樣使用 Gnome, KDE 的菜單,配置程序…… 結果到了最後用戶還是沒能知道 Xwindow 是怎麼回事。用那些菜單誰不會啊?真是浪費大家時間。

學習 Xwindow,其實最好的一個辦法是看看 Xlib 編程的書籍,你可以在圖書館找到這樣的書,我推薦 O'reily 的那本 Xlib 程序設計書(我忘了名字了),雖然它很老,但是那上面講解的 Xwindow 的工作原理一直都沒有變過。

如果你不會編程序,你可以不看編程的部分而得到很多深入的概念上的認識,比如窗口屬性,字體,顏色,…… 這些東西在你使用 Xwindow 時會有很大幫助。如果你真的要編寫 Xlib 程序,這本書就過時了一點,你最好到 www.x.org 去免費下載最新的 Xlib 手冊來看。

 

(責任編輯:A6)



[火星人 ] UNIX桌面的背後:理解Xwindow的工作原理已經有419次圍觀

http://coctec.com/docs/unix/show-post-73904.html