歡迎您光臨本站 註冊首頁

X Window 架構概述

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

X Window 架構概述


X Window 架構概述







原文:

《X Window System Architecture Overview HOWTO》

http://www.linuxdoc.org/HOWTO/XWindow-Overview-HOWTO/index.html

Daniel Manrique

roadmr@entropia.com.mx




Translated By Bob

Email:gexbob@gmail.com

Blog:http://blog.csdn.net/exbob

-------------------------------------------------------------------------------------------------







修訂歷史




Revision 1.0.1


2001-05-22


Revised by: dm




一些語法修正,由Bill Staehle指出。




Revision 1.0


2001-05-20


Revised by: dm




初始發行。




本文檔描述了X Window的架構,給出了對於X Window設計的更好理解, 包括X的組件,這些組件結合起來構成的可運行圖形環境,這些組件作為窗口管理器該怎樣選擇,工具包和構件庫,桌面環境。

--------------------------------------------

1. 序言

2. 簡介

3. X Window系統架構:概覽

4. 窗口管理器

5. 客戶端應用

6. 部件庫或工具包

7. 目前為止我們所擁有的

8. 桌面環境的救贖

9. 特定桌面環境

10. 怎麼把它們組合到一起

11. X系統中一天

12. 版權和許可

-------------------------------------------------------------------------




1. 序言

這個文檔的目的是提供一個X-Window系統架構的概述,希望人們更好的理解它為什麼要這樣設計,X的組件是怎樣組合起來形成一個可工作的圖形環境,怎樣選擇這些組件。




我們探討一些經常被提到的概念,如果沒有相關的技術背景,這些概念可能被混淆,例如部件(widgets)和工具包(toolkits),窗口管理器(window managers)和桌面環境(desktop environments)。還提供了一些例子,展示了這些組件在日常使用的應用程序中如何相互作用。




這個文檔故意寫得不太偏重技術,它基於作者的經驗知識,以非技術方式引入,它可以從各種意見中吸取營養,包括更深入的例子和解釋,以及技術上的更正。作者歡迎所有關於這個文檔的問題和意見,Email:roadmr@entropia.com.mx 。




2. 簡介

