## 第?19?章?圖形界面
**目錄**
[](ch19.html#id3088822)
[簡介](ch19s02.html)
[架構及原理](ch19s03.html)
[Xserver](ch19s03.html#id3088862)
[Xclient](ch19s03.html#id3088970)
[Xprotocol](ch19s03.html#id3089035)
[窗口管理器](ch19s04.html)
[啟動流程](ch19s05.html)
[Startx](ch19s05.html#id3089269)
[GDM會話](ch19s05.html#id3089388)
[配置文件](ch19s06.html)
[X服務器](ch19s06.html#xserver)
[X客戶端](ch19s06.html#id3089599)
[字體](ch19s07.html)
[freetype 渲染引擎](ch19s07.html#id3089687)
[X核心字體](ch19s07.html#id3089773)
[XFT字體](ch19s07.html#xft-font)
## 簡介
Xwindow 是工作站圖形系統的工業標準,它有多種不同的實現,多數 Linux 系統中使用 Xorg。
當然,Xwindow 有悠久的歷史和傳統,不過那不在我們討論的范圍。您要注意的有兩點:
* Xwindow 和 Xbox 中的“X”意義是不同的, X 只是 W 之后的一個字母,差不多應該這樣理解,Xwindow 是 Window 的接班人 (注意,Window 不是 Windows)
* 同樣,也不要把 Xwindow 說成是 Xwindow`s`,那是一種褻瀆!一切偉大的創造,都應得到應有的理解和尊重
## 架構及原理
Xwindow 使用服務器-客戶端架構。無論本地圖形界面,還是遠程圖形界面,都以同樣的流程工作。這樣便不需要分別進行設計和維護。
```
本地X客戶端 ┐ ┌ 鍵盤
遠程X客戶端 ┼ X協議 ─ X服務器 ─ 驅動程序┼ 鼠標
遠程X客戶端 ┘ └ 顯示器
```
### Xserver
Xwindow 系統服務器端,通過驅動程序(硬件規范)來管理硬件資源。
例如:當我們移動鼠標時,通過驅動程序[[32](ch19s03.html#ftn.id3088878)] ,向 Xserver 發送信息:
??????“向右移動200點,向上移動100點”(向右上移動);“按下左鍵”……
Xserver 作出如下響應:
1. 上一次鼠標停止的坐標為 600,500
2. 向右 200,向上 100。現在鼠標位于坐標 800,600
3. 坐標 800,600 處,為窗口 Firefox 的“關閉”按鈕
4. 根據預設動作,將 “點擊 Firefox 窗口的關閉按鈕” 翻譯為 “關閉窗口 Firefox”
5. 向X客戶端 Firefox 發送一個“退出”消息
6. Xserver 通過顯示子系統(顯卡、顯示器),全程顯示鼠標的位置和移動
* 事實上,向程序發送“退出”信號,通常窗口管理器完成。為了描述方便,這里暫不區分。稍后,我們將向您介紹 [窗口管理器](ch19s04.html "窗口管理器") 的其它一些細節。
### Xclient
Xwindow 系統客戶端,通過 X協議,實現與 Xserver 的交互。例如:
1. Xclient (假設 Firefox) 接收 Xserver 的消息: 輸入焦點在地址欄的范圍內,“linuxtoy.org”,回車
2. Firefox 根據預設動作,將這些消息識別為 “打開鏈接 linuxtoy.org”
3. Firefox 向域名服務器請求 鏈接 “linuxtoy.org”。域名服務器將這個請求轉換為 “http://linuxtoy.org/” 和 IP地址211.148.131.7,發送回 Firefox
4. Firefox 將 “http://linuxtoy.org/”顯示在地址欄(向 Xserver 發送請求,在地址欄位置顯示這個地址)
5. Firefox 向地址 211.148.131.7 請示顯示頁面
6. Firefox 將服務器發送回的頁面顯示在主窗口中
### Xprotocol
Xwindow 系統協議,Xserver 和 Xclient 之間進行通信的規則
* * *
> [[32](ch19s03.html#id3088878)] 大多數的鼠標不需要專門的驅動程序,因為它們符合某一硬件規范,例如:有四個移動方向和三個鍵
## 窗口管理器
Window Manager 是一種特殊的 Xclient。
使用窗口管理器時,Xserver 并不直接與其它 Xclient 通信,而是通過 WM 中轉,當一些消息被定義為 WM 指令時,它們會被攔截。例如 Alt+F4 關閉窗口、拖動標題欄……
消息“打開鏈接 linuxtoy.org”,具體內容如下:
????輸入焦點在地址欄的范圍內,“linuxtoy.org”,回車
Xserver 并不能直接判斷焦點,而是這樣:
1. Xserver 向 WM 發送位置和點擊的信息,WM 根據當前的“焦點策略”確定激活(最上層)的窗口為 Firefox
2. Xserver 將 Firefox 顯示在最上層,高亮顯示它的標題欄
3. 在窗口 Firefox 內點擊地址欄,或者 Ctrl+L,Xserver 將位置信息發送給 WM,WM 再發送給 Firefox
4. Firefox 判斷當前焦點后,顯示一個閃動的文字輸入光標
5. Firefox 將輸入光標通過 WM 發送給 Xserver,Xserver 在屏幕相應位置進行顯示
那么,“窗口管理器”到底能作些什么呢?其實它所作的只有一件事──管理窗口。例如:
* 最上層的窗口會把其它窗口擋住
* 它通常是一個“已激活窗口”,根據不同的“焦點策略”,窗口管理器確定被激活的窗口。
激活窗口標題欄高亮顯示,接收大部分的鍵盤消息和窗口內的鼠標點擊消息。
* 為了美觀和容易分辨,大多數窗口都要有標題欄和邊框。
為了方便,標題欄上還要有一些按鈕,比如:最小化,最大化,關閉(這些按鈕是窗口管理器請求的小窗口)
* 一個窗口可以在另一個窗口旁邊顯示,而不一定完全被遮擋。為了實現這一點,就要控制窗口顯示的位置
* 為了控制窗口的顯示位置,需要將整個屏幕用座標描述,最好的辦法是繪制一個填充整個屏幕的窗口,也就是根窗口。
* 因為根窗口是最大的,所以它可以嚴嚴實實的遮擋任何窗口,為了避免這一點,根窗口永遠在最底層。這很形象的說明了為什么它叫作“根窗口” ……root
* 根窗口不一定只有一個,大多數的窗口管理器可以使用 “工作區” ,來切換顯示多個根窗口
* 根窗口固定位置上通常放置一些其它 Xclient 的窗口,例如底部面板,頂部面板,側面板,程序啟動圖標
* 面板上又可以放一些其它的 Xclient 窗口,如任務條,啟動欄,菜單……
任務條可以以圖標顯示正在運行的任務,還可以作其它的雜活,像自動掛載 USB設備……
## 啟動流程
我們知道 init 是 linux 的根進程,是所有進程的父進程。同樣, xinit 是所有 Xwindow 進程的根進程
### Startx
`startx` 可以在命令行下啟動圖形界面。執行**startx** 命令時,實際執行這一命令:
```
xinit /etc/X11/xinit/xinitrc -- /etc/X11/xinit/xserverrc
```
根據腳本 `/etc/X11/xinit/xserverrc` 啟動 Xserver,同時根據腳本 `/etc/X11/xinit/xinitrc` 啟動指定 Xclient 進程,例如窗口管理器
`/etc/X11/xinit/xserverrc` 以預設的參數運行程序 /usr/bin/X11/X
`/etc/X11/xinit/xinitrc` 腳本則指向 `/etc/X11/Xsession` ,依次啟動 `/etc/X11/Xsession.d` 目錄中的腳本
* 您可以在用戶配置文件 `~/.Xsession` 中定義使用的 WM,它的優先級高于全局配置文件(對于 GDM會話 不起作用)
* startx 啟動時,并不會再進行身份認證。因為它啟動的是 /etc/X11/Xsession.d/gnome-session ,而不是 GDM會話
### GDM會話
許多 Linux 系統啟動時自動進入圖形界面,不需要運行 **startx** 命令
在某些啟動級別中,包含了 gdm 的啟動腳本,例如 : `/etc/rc2.d/S13gdm`
1. 指向 `/etc/gdm/gdm-cdd.conf` 文件,加載預設視覺主題,啟動 `/usr/lib/gdm/gdmgreeter`(登錄屏幕)
2. 用戶身份認證完成后,啟動 `/etc/X11/default-display-manager` 這個文件中設定的默認窗口管理器 /usr/sbin/gdm
gdm 在啟動時,會要求用戶名和密碼,也就是我們看到的登錄屏幕(gdmgreeter)
* `/usr/share/xsessions` 目錄下為所有可用登錄會話的腳本
## 配置文件
### X服務器
X服務器的主要配置文件為 `/etc/X11/xorg.conf`
```
Section "ServerLayout" #布局
Identifier "Xorg Configured" #布局標識
Screen 0 "Default Screen" 0 0 #屏幕標識
InputDevice "Generic Keyboard" #鍵盤標識
InputDevice "Configured Mouse" #鼠標標識
EndSection
Section "Module" #模塊
Load "ddc"
Load "dbe"
Load "dri"
Load "extmod"
Load "glx"
Load "bitmap"
Load "type1"
Load "freetype"
Load "record"
EndSection
Section "Files" #X核心字體路徑
FontPath "/usr/share/X11/fonts/75dpi"
FontPath "/usr/share/X11/fonts/100dpi"
FontPath "/usr/share/X11/fonts/misc"
FontPath "/usr/share/X11/fonts/cyrillic"
FontPath "/usr/share/X11/fonts/100dpi/:unscaled"
FontPath "/usr/share/X11/fonts/75dpi/:unscaled"
FontPath "/usr/share/X11/fonts/Type1"
FontPath "/usr/share/fonts/Chinese/wqy-bitmapfont"
EndSection
Section "Screen" #屏幕
Identifier "Default Screen"
Device "Card0" #指定顯卡
Monitor "Monitor0" #指定顯示器
DefaultDepth 24 #默認色深為24
SubSection "Display" #可用分辨率
Depth 24 #24位色深下可用分辨率
Modes "1280x1024" "1152x864" "1024x768" "800x600" "720x400" "640x480"
………………
EndSubSection
EndSection
Section "Device" #顯卡
Identifier "Card0"
Driver "vesa" #驅動
VendorName "All"
BoardName "All"
EndSection
```
> [](ch19s06.html#xwindowconf11) 默認分辨率為默認色深下的第一個分辨率
#### 配置文件內部結構
```
/
├/ "ServerLayout" 布局
│├ "InputDevice" keyboard 鍵盤
│├ "InputDevice" mouse 鼠標
││
│└/ "Screen" 顯示子系統
│ ├ "Monitor" 顯示器
│ ├ "Device" videocard 顯卡
│
│
├ "Files" 字體
└ "Module" 模塊
```
### X客戶端
在 `/etc/X11/Xsession` 文件中可以發現下列內容
```
OPTIONFILE=/etc/X11/Xsession.options
SYSRESOURCES=/etc/X11/Xresources
USRRESOURCES=$HOME/.Xresources
SYSSESSIONDIR=/etc/X11/Xsession.d
USERXSESSION=$HOME/.xsession
ALTUSERXSESSION=$HOME/.Xsession
ERRFILE=$HOME/.xsession-errors
```
> [](ch19s06.html#xwindowconf21) 設定X進程的啟動參數。例如允許用戶進程 allow-user-xsession
> [](ch19s06.html#xwindowconf22) X資源文件。許多程序保留了X接口,允許X服務器管理一些視覺選項,例如窗口內的字體,配色等
> [](ch19s06.html#xwindowconf23) X進程。可以設置一些啟動時自動運行的程序,也可以用來設定自己的窗口管理器(窗口管理器和桌面環境或者登錄管理器是無關的)
## 字體
### freetype 渲染引擎
作為 Xorg 服務器的一個模塊,freetype 的功能包括讀取 Truetype 字體信息,如大小、分辨率、編碼等,并以之為依據渲染字體 - freetype2.x 相對于 freetype1.x 增加了抗鋸齒等功能 - ( `/etc/X11/xorg.conf` 的 Module 字段中,可以選擇字體渲染模塊 )
freetype 只負責渲染字體。而查找字體,則可以由 X服務器、X客戶端 或者 字體服務器來 完成。找到字體后,使用 freetype 引擎進行渲染
X核心字體
X服務器根據X客戶端的請求(字符編碼),查找字體并進行渲染,然后顯示
Xft字體
X客戶端自行查找字體并進行渲染,X服務器只負責顯示。由于 Xft字體 的渲染在客戶端完成,所以它可以動態的加載,而不需要隨同X服務器一同啟動
字體服務器
當客戶端請求字體時,X服務器將請求轉發到字體服務器,由字體服務器查找字體,并使用 freetype 引擎渲染,將結果傳回X服務器,X服務器進行顯示
### X核心字體
`/etc/X11/xorg.conf` 中可以配置X核心字體的搜索路徑
```
Section "Files"
FontPath "/usr/X11R6/lib/X11/fonts/misc/"
FontPath "/usr/X11R6/lib/X11/fonts/Type1/"
FontPath "/usr/X11R6/lib/X11/fonts/Speedo/"
FontPath "/usr/X11R6/lib/X11/fonts/100dpi/"
FontPath "/usr/X11R6/lib/X11/fonts/75dpi/"
EndSection
```
* 當X客戶端向X服務器請求顯示文字的時候,X服務器會按上面列表的先后順序查找字體。顯示中文時,如果第一個路徑中的字體不包含中文,則查找下面的路徑,直到發現中文字體
* 請將您偏好的字體放在靠前的位置
要使安裝的字體能夠作為X核心字體使用,將字體的安裝路徑添加到上面的列表中,使用 mkfontscale 、 mkfontdir 掃瞄文件夾中的字體,并生成索引,就可以了(建議使用 ttmkfdir 生成 `fonts.scale` ,將其復制為 `fonts.dir` )
字體的選擇及顯示風格,可以修改 GTK1 的配置文件,或者在`Xresources`文件中對程序單獨進行定義
事實上,在我們的日常應用中,X核心字體環境并不常見,使用 GTK1 圖形庫的程序、某些類型的終端……
### XFT字體
Xft字體相關選項在 `/etc/fonts/fonts.conf` 文件中配置
```
<dir>/usr/share/X11/fonts</dir>
<dir>/usr/share/fonts</dir>
<dir>/usr/local/share/fonts</dir>
<dir>~/.fonts</dir>
```
可以使用 **fc-cache** 命令,遞歸掃瞄上面目錄中的字體(包括子文件夾中的字體),建立字體緩存
多數支持 GTK2 或者 Qt 圖形庫的X客戶端能夠使用 Xft字體 渲染技術[[33](ch19s07.html#ftn.id3089930)]
安裝字體,只要將字體拷貝到以上任意目錄, **fc-cache -fv** 刷新字體緩存即可 (選項: **-f** 強制刷新; **-v** 顯示過程)
使用命令 **fc-list** 列出所有可用字體。字體的選擇及顯示風格,可以修改 GTK2 或者 Qt 的配置文件,建議使用圖形界面配置[[34](ch19s07.html#ftn.id3089978)]
* * *
> [[33](ch19s07.html#id3089930)] GTK2 為 Gnome 使用的圖形庫,Qt 為 KDE 使用的圖形庫。相對來說,GTK2 圖形庫在程序的 GUI 設計中更加通用
> [[34](ch19s07.html#id3089978)] 一般情況下,桌面環境中附帶了相關程序,例如 gnome-font-properties
- 開源世界旅行手冊
- 授權
- 致謝
- 序言
- 更新紀錄
- 導讀
- 如何寫作科技文檔
- 部分?I.?氣候
- 第?1?章?GUI? CLI?
- 第?2?章?UNIX 縮寫風格
- 第?3?章?版本號的迷霧
- 第?4?章???Vim 還是 Emacs
- 第?5?章???DocBook 還是 TeX
- 第?6?章?完全用 Gnu/Linux 工作
- 第?7?章?病毒
- 第?8?章?磁盤 分區
- 第?9?章?文件系統
- 第?10?章???發行版介紹
- 第?11?章???編程語言
- 第?12?章?無根的根:無名師的 Unix 心傳
- 部分?II.?地理
- 第?13?章?基礎知識
- 第?14?章?命令系統
- 第?15?章?基本系統
- 第?16?章?軟件管理
- 第?17?章?核心工具集
- 第?18?章?編譯工具鏈
- 第?19?章?圖形界面
- 第?20?章?國際化
- 第?21?章???內核
- 第?22?章?Grub
- 第?23?章?服務器
- 第?24?章?Vim 編輯器
- 第?25?章?Emacs 入門
- 第?26?章?正則表達式
- 第?27?章?docbook 指南
- 第?28?章?Git 版本控制系統
- 第?29?章?ConTeXt 入門指南
- 部分?III.?景觀
- 第?30?章?終極 Shell -- ZSH
- 第?31?章?完美工作站 Archlinux
- 第?32?章?組織你的意念:Emacs org mode
- 第?33?章???Zsh+screen
- 第?34?章???gentoo stage3
- 第?35?章???硬件問題
- 第?36?章???網絡設置
- 第?37?章???自制 LiveCD
- 第?38?章?awesome
- 第?39?章?openbox 工作環境
- 第?40?章???Emacs muse
- 第?41?章???寫作工具鏈
- 第?42?章?使用 lftp
- 第?43?章???Firefox 使用技巧
- 第?44?章???FVWM
- 部分?IV.?地質
- 第?45?章?Unix
- 第?46?章???Gnu
- 第?47?章?軟件業自由之神——Richard Stallman
- 第?48?章?Linux
- 第?49?章?GNOME與KDE的戰爭
- 第?50?章???Vim Emacs
- 第?51?章???年代紀
- 第?52?章?我的選擇
- 第?53?章???補遺