X Window 系統(tǒng)使用指南--資訊與狀態(tài)程式
第12章 資訊與狀態(tài)程式 第參部 定制系統(tǒng)
第12章 資訊與狀態(tài)程式
在本章,我們將討論一些提供視窗系統(tǒng)本身資訊和目前狀態(tài)的程式。 這包括了檢查系統(tǒng)上視窗各種性質(zhì) (property) 的工具,和一個(gè)觀察X 事件結(jié)構(gòu)是如何工作的程式。
這些程式有下列用途:
.當(dāng)你使用系統(tǒng)時(shí),這些工具程式所提供有關(guān)系統(tǒng)內(nèi)部組織和操作的資訊, 可以幫助你了解發(fā)生了什麼事。
.當(dāng)你要做某種處理時(shí),可以藉著所給的資訊來(lái)確認(rèn)系統(tǒng)的組件。(例如 你必須知道一個(gè)視窗的window-id,才可以用xwd 來(lái)傾印它。)
.你將經(jīng)常把從這些工具獲得的資訊,當(dāng)成定制系統(tǒng)工具程式的輸入(稍 後幾章會(huì)討論)。
12.1 列出你的Xserver的特徵 -- xdpyinfo
xdpyinfo列出有關(guān)你的Xserver和server所控制螢?zāi)恢鞣N項(xiàng)目的資訊, 一個(gè)典型的輸出見圖12-1(一個(gè)server在Sun 3/50單色工作站上執(zhí)行的結(jié)果)。
┌———————————————————┐ │ p134 fig 12.1 │ │ │ │ 圖12-1 典型的xdpyinfo工具程式的輸出 │ └———————————————————┘
12.2 獲取有關(guān)視窗的資訊
有三個(gè)程式可以提供目前在你顯示器上視窗的資訊。它們是從不同的角度 看系統(tǒng):
1. 列印視窗的階層 -- xlswins
2. 對(duì)單一視窗詳細(xì)的資訊 -- xwininfo
3. 列出視窗的性質(zhì) -- xprop
12.2.1 列印視窗的階層 -- xlswins
在第一部曾經(jīng)提過(guò),所有在系統(tǒng)上的視窗被安排成樹狀的階層,根視窗 (也叫背景(background)視窗)在最上層,在其下才是應(yīng)用視窗,每一個(gè)應(yīng)用 視窗可以擁有它自己的子視窗階層。
xlswins 列印出這個(gè)樹狀結(jié)構(gòu),從根視窗或所指定的視窗起至其下所有的 樹狀結(jié)構(gòu),對(duì)每一個(gè)視窗,xlswins 列出視窗的window-id 并用括弧括住它的 名稱(如果有的話),子視窗則在下面的幾行依序以縮入(indent)兩格的方式 列出。下面的圖對(duì)xman應(yīng)用程式列出三個(gè)不同子樹的輸出,藉以展示xlswins 如何剖析系統(tǒng)的結(jié)構(gòu)。
圖12-2a 是xman主選單的樹。你可以看到在應(yīng)用視窗(0X600011)中含有另一 個(gè)視窗(0X600012),而(0X600012)又包含了四個(gè)視窗,不需要知道原始程式, 你也可以猜得到是一種視窗包含著視窗,而對(duì)子視窗做某種管理的情況。
圖12-2b 是xman手冊(cè)頁(yè)(manpage) 視窗的樹。比上一個(gè)例子復(fù)雜一些,而且 也無(wú)法在確定是否在這一頁(yè)手冊(cè)頁(yè)中總共就只有這麼多視窗和子視窗。所以 ...
圖12-2c 這是xlswins 更詳細(xì)的輸出,比上一個(gè)例子需要在命令列中多加 一個(gè) -l 的選項(xiàng),多出來(lái)的訊息為巢狀的深度(第幾層樹)、相對(duì)於父視窗的 幾何座標(biāo)和大小、和視窗左上角距離根視窗的座標(biāo)(也就是螢?zāi)簧系慕^對(duì)座標(biāo)) ,有了這些視窗的座標(biāo),你就能了解它們?cè)谖災(zāi)簧系奈恢茫绻氵€是搞不太 清楚,可以執(zhí)行xwd ,指定xlswins 所輸出的window-id ,在本圖,我們發(fā)覺 視窗(0X60005d)是高而窄的,所以可能是一個(gè)卷動(dòng)棒。我們可以試著用命令:
xwd -id 0x60005d | xwud
結(jié)果的確 xman 卷動(dòng)棒的圖形出現(xiàn)了,這個(gè)命令我們?cè)?.2.1 節(jié)有提過(guò)(只不 過(guò)這一次我們不把輸出送到檔案,而利用導(dǎo)管 (pipe) 的技巧直接當(dāng)成另一程 式的輸入。)你可以用這種方法分析任何視窗。
┌——————————————————┐ │ p136 fig 12.2 │ │ │ │ 圖12-2 三個(gè)xlswins 的輸出 │ └——————————————————┘
注意:并非所有的視窗都可列印出資訊,如果你碰到這種無(wú)資訊可供列印視窗 ,你將獲得類似下面的訊息:
x Protocol error: BadMatch, invalid parameter attributes Major opcode of failed request: 73 (X_GetImage)
為了篇幅的關(guān)系,我們只列出了完整xlswins 輸出的三個(gè)小部份。如果在 你自己已經(jīng)有好幾個(gè)應(yīng)用程式的系統(tǒng)上,你將可以看到uwm 和xterm 選單所相 關(guān)的子樹,或者是與 xmh和 xedit 的命令按鈕相關(guān)的子樹。
12.2.2 關(guān)於單一視窗的詳細(xì)資訊 -- xwininfo
xwininfo能夠針對(duì)特定的視窗給你大量的資訊,你可以藉著命令列的選項(xiàng) 告訴xwininfo你要哪一部份的資訊。圖12-3包含完整的列印輸出(用選項(xiàng)-all)
┌——————————————————┐ │ p138 fig 12.3 │ │ │ │ 圖12-3 典型的xwininfo輸出 │ └——————————————————┘
你可以用和xwd 相同的方法來(lái)指定你感興趣的視窗:
.交談式(預(yù)設(shè)):開始時(shí),xwininfo給你一個(gè)十字線游標(biāo),你可以將 它移到你所需的視窗再碰觸滑鼠按鈕。
.使用命令列選項(xiàng):你可以用選項(xiàng)-root 指定根視窗,或用選項(xiàng)-id window-id 指定其它的視窗。
你所看到的資訊可分為以下幾類:
視窗的window-id :window-id 是視窗系統(tǒng)識(shí)別每一個(gè)視窗的參考,就如 同先前所看到的,幾個(gè)程式(包含xwininfo它本身)給你一個(gè)數(shù)字代 表window-id 。例如你要傾印一個(gè)視窗,你可以先執(zhí)行xwininfo得到 它的window-id,然後將此window-id 做為xwd 的id選項(xiàng)之引數(shù)。
階層的資訊:你可以看到這個(gè)視窗的父視窗的id,幾個(gè)子視窗的id,以及 根視窗的id,在xlswins 中可得到相同的資訊,但在這里只能得到最 近一層子視窗的id,并非整個(gè)子樹。
幾何細(xì)節(jié):視窗的大小和位置,以及它的四個(gè)角的位置。
和server有關(guān)的重建構(gòu)參數(shù):像”gravity ”和”backing store ”這 些狀態(tài)(state) ,當(dāng)視窗改變大小或從被遮蓋的狀態(tài)下重新顯 露出來(lái)時(shí),server需要用到這些參數(shù),這些參數(shù)你自己不會(huì)用到, 但可藉它了解系統(tǒng)如何運(yùn)作。
事件參數(shù):這些參數(shù)也是給server而非給使用者用的。
視窗管理器資訊:在系統(tǒng)概觀中,我們?cè)?jīng)提過(guò)應(yīng)用程式藉著給視窗管理 器一些提示”hints ”來(lái)達(dá)成通訊(這些提示包括應(yīng)用程式所希望視 窗的大小,以及重定大小時(shí)的限制等。),xwininfo在這個(gè)部份的輸 出便是告訴你這些”提示”的資料。Program supplIEd location 為 應(yīng)用程式建議它自己應(yīng)該擺哪里。如果你曾給過(guò)位置,不論是在命令 列或resource file ,都會(huì)在 User supplied location 出現(xiàn),在視 窗大小方面同理可推,resize increments 解釋了為什麼有些視窗( 例如xterm 和xfd )不能把大小定為任意數(shù)目的像素,因?yàn)閼?yīng)用程式 已經(jīng)告訴了視窗管理器在重定大小時(shí)按多少個(gè)像素的倍數(shù)放大或縮小 (xterm 和xfd 它們的大小和所使用的字型有關(guān)),你也可以由這個(gè) 參數(shù)知道目前視窗的位置,所以稍後你可以在同一位置上重建它。
12.2.3 列出視窗的性質(zhì) -- xprop
如同我們?cè)谙到y(tǒng)概觀所提及的,一個(gè)”性質(zhì)”(property)是指一小段有關(guān) 視窗的資料,xprop 讓你列出一個(gè)特定視窗的所有”性質(zhì)”,你也可以列印 一個(gè)字型的性質(zhì)。
你可以經(jīng)由常用的方式來(lái)選擇視窗(碰觸滑鼠按鈕或使用-root 或-id 選項(xiàng)) ,如果是指定字型,則用選項(xiàng)-font fontname。
顯示出來(lái)的格式為:對(duì)每一個(gè)性質(zhì),均有一個(gè)性質(zhì)名稱,在其後用小括弧 括住的為性質(zhì)的型態(tài)或格式,最後則為性質(zhì)的值。大部份你所看到的性質(zhì)型態(tài) 為STRING,性質(zhì)的值用” ”括起來(lái),其它的性質(zhì)型態(tài)的格式是專屬的,從 性質(zhì)的值很容易了解它的意義,對(duì)字型顯示的格式稍有不同,它沒有性質(zhì)型態(tài), 但性質(zhì)的值意義也很明顯。
注意:xprop 的輸出相當(dāng)?shù)膹?fù)雜,我們并不需要了解其所有的內(nèi)容,端視需要而 定。
以下讓我們看看從應(yīng)用視窗、根視窗、字型所獲得不同的輸出:
應(yīng)用視窗的性質(zhì)
圖12-4為xprop 對(duì)一個(gè)應(yīng)用視窗的輸出,有些資訊你已經(jīng)在xwininfo中看 到過(guò),在此處你可以在名為WM_NORMAL_HINTS 和WM_HINTS的性質(zhì)中看到。
┌——————————————————┐ │ p140 fig 12.4 │ │ │ │ 圖12-4 一個(gè)應(yīng)用視窗的性質(zhì)表列 │ └——————————————————┘
其它的性質(zhì)如下:
WM_COMMAND:執(zhí)行啟動(dòng)這個(gè)應(yīng)用程式的命令列,被切成一個(gè)個(gè)用雙引號(hào)括起來(lái)的 單字。
WM_CLIENT_MacHINE :執(zhí)行這個(gè)client應(yīng)用程式的機(jī)器名稱(這個(gè)例子應(yīng)用程 式和server在同一部機(jī)器上執(zhí)行,所以機(jī)器名稱為venus 。)。
WM_CLASS:顯示應(yīng)用程式的instant name和class name,instant name是命令 列中-name 選項(xiàng)的值。
WM_ICON_NAME:應(yīng)用程式的表徵圖所要顯示出來(lái)的名稱(你的視窗管理器必須 能夠支援方可)。
WM_NAME :很奇怪的,這不是應(yīng)用程式的名稱,而是由-title選項(xiàng)指定的視窗 標(biāo)題名稱,有些視窗管理器會(huì)把標(biāo)題名稱顯示在應(yīng)用視窗的標(biāo)題 棒上。
注意:上述命令列中-name 和-title兩個(gè)選項(xiàng)使用得很廣,但它并非通用 (universal) 的選項(xiàng),應(yīng)用程式在撰寫時(shí)必需要使用到X Toolkit(工 具箱)才能把這兩個(gè)選項(xiàng)當(dāng)成標(biāo)準(zhǔn)選項(xiàng)來(lái)用。(參見第15章)
根視窗的性質(zhì)
圖12-5是xprop 對(duì)根視窗的輸出,顯而易見的是,它不會(huì)含有任何視窗管 理器的性質(zhì),因?yàn)橐暣肮芾砥鹘^不可能重新建構(gòu)根視窗。
┌——————————————————┐ │ p141 fig 12.5 │ │ │ │ 圖12-5 根視窗的性質(zhì)表列 │ └——————————————————┘
有趣的選項(xiàng)如下:
RESOURCE_MANAGER:這個(gè)根視窗性質(zhì)是resource結(jié)構(gòu)的輸入源之一,我們將在 第11章詳細(xì)地討論它。
幾個(gè)CUT_BUFFER:當(dāng)你切取一段本文(做剪貼動(dòng)作常用),這段被切取的本文 被放在一個(gè)切取緩沖器(cut buffer)中,這些緩沖器被當(dāng)作是根 視窗的性質(zhì)來(lái)儲(chǔ)存,對(duì)於切取,緩沖器是循環(huán)使用的,例如上次 用5 號(hào)緩沖器,則下次用6 號(hào),接下來(lái)7 號(hào)、0 號(hào)、1 號(hào)等等, 但是黏貼則一定使用上次切取動(dòng)作所用的緩沖器。
字型性質(zhì)
圖12-6列出當(dāng)我們指定*times*bold*-i-*-180-*的字型性質(zhì),大部份的資 訊我們都不需關(guān)心,你可能只對(duì)FULL_NAME 和POINT_SIZE有興趣。
┌——————————————————┐ │ p142 fig 12.6 │ │ │ │ 圖12-6 字型的性質(zhì)表列 │ └——————————————————┘
12.3 觀察X的事件 -- xev
”事件”或多或少驅(qū)動(dòng)著整個(gè)視窗系統(tǒng),所有的輸入,不論是滑鼠或鍵盤, 均由”事件”來(lái)掌握,”事件”也被用來(lái)驅(qū)動(dòng)視窗的重新建構(gòu)和展現(xiàn)。xev 程 式讓你看到當(dāng)不同的動(dòng)作發(fā)生時(shí),會(huì)產(chǎn)生什麼”事件”,以及和”事件”有關(guān) 的資訊。
當(dāng)xev 啟動(dòng),它會(huì)建一個(gè)類似圖12-7的視窗,而在這視窗中,會(huì)開始列出 類似圖12-8的有關(guān)事件的細(xì)節(jié)部份。
┌——————————————————┐ │ p143 fig 12.7 │ │ │ │ 圖12-7 xev 視窗 │ └——————————————————┘
┌——————————————————┐ │ p143 fig 12.8 │ │ │ │ 圖12-8 xev 的輸出 │ └——————————————————┘
由於 xev提供大量的系統(tǒng)內(nèi)部操作細(xì)節(jié),你如果想要”實(shí)驗(yàn)”系統(tǒng),這是一個(gè) 很有用的程式,有兩個(gè)說(shuō)明手冊(cè)上未提到的選項(xiàng)可以影響到xev 的行為:
-bs option:此選項(xiàng)改變xev 對(duì)server是否使用backing store (見第2章), 使用backing store 將減少曝光”事件”的次數(shù)(也就是減少應(yīng) 用程式重新更新它自己視窗的次數(shù)),正確的選項(xiàng)內(nèi)容為always, whenmapped和notuseful 。
-s:使用save-unders (見第2章),也就是說(shuō),要求server保存那些被xev 的視窗遮蓋之視窗的內(nèi)容。
12.3.1 xev 和鍵盤
如果你將指標(biāo)移入xev 視窗且按下你的鍵盤上的某一個(gè)鍵,則一個(gè)(或多 個(gè))鍵盤”事件”會(huì)發(fā)生,”事件”的資訊包含了keycode 和keysym,這是最 容易觀察你的機(jī)器上某一個(gè)鍵是什麼鍵碼(keycode) 的方法:執(zhí)行xev ,按一 個(gè)鍵,xev 便會(huì)給你資訊,這對(duì)定制你的鍵盤非常有用,見18章。
12.4 結(jié)論
本章所述的這些程式,讓你觀察系統(tǒng)的內(nèi)部;獲得它的操作細(xì)節(jié);和它的 視窗及其它成員特定的資訊.對(duì)這些程式本身而言,它們能幫助你了解系統(tǒng), 但它們最大的用途可能是用來(lái)連接那些定制系統(tǒng)的程式。以下的幾章在說(shuō)明如 何定制和設(shè)定你的系統(tǒng),好讓系統(tǒng)更適合你工作的習(xí)慣。
下一章討論處理字型和顏色,及如何使用它們。