回到UNIX還是新鮮事物的時代,大約是1970年,圖形用戶介面還是一個奇怪的東西,只被一個實驗室(Xerox's PARC)使用。可是今天,任何操作系統只要想擁有競爭力,就必須有一個GUI子系統。GUI界面提供了良好的易用性。這不是UNIX所關心的,UNIX有它的傳統,某種程度來講,多功能比易用性更好。但是,有幾個原因使得UNIX系統需要有一個GUI。例如,UNIX的多任務特性,在給定的時間內要運行多個程序。GUI提供了多種控制方式,可以在同一時間在屏幕上顯示多個運行的程序。所以,某些類型的信息更適合在圖形界面上顯示(有些甚至只能在圖形界面上顯示,例如pr0n和其他圖形數據)。




歷史上,UNIX有很多學術上的改進。一個好的例子是,70年代末加入了BSD網路代碼,這是加州大學伯克利分校的工作成果。事實證明,X Window系統也是一個學術項目的結果,即MIT的雅典娜項目,它成為了現代UNIX(類UNIX系統)中大部分GUI子系統的基礎,包括Linux和BSD。




從一開始,UNIX就是一個多用戶、多任務的分時操作系統。隨著網路技術的加入,它還允許用戶遠程連接和執行任務。以前,這是通過串列終端或網路連接(telnet)完成的。




當開發UNIX下的GUI系統的時候,這些概念都被加入到了設計中。事實上,X是一個相當複雜的設計,這是經常被提到的一個缺點。可是,正因如此,它才是一個真正多功能的系統,當我們解釋GUI的各個部分在UNIX下是怎樣結合的時候,這些都會變的很清晰。




介紹X的架構之前,簡單介紹一下它的歷史,還有它是如果進入Linux系統的。




X是由雅典娜項目開發,在1984年發行。1988年,一個叫做「X Consortium 」的實體接手X,之後開始處理它的開發和發布。X規範是自由提供的,這個聰明的舉動使X得到了很大程度的普及。下面介紹XFree86是什麼。XFree86是我們在Linux系統上使用的X實體,XFree86也可以工作在其他操作系統上,例如BSD系列、OS/2和其他。儘管它的名字中帶有86,它依然支持其他CPU架構。




3. X Window系統架構:概覽

X被設計為客戶端—伺服器的架構(client-server)。應用軟體作為客戶端,他們通過伺服器進行溝通和發布請求,當然也可以從伺服器接受信息。




X server維護一個獨立的顯示控制器和處理來自client的請求。從這一點上來看,使用這種模式的優點是顯而易見的。應用程序(client)只需要知道怎樣同server溝通,而不需要關注實際圖像顯示設備的細節。最基本的,client會告訴server一些這樣的東西:「畫一條從這裡到那裡的線」,或者「顯示一個文本字元串,使用這個字體,在屏幕的這個位置」。




這與只用圖形庫寫應用沒什麼不同。但是,X模式更進一步。它不限制client和server在同處一台電腦。使用這個協議可以讓client和server通過網路進行溝通,事實上,「進程間通信機制提供了可靠的位元組流」。當然,更好的方法是使用TCP/IP協議。可以看到,X的模式是很強大的。一個經典的例子是,在Cray計算機上運行一個處理器密集陣應用程序,在Solaris 伺服器上運行一個資料庫監視器,在小型BSD郵件伺服器上運行一個E-mail應用,在SGI伺服器上運行一個可視化應用,然後,將以上這些都顯示在我的Linux平台的屏幕上。




目前為止,我們已經看到X server是一個處理實際圖形顯示的東西。由於X server是運行在用戶使用的實際計算機上,它的職責是處理所有與用戶的交互。這包括監聽滑鼠和鍵盤。所有這些信息都要傳達給client,還有對它進行響應。




X提供了一個庫,稱作Xlib,負責處理所有低級的client-server通信任務。很顯然,client調用Xlib中的函數進行工作。




這樣看來,一切都工作的很好。我們有一個server負責虛擬輸出和數據輸入,客戶端應用程序,兩者之間可以通過一種方法互相通信。假設client和server之間有一個互動,client可以讓server在屏幕上分配一指定的矩形區域。作為client,我並不關心我被現實在屏幕的哪個位置,我只是告訴server「給我一個X乘以Y像素大小的區域」,然後調用函數執行類似「畫一條從這裡到那裡的線」,「用戶是否在我的屏幕範圍內移動滑鼠」等等。




4. 窗口管理器

可是,我們沒有提到X server怎樣處理client在屏幕現實範圍內的操作(調用窗口)。顯然,對於任何使用GUI的用戶,對需要對「client windows」進行控制。通常情況下,你可以對窗口進行移動和排列;改變大小;最大化或最小化。那麼,X server是怎樣處理這些任務呢?答案是:不能。




X的設計原則之一就是「只提供機制,不提供策略」。所以,X server提供了一個操作窗口的方法(機制),並沒有說怎樣表現這種機制(策略)。




這些機制和策略可以歸結為:有一個程序的責任是管理屏幕空間。這個程序決定了窗口的位置,為用戶提供了控制窗口外觀、位置和大小的機制,通常還會提供一些「裝飾」,例如標題、邊框和按鈕,這些是我們對窗口本身的控制。這個控制窗口的程序稱作「窗口管理器」。




「窗口管理器只是X的一個客戶端程序——它不是X window系統的一部分,儘管它享有一些特權——所以,窗口管理器不是唯一的,而是有很多,它們提供了不同的用戶與窗口的交互方式和不同的窗口布局、修飾、鍵盤和色調的風格。」




X的架構提供了用於窗口管理器執行這些窗口操作的方法,但確實沒有提供一個窗口管理器。




另外,由於窗口管理器是一個外部元件,可以很容易的根據你的參數設定窗口,例如,你希望它看起來是什麼樣子,你想要它怎樣執行,你想要它出現在哪裡,等等。有些窗口管理器比較簡單和醜陋(例如twm);還有一些是華而不實的;還有介於兩者之間的;fvwm, amiwm, icewm, windowmaker, afterstep, sawfish, kwm, 還有數不清的其他窗口管理器。每一種口味都有對應的窗口管理器。




窗口管理器是一個「meta-client」,最基本的使命是管理其他客戶端程序。大部分窗口管理器會提供一些額外的設施(有些會提供很多)。 可是,有個功能是大部分窗口管理器都有的——啟動應用程序的方法。有些窗口管理器會提供一個命令盒子,你可以在這裡寫標準命令(用於啟動應用程序)。還有一些窗口管理器會提供某種類型的應用程序啟動菜單。這些不是標準配置。由於X沒有制度關於如何啟動應用程序的策略,這項功能在客戶端程序中實施。那麼,通常情況下,窗口管理器所負責的這個功能(個體之間會由差異),它的唯一使命就是如果啟動客戶端應用程序,就像一個程序啟動平台。當然,人們已經寫了大量的「啟動程序」的應用。




5. 客戶端應用

下面讓我們關注一些客戶端程序。假設你想要從頭開始寫一個客戶端程序,並且只用X提供的設施。你很快就會發現,Xlib是漂亮的斯巴達,想要在屏幕上放一個按鈕、文本,或是為用戶提供的漂亮空間(滾動條,單選框),這些事竟是令人恐怖的複雜。




幸運的是,有人為我們提供了一個庫,可以解決這些控制項的編程問題。這些控制項通常稱作「部件」(widget library ),所以,這個庫稱作「部件庫」。我只需從庫中調用一個帶參數的函數就可以在屏幕上顯示一個按鈕。這些部件包括菜單、按鈕、單選按鈕、滾動條和畫布。




「canvas」(畫布)是一個有趣的部件,它是客戶端上的一個子空間,我能在裡面話一些東西。可以理解,我不能直接使用Xlib,那樣會幹擾部件庫,這個庫本身提供了在畫布內畫任意圖像的方法。




由於部件庫確實可以在屏幕上畫各種元素,以及解釋用戶的輸入動作,這個庫要對每個客戶端的外觀和行為負責。從開發者的角度來看,部件庫也有一些API(設置函數),定義了我想要用到的部件。




6. 部件庫和工具包

原始的部件庫是為雅典娜項目開發的,理所當然應該是雅典娜部件庫,也被稱作雅典娜部件。它非常基礎,非常簡陋,安裝現在的標準來看,它的使用方便並不直觀(例如,要移動一個滾動條或滑塊,你不能拖動,你要點擊右邊的按鈕讓它向上滑,或者點擊左邊的按鈕讓它向下滑),正因如此,現在幾乎沒有被使用了。




像窗口管理器一樣,考慮到不同的設計目的,工具包(toolkit)也有很多種。最早的工具包之一是著名的Motif,這是開發軟體基金會(OSF)的Motif圖像環境的一部分,由一個窗口管理器和一個匹配工具包組成。OSF的歷史超出了本文檔的討論範圍。Motif工具包優於雅典娜部件,在80年代和90年代初使用廣泛。




這些年,Motif不是一個受歡迎的選擇。它不是免費的,如果你想要一個開發許可證(即用它編譯你自己的程序),你需要向OSF Motif繳費,儘管可以發布一個針對Motif的二進位連接。至少對於Linux用戶來說,最知名的Motif應用可能就是Netscape Navigator/Communicator。




有一段時間,Motif是唯一正常可用的工具包。有很多軟體圍繞著Motif。於是人們開始開發替代品,產生了豐富的工具包,例如XForms, FLTK等等。




已經有些時間沒有聽到Motif了,特別是在自由軟體世界。原因是:就許可、性能(Motif被普遍認為像一頭豬)和功能而言已經有了更好的替代品。




有一個知名並廣泛使用的工具包是Gtk,它是GIMP項目專門設計用來替代Motif的。Gtk現在非常流行,因為它相對較輕,功能豐富,可擴展,而且完全免費。GIMP的0.6發行版的更新日誌里包含了「Bloatif has been zorched 」,這句話是給Motif的臃腫的遺囑。




另一個目前很流行的工具包是Qt。直到KDE項目的出現,它才開始出名,KDE利用了Qt的所有GUI元素。當然,我們不會深入Qt的許可問題和KDE/GNOME的分離性。Gtk說來話長,因為它的歷史伴隨著Motif的替換而變的很有趣。Qt沒什麼可說的,因為它真的很流行。




最後,另一個值得一提的替代品是LessTif,這個名字是對於Motif的雙關語,LessTif的目標是成為免費的,兼容Motif API的替代品。並不清楚LessTif的目標已經達到了怎樣的程度,倒不如幫助那些使用Motif代碼的應用,在它們想要移植到其他的工具包時,有個一個免費的替代品。




7. 目前為止我們所擁有的

現在,我們已經知道,X有一個client-server架構,我們的應用程序就是client。在這個client-server架構的圖形系統下,有多種可選的窗口管理器,它管理著我們的屏幕空間。client是我們真正完成工作的地方,而且,可以使用不同的工具包進行客戶端編程。




困境就從這裡產生了。各種窗口管理器使用各自不同的方法管理客戶端,它們的功能和外觀各不相同。同樣的,由於每個客戶端使用不同的工具包,它們的外觀和性能也會不同。由於沒有人說作者必須用同一個工具包寫應用程序,下面這種情況很可能在用戶運行程序是出現,比方說,六個不同的應用,都使用不同的工具包,那麼它們的外觀和性能也不同。這是由於應用之間的功能不一致而造成的困境。如果你一直使用一個用雅典娜組件寫的程序,你會注意到,它和用Gtk所寫的程序不太一樣。通過使用這些外觀和體驗差別很大的應用,會讓你記住是一個困境。這基本上否定了一個GUI環境的優勢。




從技術角度來看,使用多種不同的工具包會增加對資源的佔用。現代操作系統都支持動態鏈接庫。這意味著,如果我有兩三個使用Gtk的應用程序,還有一個Gtk動態鏈接庫,那麼這幾個應用程序將共享這個Gtk。這樣就節省了資源。另一方面,如果我有一個Gtk應用,一個Qt應用,一些基於雅典娜的程序,一個基於Motif的程序(例如Netscape),一個使用FLTK的程序,還有其他一些使用XForms,那我就要在內存中載入六個不同的庫,每個庫還要有一個不同的工具包。請記住,這些工具包提供的功能基本相同。




還用另外一些問題。每一種窗口管理器的啟動程序的方式是不同的。有些窗口管理器有漂亮的啟動程序菜單;有些則沒有,它們希望我們打開一個程序啟動箱,或者使用一個組合鍵,要不就是打開一個xterm,然後調用命令啟動你的程序。所有,困境就是因為沒有一個標準。




最後,我們的計劃沒有覆蓋到一些GUI環境的細節。例如有效的配置,或者「控制面板」;還有圖形文件管理器。當然,這些可以寫成客戶端應用。在典型的自由軟體時尚中,有數百種文件管理器,數百種系統配置程序,可以想象,處理這些不同的軟體組件將是更大的困境。




8. 桌面環境的救贖

先說一下桌面環境的概念是怎麼來的。一個桌面環境應該提供一套設施和指導,用於規範我們之前提到的所有東西,以便我們前面提到的問題最小化。




桌面環境的概念對於Linux來說是新的東西,但是這些東西在其他操作系統(例如Windows和Mac OS)中本來就存在。例如,MacOS,它是最早的圖形用戶介面之一,為整個計算機會話提供了一個非常一致的感觀。再例如,操作系統提供了很多我們前面提到的細節:它提供了一個默認的文件管理器,一個全系統控制面板,還有一個所有應用都使用的獨立工具包(所以它們看起來都差不多)。應用窗口由系統(嚴格的將是窗口管理器)負責管理。最後,還有一套指南告訴開發者應該怎麼表現他們的應用,如何設計外觀和布局,以及根據系統中的其他應用設計外觀。所有這些都是為了保證應用程序的一致性和易用性。




這引出了一個問題,「為什麼X的開發者沒有將桌面環境的事情放在首位?」。這是有道理的;畢竟,這樣就可以避免前面提到的所有問題。答案就是,在X的設計過程中,它的設計者選擇將它設計得儘可能的靈活。比如說,MacOS提供了大多數機制/策略規範,但是他們不鼓勵人們玩弄這些東西,結果就是失去了多功能性,如果我不喜歡MacOS管理窗口的方式,或者工具包沒有提供我需要的功能,我只能怪自己倒霉。X下就不會發生這樣的事,靈活的代價就是更大的複雜性。




在Linux/Unix和X下,一切都歸結於統一和堅持。以KDE為例,KDE包含一個單一的窗口管理器(kwm),負責管理和控制窗口的行為。它用了一個特定的圖形工具包(Qt),以至於KDE應用的控制和外觀都差不多。KDE提供了一套桌面環境庫,這是Qt的擴展,用來完成一些常見的編程工作,例如創建菜單、「關於」框,編寫工具欄,程序間通信,列印,選擇文件,等等。這使得程序員的工作更加簡單,並且標準化。KDE還為程序員提供了一套設計和行為指南,如果每個人都按照指南來做,那麼KDE程序的外觀和操作就會很相似。最後,KDE還為桌面環境提供一些組件,一個啟動器面板(kpanel),一個標準的文件管理器,還有一個配置程序(控制面板),通過它可以全方位的控制計算機環境,比如設置桌面背景和標題欄的顏色。




KDE面板相當於Windows操作系統的任務欄。在這上面可以啟動應用程序,還可以在上面顯示將小程序(applets)。它還提供了大多數用戶都離不開的實時時鐘。




9. 特定桌面環境

我們以KDE為例,但它不是Unix系統上最早的桌面環境。最早的可能是CDE(Common Desktop Environment),OSF的另一個兄弟。根據CDE FAQ:「Common Desktop Environment是Unix的標準桌面,為最終用戶、系統管理員和應用開發者提供一貫的跨平台服務。」可是,CDE沒有足夠豐富的功能和易用性。除了Motif,CDE幾乎在自由軟體世界消失了,最終被更好的平台替代。




在Linux下,最流行的桌面環境是KDE和GNOME,但是不止這兩個。在網上可以輕易的搜索到半打桌面環境:GNUStep、ROX、GTK+XFce、UDE。它們都提供前面提到的基礎功能。GNOME和KDE擁有來自社區和業界的最廣泛的支持,所以它們是最優秀的之一,為用戶和應用程序提供大量的服務。




我們提過在KDE下有很多提供特定服務的組件。作為一個好的桌面環境,GNOME在這方面也一樣。最明顯的差別是GNOME並不要求使用特定的窗口管理器(這方面KDE有kwm)。GNOME一直試圖做到與窗口管理器無關,但是要承認,大多數用戶與他們的窗口管理器聯繫緊密,而強迫他們使用不同的窗口管理器會損害他們的觀眾。GNOME原本青睞Enlightenment窗口管理器,現在它們更喜歡用Sawfish,但是GNOME控制面板一直有一個窗口管理器選擇框。




除此以外,GNOME使用Gtk工具包,並且通過gnome-lib提供了一套高級功能和工具。GNOME有它自己的一套編程方法,可以確保兼容的應用之間行為一致;它提供了一個面板,一個文件管理器(gmc)和一個控制面板(gnome控制中心)。




10. 怎樣把它們組合到一起

每個用戶都可以自由的選擇感覺最好的桌面環境。最終的結果是,如果你使用純kde或純gnome系統,整個環境的感觀就非常一致;並且應用程序之間的溝通會更好。我們不可能在一個應用程序中使用多種不同的工具包。現代Linux桌面環境提供的設備還使用了一些其他的小技術,例如組件架構(KDE有Kparts,GNOME用Bonobo),它允許你在文字處理文檔中嵌入表格或圖表;還有整體列印設備,就像是Windows中的印刷背景;還有腳本語言,可以讓更多的高級用戶編寫程序將多個應用結合到一起,讓它們用有趣的方式進行協作。




在Unix的桌面環境概念中,一個程序可以在多個環境中運行。我可以想象在GNOME中用Konqueror,在KDE中用Gnumeric。它們只是程序而已。當然,一個桌面環境的整體理念是一致的,所以,堅持使用那些你喜歡的環境中的應用是有道理的。但是,如果你想要處理掉一個不太合適的應用,並且不影響環境中的其他部分,你完全可以自由的去做。




11. X系統中的一天

下面是一個例子,在Linux系統的桌面環境中,一個典型的GNOME會話是怎樣運行的。假設它們工作在X之上。




當Linux系統啟動X時,X server啟動並初始化圖形設備,然後等待客戶端的應答。首先啟動gnome-sessiong,並且設置工作會話。一個會話包括我同意打開的應用,它們在屏幕上的位置,等等。然後啟動面板。面板通常出現在屏幕的底部,有點像桌面環境的儀錶盤。我們可以用它來啟動程序,看到正在運行的程序,還可以控制工作環境。然後,窗口管理器會啟動。因為我們正在使用GNOME,無法確定是哪種窗口管理器,這裡假設是Sawfish。最後,文件管理器啟動。文件管理器負責處理桌面圖標。至此,我的GNOME環境就完全準備好了。




到目前為止,所有啟動的程序都是客戶端,都連接到了X server。現在我們看到的X server和client是在同一台計算機上,但是就像我們前面看到的,這不是必須的。




現在,我們可以打開一個xterm來執行一些命令。當我們點擊xterm圖標時,面板會啟動xterm程序。它是一個X client應用,所以,當它啟動時會連接X server並顯示它的界面。當X server為xterm分配屏幕空間時,它會讓窗口管理器(Sawfish)為窗口裝飾一個漂亮的標題欄,並決定它顯示的位置。




讓我們用一下瀏覽器。點擊面板上的Netscape圖標,啟動一個瀏覽器。這個瀏覽器可不是GNOME的設備,它用的是Gtk工具包。所以,它和桌面環境中的其它部分不是特別協調。




接著打開「File」菜單。Motif在屏幕上提供了一個控制器,所以,Motif庫的工作就是適當的調用相關的Xlib,為顯示菜單在屏幕上繪製必要的元素,並且讓我選擇「exit」選項來關閉應用。




現在我們打開一個Gnumeric電子表格。有些時候我需要用到xterm,所以我點擊它。Sawfish檢測到了我的動作,然後對現有的窗口做些改變,將xterm放在了最上層,並且將焦點移動到xterm上面,這樣我就可以在它上面工作了。




之後,我回到電子表格,想要列印這個文檔。Gnumeric是一個GNOME應用,所以它可以使用GNOME環境提供的設備。當我列印時,Gnumeric調用gnome-print庫,連接印表機並且列印。




12. 版權和許可

Copyright (c) 2001 by Daniel Manrique

在自由軟體社區發行的GNU Free Documentation License,Version1.1或之後版本的條款下(不包含不變章節、封面文字和封底文字),授予複製、發布和修改該文檔的許可權。在這裡可以找到許可協議的衣服拷貝。
《解決方案》

謝謝分享
《解決方案》

看著不錯,就是這時間上...
-------------
修訂歷史
Revision 1.0.1
2001-05-22
《解決方案》

請樓主繼續發好貼,支持你

[火星人 ] X Window 架構概述已經有367次圍觀

http://coctec.com/docs/service/show-post-415.html