<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                ## 第?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 ``` > [![1](https://box.kancloud.cn/2015-10-12_561bcb76795ae.png)](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 ``` > [![1](https://box.kancloud.cn/2015-10-12_561bcb76795ae.png)](ch19s06.html#xwindowconf21) 設定X進程的啟動參數。例如允許用戶進程 allow-user-xsession > [![2](https://box.kancloud.cn/2015-10-12_561bcb768596e.png)](ch19s06.html#xwindowconf22) X資源文件。許多程序保留了X接口,允許X服務器管理一些視覺選項,例如窗口內的字體,配色等 > [![3](https://box.kancloud.cn/2015-10-12_561bcb94ee26f.png)](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
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看