歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux綜合 >> Linux資訊 >> 更多Linux >> X WINDOWS 系統使用指南(轉載自清華BBS)

X WINDOWS 系統使用指南(轉載自清華BBS)

日期:2017/2/27 9:48:14   编辑:更多Linux
  xedit.vpaned.row1.Help.background:navy 是一個完整的規格但是將只影響到命名當中的物件名稱的屬性。(本例中, 盡管事實上是大寫的,"Help"是一個成員名稱,它的類別是"Command" 。) 除非你有一些非常特別的需求,最好不要用句點當分隔號,盡量以星號代 替,如此可減少錯誤發生的可能,而且在重寫應用程式時,比較不會受到階層 結構改變的影響。 上述的對應結構解釋了為什麽你可以輸入奇怪的規格,或者resource 和屬性尚未定義:意即一個規格只有當應用程式查詢資料庫才會附著,甚至范 圍的意義也是不足道的 -- 規格對應或不對應到查詢。 15.3.4 當多種Resorce規格對應的居先(precedence) 規則 我們現在有一個非常彈性的方法來指定應用程式的resource,但正因它太 籠統,以致當一個應用程式查詢resources 資料庫時常常有數種規格與之對應, 如何解決呢? 簡單地說,如果同時有超過一個規格對應,則最具體的(specific)一個會 被使用,Resource Manager有一組的居先規則用來決定是否一個規格較另一個 具體。 .使用句號為分隔號較使用星號為具體,例如:*Command.Foreground 較 *Command*Foreground 為具體。 .成員名稱較類別名稱具體,例如:*foreground 較*Foreground 具體。 .指定一個元素較省略它具體,例如:xmh*command*foreground較 xmh*foreground具體。 .元素靠近規格左邊的星號較靠近右邊的具體,例如:xmh*foreground較 *command*foreground具體。 這些規則相當直接,它們大部份可用另一種方法來說明:”如果一個規格 對應到另一個規格而為其子集合者,則前者較後者具體。” 15.3.5 在Toolkit 程式中應用程式Resource 通常一個應用程式使用Resource Manager來定義程式階層中widget的屬性 預設值,但有時需要有和widget不直接相關的設定預設值(或傳值)的能力。 為了達到這點,Toolkit 提供了一個叫做Application Resource的設施, 它和非Toolkit 預設的外表原則相同 -- 應用程式定義了它本身選擇的屬性。 類別名稱也相同,所以事實上這些屬性和一般常見的階層沒有什麽不同。 xman使用到一點這個設施,它讓你能在求助視窗(help window) 指定不同 的本文檔案,是否在主選擇視窗中指定一個你要的視窗,或當程式啟動時直接 進入一個指南頁等。(查看指南頁,在X Default那一節,它會明確地列出它 的”應用程式特定的resources ”)。 15.3.6 Resource和non-toolkit 應用程式 並非所有的程式均使用Toolkit ,但Toolkit 幾乎掌握了所有對一個應用 程式的resource管理,特別是應用程式的widget結構定義了物件和子物件的階 層,並能適當地查詢Resource Manager。但是non-Toolkit 應用程式要如何使 用Resource Manager? 答案是應用程式只需明確地查詢每一個它有興趣的屬性。稍早我們曾說過 Resource Manager對resource無限制,因此應用程式能使用任何它想要的屬性 名稱,只要程式的文件告訴使用者它們在何處,它們就如同其它的應用程式一 樣。 xcalc 應用程式是一個不使用Toolkit 的程式范例,它也利用上述方式掌 握resource規格。 有幾點需要注意: .此種型態的預設值沒有類別。 .程式以類似類別名稱(也就是說,第一個字母大寫)來定義屬性,例如 xcalc 使用Background, Foreground, BorderWidth 等等。 .如果大小寫錯誤,你的規格不會工作,例如:規格 xcalc.foreground:green 會被xcalc 忽略。 .即使這個程式定義的屬性並非階層的一部份,你仍能使用星號當分隔號, 例如: xcalc*Foregroundrange 15.4 Resources 的型態----如何指定值 直到現在我們仍然只看resource規格的”左半邊”,而忽略了值(value) 的部份,或只是用色彩名稱。現在,我們來看一看”右半邊”(值的部份)。 簡單地說,值只是一個傳遞到應用程式的本文字串,和Resource Manager 完全相關,之後,應用程式以此值做它所要做的事。當然,在實際的操作上, 應用程式必須明確地做某些事,而Toolkit 的確也掌握了大多數這一部份的工 作,所以你可獲得一致地介面。 所以當我們以一個Resource值傳遞我們所需時,實際上我們使用少數的型 態,你已看過它們的大部份,你在任何地方均可以resource規格來使用它們: Colours (色彩):我們已廣泛的使用過它們----毋需多做解釋。 Fonts (字型):在一般的方法我們已描述過,在resource規格,你也


可使用通用字元或全名。例如: *Font: *-courier-medium-r-*-140-* xterm*Font: 8*13 xterm*boldFont: 8*13 demo*font: *-courier-medium-r-*-240-* demo*boldFont: *-courier-bold-r-*-240-* 設定一個整體性的預設字型,但使用一個正常的xterm 指定一個明確的一對字 型,和一對被demo應用程式使用的較大的字型。(可用xterm -name demo) Numeric quantities:在不同的情形,例如: xclock*update:30 xclock*update:60 BorderWidth:10 xlogo*Width:120 xterm*saveLines:200 Boolean values:指定"yes" 或"no",你可以使用"yes" 、"on"、"true" 和"no"、"off" 、"false" ,例如: xterm*scrollBar:false xman*bothShown:true Cursor names:指定在/usr/include/X11/bitmaps中包含你所要的游標的 檔案名稱,例如: xterm*pointer Shape:cntr_ptr 注意:如果被指定的游標不包含 "熱點" (hot spot),你可能得到錯誤訊 息。 Geometry spec :全部或部份。 xcalc*Geometry: 180*240-0-0 xcolock*Geometry: -0+0 設定一個計算器的預設尺寸及其啟始位置在右下角,時鐘的啟始位置在右上角。 鍵盤轉換(keyboard translations) :安排特定的字串給一個鍵,或安排 特殊(非印出)動作給鍵或按鈕,這相當的復雜,第17章會全面專門討論它。 Pixmaps :Pixmaps 是像位元映像紋理(texture) 一般的圖樣,像位元映 像或游標一樣的指定它們。當你在單色螢幕上工作時非常方便,一旦為不同類 別的widget設定背景,你便能看到應用程式在何處使用到它們。例如:以下的 resource規格: *Pixmap: mensetmanu; List*backgroundPixmap: scales Box*backgroundPixmap: cntr_ptr Command*backgroundPixmap: sipb 導致你的應用程式看起來很討厭----你得到雜亂的視窗,每一個空間以某 種圖樣填滿----但它們的確在作用,有時這樣做可能會有用,backgroundPixmap 是類別Pixmap的屬性。 15.5 結論 在這復雜的一章中,你看到了什麽是”resource”,和你如何使用它們指 定預設值或其它的值給應用程式,我們勾繪出Toolkit 大致輪廓,和widget的 階層觀念,並說明如何利用widget結構或應用程式的其它物件來設定較大范圍 的預設值。從這裡我們介紹類別的概念,它可以讓你指定物件而無需知道它們 個別的名稱,接著談到Resource Manager和它在資料庫中對應resource規格的 規則以便程式查詢預設值,最後,我們大致說明如何指定它們的值。 本章專注於resources 結構運作的規則,現在是告訴你如何在系統下實際 使用的時候了。在下一章,我們告訴你如何及在何處儲存預設規格,也就是說 ,如何管理我們前述的”resource資料庫”。在這章之後,我們解釋如何使用 resource來定制你的鍵盤。 ===== 第16章 實際的使用Resource 前一章解釋X resources的規則----為什麽需要它們,結構如何工作和 resource規格的格式。本章中繼續討論resources ,但較強調實用性:我們告 訴你如何及何處設定resources 預設值,來影響你的系統的一部份或全部。在 本章結束前,我們將完成一些范例,點出你可能常見的錯誤,並告訴你如何克 服它們。 在這些范例中,我們假設你自己的工作站叫做venus ,並且大部份時間你 是使用它。從venus 的顯示器,你可在遠方的機器saturn和mars上執行client 應用程式且和venus 共享檔案系統;neptune 則不可,我們曾在第4章描述過。 當你在本章中時,記得resource結構是:傳遞資訊給應用程式,通常這些 資訊是用來傳遞一些比較感興趣的預設值(例如色彩和字型),但只要應用程 式取得協調你就能使用這種設施傳遞任何資訊。所以我們一般狀況下傾向於把 ”resource規格””預設值”(defaults)”resource”這三個名詞視為同一含 意。 16.1 在何處儲存resource的預設值 在上一章我們只告訴你輸入resource規格到”一個資料庫”,但未告訴你 如何做。事實上有幾個不同的地方可以儲存預設值:這些”地方”通常是一個 你可以用任何編輯器修改的簡單的文字檔案,但有一個特殊的位置需要特殊的

工具來設定它,我們先很快的給你一個概念,再討論細節部份。 首先它的架構非常的復雜:包含命令列選項總共有八種設定resource方法, 但有兩個重點需要注意: 1 .你最好只使用其中的一或二種設置,只要你做完啟始設定,你將只 須改變預設的設定。 2 .系統是被設計來掌握許多不同模式的工作,和滿足那些在許多顯示器 上工作或在一台顯示器上工作而存取遠方機器的使用者的。 總結來說,這些設置是提供來讓系統盡可能富於彈性,但任何時刻你將只 須存取其中的子集合而已。 16.1.1 設定Resource的八種方法 總共有八種方法設定resource,但它們可分為下面幾類: .應用程式專屬的(Application-specific)resource:resource的表列, 限定檔案只能被特定的應用程式讀取。 .Server專屬的resource:應用設定,不管應用程式在那一種主機上執行。 .主機專屬的設定(Host-specific-setting) :對應用程式在主機上執行 有關的設定,和顯示器無關。 .命令列選項:在執行時期做一次關閉(one-off) 設定。 應用程式專屬的resource -- 方法1 和方法2 Toolkit 程式初始時在和應用程式直接相關的兩個檔案中尋找resource, 這些檔案只能被特定的應用程式讀取: 1 .應用程式--類別(Application-class) resource檔案:這個檔案包含 了機器一般性(site-wide) 對應用程式的類別之預設值,通常為系統 管理者所設定。它的名稱就是應用程式類別的名稱,在標准安裝的系 統中它是儲存在目錄/usr/lib/X11/app-defaults 中,例如xterm 的 相關檔案為: /usr/lib/X11/app-defaults/XTerm 在core版中,有一個相關於Xmh 的此種檔案,觀察此檔案可以看所使 用之設定的型態。 2 .你自己擁有的應用程式專屬的resource檔案:這個檔案的名稱和上述 相同,但它存放在不同的地方----由shell 變數$XAPPLRESDIR所指定 的目錄,如果未定義,則放在home目錄。例如對Xmh 類別的程式,它 的檔案放在下列二者之一: $XAPPLRESDIR/Xmh $HOME/Xmh 你可以使用此種檔案,處理方法1 中你不喜歡的 site-wide檔案使其無 效。 Server專屬的Resource -- 方法3 和方法4 這是對你目前工作的Server(顯示器)做有關的設定。鍵盤的設定通常是 server專屬的(因為不同的顯示器有不同的鍵盤)。另一個server專屬的特徵 為顯示器是彩色或單色。 Resource和這些有關的項目會被所有與這個終端機相關的應用程式應用到, 並且不論應用程式在何主機上執行。(例如,如果你使用的顯示器為單色,則 不管你的應用程式在何處執行,你還是不會要它使用彩色。) 儲存server專屬設定的方法是: 3 .server的RESOURCE_MANAGER性質(property):(你可在12章中XProp 的輸出看到),使用下述的xrdb程式,你可以在server的根視窗的 RESOURCE_MANAGER性質中儲存resource設定。它的優點如下: (a) 你不需編輯任何檔案即可設定預設值。(當你為了了解系統而實 驗系統時特別有用) (b) resource被server掌握,所以不論應用程式在那一部主機上執行, 均能被所有的應用程式應用。在我們的范例中,在neptune 的 情況下特別有用,甚至在不和我們的顯示機器venus 共享檔案系 統時,它仍然自動地選出為了使用此顯示器所必需的resource設定。 4 .你的$HOME/.Xdefaults檔案:(只有在根視窗沒有RESOURCE_MANAGER 性質定義的情況下使用)。如果你對xrdb尚不熟悉,你便可以此檔取 代,但你必須在每一部你執行client應用程式的機器上均設定一個。 主機專屬設定 -- 方法5 和方法6 主機專屬預設值和server專屬相反,不管應用程式所使用機器的終端機為 何,只要應用程式在此主機上執行,均使用主機專屬預設值,你可以用它們來: .讓應用程式在不同的機器上對不同的檔案系統作計算,例如:被一個應 用程式讀取的資料檔案可能在不同的主機上保持不同的位置。 .區分顯示在同一個螢幕上不同的主機的視窗(這些視窗可能由同一個應 用程式執行),例如:你可以要所有在mars機器上執行的xterm 的視窗 為紅色的邊框,而在saturn上執行的視窗為黃邊。 .調高一個相同的應用程式在不同的client機器上版本的差異,例如: xterm 在venus 是標准的MIT 版,但在neptune 機器上是由第三集團修 改過以適應機器結構的產品,這兩版的xterm 可能並不完全相容。 主機專屬Resource儲存在: 5 .由$XENVIRONMENT 來的檔案名稱:如果shell 變數$ENVIRONMENT有被 定義,它會被解釋為一個含有resource設定的檔案之完整的路徑名稱。

6 .你的$HOME/.Xdefaults-thishost 檔案:(當$XENVIRONMENT 未被定 義時使用)。注意它和我們先前的檔案有所不同,它必須附加上主機 名稱,例如,如果你在neptune 執行應用程式而在venus 顯示(假設 RESOURCE MANAGER性質未定義),則server專屬 resource 讀取自: .Xdefaults 而主機專屬resource則是: .Xdefaults-neptune 兩者均在neptune 的家目錄(home Directory)中。 注意:在不同的小節中,我們曾說過類似”server專屬resource讀取自...” 這可能造成誤導:”如果你實際需要,你可以放置任何型態的resource設定到 任何的檔案或資料庫。”我們真正的意思是你應該放置機器特性或不論甚麽的 resource到任何地方,如果你這樣做,你將獲得你需要的動作。 命令列選項 -- 方法7 和方法8 最後,你可以藉著命令列選項設定應用程式的值。通常當你設定預設值時 ,為的是你不需要使用選項為你的程式作X相關的設定。但你實際上可以用它 們來: .一次關閉(one-off) ,例如:你暫時性地在螢幕上需要一個極小的xedit。 .為了區別在相同應用程式中各自的成員,你已看過一個這樣的例子,當 我們使用命令 xterm -name demo 來設定應用程式的成員名稱給demo,將造成以應用程式名稱為demo的 resource取代xterm 的resource。 命令列選項分為下列兩種: 7 .應用程式專屬選項:例如xclock的-chime的xpr 或-scale。 8 .Toolkit 標准選項:所有用到Toolkit 的應用程式均接受一些標准的 命令列選項,我們看過其中的大部份,包括-fg, -bg, -display, -geometry 等等,標准選項的清單在”X Toolkit Intrinsics ”手 冊的2.3 節中。 在其中有一個選項-xrm,重要的足以用一個小節來描述。 Toolkit 標准選項-xrm 大多數一般的resource均能被命令列選項明確地設定,例如你可以用 -bg colour設定視窗背景顏色。但無論如何,有一些resource並沒有符合的選 項。為了克服這點,Toolkit 提供一個 "捕捉遺漏" (catch all) 的選項-xrm (X Resource Manager 縮寫)。 -xrm以一個引數當做resource規格,就如同你在預設值檔案中輸入的相同, 例如:你可以輸入: xclock -xrm "*update:30" 和 xclock -update 30 是相等的。 在同一命令列你可以使用數次-xrm,但每一次只能包含一個resource規格, 例如: xclock -xrm "*update:30" -xrm "*chimen" -xrm的好處在於你可以用它來設定任何resource供應用程式使用,尤其是 那些和命令列選項不符合的resource。其中一些非常有用的像: iconX, iconY:視窗表徵圖左上角x,y 座標的位置。 iconPixmap:被用來當作視窗表徵圖的位元映像的名稱,你可以用它 來指定任何的位元映像當作應用程式表徵圖。(位元映像 為已有或利用bitmap程式建立。)例如:命令 xedit -iconic -xrm "*IconPixmap:cntr_ptr"\ -xrm "*iconX:500"\ -xrm "*iconY:400" 的意義為將xedit 設定以表徵圖開始啟始,表徵圖的左上角 座標為(500,400) (在大多數的顯示器會在螢幕中央),使 用名為cntr_ptr的位元映像來當作表徵圖。 backgroundPixmap:設定用一個位元映像當作背景。 borderPixmap:設定以一個位元映像當作視窗的邊,例如: xclock -bw 20 -xrm "*backgroundPixmap: scales"\ -xrm "*borderPixmap: cntr_ptr" 執行xclock,用一個寬達20個像素的邊框,視窗的背景為魚鱗 (fish-scales) 圖案,邊框則用cntr_ptr的位元映像。 所有的這些resource當然也可用類別指定。(如IconX ,BorderPixmap等等。) 注意:請記住,-xrm只有在程式有用到Toolkit 才可應用。 16.1.2 設定Resource不同方法的摘要 現在我們將如何對一個指定應用程式resource設定的八種方法作一摘要: 應用程式專屬resource:它們被兩個檔案掌握,且僅能被Toolkit 使用, 其中一個檔案通常由系統管理者設定,另一個由你自己設定。 server專屬的resource:不是存在根視窗的RESOURCE_MANAGER性質中,便 是在你的$HOME/.Xdefaults檔案中。 主機專屬resource:如果shell 變數$XENVIRONMENT 有定義的話,存在其

所定義的檔案中,否則在你的$HOME/.Xdefaults-host 檔案。 一次關閉設定:用應用程式的本身命令列選項來設定,和用Toolkit 標准 命令列選項,包含”捕捉遺漏”-xrm. 它們以下列順序處理: if (程式使用Toolkit ) 讀取 /usr/lib/X11/app-defaults/class檔案 (1) 讀取你的 $HOME/class檔案 (2) if (RESOURCE_MANAGER性質被定義) 處理內含的指定 (3) else 讀取你的$HOME/.Xdefaults檔案 (4) if (shell 變數XENVIRONMENT被定義) 讀取所定義名稱的檔案 (5) else 讀取你的$HOME/.Xdefaults-host 檔案 (6) if (程式使用Toolkit ) 處理標准的resource選項,包含-xrm (7) 處理應用程式本身的選項 (8) 現在我們將更詳細的看一個較不熟悉的方法 -- 用來儲存server本身 resource的方法。 16.2 在Server上儲存預設值 -- xrdb 大部份預設值的結構均和檔案有關,當應用程式啟始時,不同的檔案被讀 取且其內容被處理,這種方式的缺點為你希望所有的client在一個特定的 server上使用同一組的預設值,但client所執行的機器上如果沒有一個共同的 檔案系統,你該怎麽辦? 答案是在server本身儲存預設值。X的性質設施是一個具有一般性目的的 結構。(記住,一個”性質(property)”是一小段已知格式資料的名稱,被儲 存在server),指定由server根視窗的RESOURCE_MANAGER性質載入,且當應用 程式啟始時系統會注意此事。當視窗系統啟始時,RESOURCE_MANAGER性質未定 義:如果你要使用這個設施,你必須明確地設定它。 並沒有一個一般性的工具來操作一個性質,所以X提供了一個特殊的程式 來處理resource性質,它就是xrdb(the X Resource DataBase 公用程式)。 16.2.1 xrdb能為你做什麽 為了方便起見,本章剩馀的部份,我們只把RESOURCE_MANAGER性質和它的 內容當成”資料庫”。 xrdb的功能非常簡單,它讓你能: .設定一個新的資料庫。 .看目前有那些resource在資料庫中。 .在現存的資料庫加入一個新的resource。 .完全去除資料庫。 這些是基本操作,且很容易完成。當然也有一些更進一步的功能可以很精 確地讓你控制resource,但我們先來討論基本操作。 16.2.2 使用xrdb的基本功能 xrdb的操作類似大多數Unix的程式:它從一個檔案或標准輸入讀取輸入資 料,並且你可以用命令列選項來控制它的操作模式,它所讀取的輸入是我們曾經看 過的一系列resource設定,不過比較特別的是它把這些設定載入資料庫,讓我們看 一看它主要的功能: 設定一個新的資料庫:輸入下面命令兩者之一: xrdb filename xrdb < filename 用以將一個檔案中的設定載入到一個資料庫中,如果只鍵入xrdb,表示你將由 標准輸入(通常為鍵盤)直接輸入設定,稍後我們將說明xrdb所接受的檔案格 式,但現在先把輸入resource設定當作和.Xdefaults檔案或-xrm引數相同的方 法,例如,你可以用下列的方式定義xclock設定: venus% xrdb xclocks*Background: pink xclock*update: 30 xclock*backgroundPixmap: cntr_ptr <end-of-file> 通常你用一個檔案當作xrdb的輸入,也就是說,xrdb從一個檔案載入預設 值作為你的視窗系統初始化的一部份。如果你很有經驗,直接輸入它的設定也 許容易些。 查看現存資料庫中的內容,輸入命令: xrdb -query 則xrdb將以明白本文格式(plain text format) 印出資料庫的內容(-query可 以縮寫為 -q )。 (你可能記得也可以在根視窗用xprop 來看資料庫的內容,但xprop 的輸 出格式不太靈巧,它給你其它一大堆你不需要的資訊。) 如果需要,你可以抓取xrdb的輸出到一個檔案,編輯它,更改設定後可再 用它當作xrdb的輸入。(下一項功能告訴你一個更好的方法) 注意:查看資料庫,你必須使用選項-query。如果你忽略這個選項而只輸 入xrdb,將造成會清除資料庫,且xrdb在等待你自標准輸入鍵入你 新的設定。 在現存資料庫加入新的設定:加入新的設定到資料庫且不要破壞原有的設 定,使用命令: xrdb -merge filename (-merge可縮寫為-m,如果你省略檔案名稱,xrdb會自標准輸入讀取。) xrdb自指定的檔案中讀取resource設定,並加入現存的資料庫中;對於資料庫 中已存在的resource,如果有新的設定,舊值會為新值取代,否則則不會變動。 完全移去資料庫:如同先前所述,當系統結束時資料庫會自動消失,但如 果你在系統仍在執行時移去資料庫,使用命令:

xrdb -remove 本節介紹xrdb基本的功能,下一節我們介紹當你熟悉系統時,你可能需要 的更進一步的功能。 16.2.3 xrdb的檔案格式 你已知道大多數的格式細節 -- 你可以用標准的resource規格的形式 characteristic: value 上述的格式你已看過多次,但xrdb有兩個額外的規則: 1 .注解(comments):每一行的開頭如果是驚歎號(!)會被忽略,所以 你可以此當作注解。 2 .xrdb預設將它的輸入列傳到C 前處理器。 讓我們進一步看一看前處理器的過程。 xrdb前處理它的輸入列 讓我們看一看一個你可能碰到的典型問題。假設在一般的場景,你使用下 列顯示器: venus 彩色螢幕,正常解析度 saturn 單色螢幕,正常解析度 mars 彩色螢幕,高解析度 以上三者共享一個共同網路檔案系統,當你在一個顯示器上啟動X,你需 要定義預設值來反應顯示器的特徵。例如:在高解析度螢幕你可能需要較大的 預設字型,或是你不需要在單色系統上定義彩色預設值。 如何做呢?讓我們看一看,如果你能使用.Xdefaults-host 檔案:在 .Xdefaults-venus我們包含了彩色指定,而在.Xdefaults-saturn 我們只放入 單色型態的參數。行得通嗎?當然,但是是有限度的:它只能掌握應用程式在 和server相同的機器上執行,如果應用程式在其它的機器上執行會得到它們主 機上的預設檔案。所以如果你使用venus 且在saturn啟始遠方的client,將會 用到.Xdefault-saturn而錯失所有的彩色指定。 你能夠只使用.Xdefault 檔案來區分機器嗎?不能,因為三台主機共享相 同的檔案系統,所以$HOME/.Xdefaults會被venus 獲得也會被其它的機器獲得。 答案是在resource處理程序的某些地方,有一個結構可以分辨出所使用 server的某些特徵。xrdb可以用相當簡單的辦法做到這點,它先定義一些說明 server特徵的C 前處理器符號,而後將它所有的輸入傳遞到前處理器,最後將 處理過的資料載入資料庫。指南頁列出所有的xrdb定義的前處理器的符號,但 在此處我們需要用到的是: X_RESOLUTION=n:n是每公尺長螢幕有多少像素。(根據我們的server,我 們正常解析度的螢幕為每□90個像素,相當於每公尺3454個像素。) COLOR :只有螢幕支援彩色才被定義。 WIDTH,HEIGHT:螢幕的寬度和高度,單位為像素。 圖16-1顯示我們如何在xrdb的輸入檔案使用這些。(我們命名為 $HOME/.Xresources ,稍後我們仍將再度用到。)它可以正確地做到我們所想 要的 -- 它正確掌握了所有我們的顯示器,不論是彩色或高解析度或兩者都有。 一些要點值得注意: ┌—————————————————————┐ │ P197 FIG 16.1 │ │ │ │ 圖16-1 利用前處理器命令的Resource檔案 │ └—————————————————————┘ .你可以使用所有前處理器的功能。例如,我們使用它的表示掌握 (expression-handling) 能力: #if X_RESOLUTION > 3600 .你可以在檔案中任何地方使用前處理器符號,並不只是前面有# 號的列, 例如,當 xload*Width: WIDTH 在venus 上xrdb執行到時,它將會讀取成: xload:Width: 1152 所以由預設值可知,xload 視窗寬度將和螢幕寬度相同,高為80個像素, 且在螢幕的正上方。 注意:大多數Unix前處理器定義了一些和它們機器結構與作業系統相關的 符號,這些可能會干擾到你,特別是Unix通常定義的符號,現在 xrdb定義HOST為顯示器名稱中主機名稱的部份,所以你可能認為你 可以像這樣使用一個resource規格: demo*title: X demo using display HOST 比方在venus 上,預期它相當於: demo*title: X demo using display venus 事實上,在我們的機器上會得到 demo*title: X demo using display 1 原因為顯示器名稱是unix:0.0,所以主機名稱部份為unix,但前處 理器已定義了unix,所以整個解釋的順序為: HOST -> unix -> 1 你可以用xrdb的-u選項來解除符號的定義,用以克服這點,也就是 xrdb -Unix < filename 但即使如此,主機名稱仍為unix,除非你明確地指定顯示器: xrdb -display venus:0 < filename 另一個會產生干擾的范例,如何你輸入規格 xedit*Font: *-sun-screen-* 使用xrdb,現在用一個xrdb -query ,你可以看到在資料庫中實際 地設定: xedit*Font: *-1-screen-*

在我們sun 的機器上,前處理器定義成另一個符號。如果你使用和你的機 器相關的名稱,你可能也會得到相同的效應。(如果你決定不需要前處理器的 功能,你可以用xrdb的-nocpp選項停止它的功能。) 16.2.4 如何將資料庫設定和你的xrdb輸入檔連接在一起 藉著像前述在一個含有大量前處理器命令的檔案執行xrdb,你初始化了資 料庫,在稍後的期間,交談式的使用xrdb,你將對資料庫做大量的更動,現在 你需要記錄這些設定,且將之與原來的輸入檔連接,以備將來之用。 如果你只使用xrdb -query ,你只能獲得目前的設定:所有在輸入檔中的 條件指令列若和現在的server不符則不會被包含。例如在saturn上執行前述的 檔案,則所有色彩和高解析度的設定,均被忽略(當然以 #開頭的也不例外), 為了克服這點,xrdb提供-edit 選項,例如命令: xrdb -edit myresf 連接目前在資料庫中的值到檔案myresf內存在的內容,它藉著比對resource指 定特徵值的部份做到這點:如果在檔案中某一行和資料庫中某一項特徵相同, 則檔案中值的部份會被在資料庫中的值取代,用此方法,所有的以 #開頭的列 和條件設定均會保留在檔案中。 注意:前處理器完全不可以使用-edit 選項,那會導致問題,我們看一 下當我們使用venus ,且以前述檔案初始化資料庫時,會發生什麽 情況,假設我們做了更動: venus% xrdb -merge XTerm*font: *-courier-medium-r-*-140-* <end-of-file> 然後用命令: xrdb -edit myresf 將設定更改的部份放回檔案,我們看到兩件事: 1 .前處理器符號在規格中值的部份會被字面(literal)值取代, 例如: xload*Width: 1152 會被 xload*Width: WIDTH 取代 2 .在規格中只要特性符合,值均會被取代,甚至那些在條件段中 目前尚未應用到的也不例外。例如,在前述檔案,設定 XTerm*font的那兩行(一行在高解析度那段,一行在正常顯示 器那段)都會被更改,即使我們只需要改變正常顯示器也不例 外。 16.3 一些常見的錯誤和如何修正它們 特別是當你對系統是新手的時候,resource看起來相當的復雜。當有些狀 況不能正常執行,而系統無法幫助你查覺是什麽錯誤,或你在何處犯了錯誤, 這裡列出一些常見錯誤的明細,並提出如何修正它們。 .如果你未設定一個應用程式的名稱和類別,確定在你的resource規格之 前加一個星號,(如果你省略這個星號,將沒有任何東西會對應這個規 格)這個錯誤在你使用-xrm時特別常見,例如: xclock -xrm "update:3" (錯誤) xclock -xrm "*update:3" (正確) .並非所有的應用程式均使用Toolkit ,非Toolkit 的程式不使用類別, 且它們的屬性名稱也可能不同。例如,規格 *geometry: 300*400+500+600 對xclock,xlogo 有效,但對xcalc 無效,因它不使用Toolkit ,xcalc 使用屬性名稱Geometry(開頭為大寫的G ),因為在這種情況,Toolkit 類別名稱和xcalc 的屬性名稱相同,所以單獨一個規格 *Geometry: 300*400+500+600 可以對所有這類的應用程式有效。 .你可能在規格中用了錯誤的屬性或Widget的名稱,特別是容易把類別名 稱和成員名稱搞混,例如:以下兩者均錯: xclock*Update: 10 xclock*interval: 10 其它常見的錯誤如: xterm*Text*background:blue 它不能執行的原因為xterm 並未使用Text widget ,xterm 正常的視窗 和Tektronix 的視窗分別使用widget類別 VT100和Tek 。最後,當你 知道一個widget是什麽類別,你可能對成員名稱假設錯誤,不是widget 本身便是其中之一的屬性。試著更換類別名稱來修正這個問題。 .即使你已設定實際的widget和屬性名稱或類別,應用程式可能以不是你 預期的方式使用它們。例如:你可能設定如下: xterm*Width: 40 xterm*Height: 10 意圖用比平常較小的視窗啟動xterm ,但它不能執行,xterm 只能在 Tektronix window應用這些值,無法在正常的視窗。 .你可能所有的設定完全正確,但仍然什麽也沒發生,例如: xmh -xrm "*inc.Label: Include" 是一個正確的方式,執行xmh 並指定label 為inc 盒的必須被"Include"。 但在標准系統的發行版,是沒有任何動作發生的,原因是xmh 有一個應 用程式設定預設值檔案/usr/lib/X11/app-defaults/Xmh ,其中有一行: xmh*inc.label:Incorporate New Mail 這個規格較我們的設定有較高優先。 .將規格 *Width: 200

單獨包含在資料庫將導致大多數的Toolkit 程式啟始失敗,且有一個 訊息說它的"shell widget has zero height or width" 。如果你設定 height和width 二者之一,你必須也設定另外一個。 .如果你用編輯器建立一個resource檔案,你可能省略了最後一個new line 這將導致當你試圖用xrdb載入它時整個檔案均被忽略。為了避免如此, 當載入resource時,用一個命令列像: xrdb resfile; xrdb -query 如果xrdb無法列印出resfile 中的內容,就是有問題了。 .你可能忘了用-xrm選項的引數來獲得resource規格,有時有人會把 resource規格放入一個檔案,而以檔案名稱為-xrm的引數,預期它自此 檔案中讀取resources。 .最後,一個非常人性的錯誤,當你發生問題,你通常會循環動作:編輯 resource檔案... 儲存它... 載入resource到資料庫... 執行應用程式 和看一看發生什麽狀況。”其中載入resource到資料庫”常常會被忽略 以致你更為困惑。 16.4 結論 本章中,你已看過了所有你能設定resource的地方,為何有這麽多種的方 法,如何決定設定放置在何處。你看到如何使用xrdb程式在server實際地儲存 預設值,它們在何處被server所有的client存取,甚至它們可以在遠方的機器 上執行。最後,有一些關於常見錯誤的實際提示,告訴你什麽需要注意。 你現在處於實際使用resources ,和剪裁你的系統適合你的口味,resource 結構功能非常強大且有無限的彈性,所以它可讓你定制任何你需要的事。剛開 始不妨試一些像字型或色彩之類簡單的設定,當你熟於基本的結構時,再轉到 更高水准的例子。 下一章將告訴你如何使用特別形式的resource規格 -- Translations(轉 譯),來剪裁你的鍵盤以適於特別的應用程式。 ===== 第17章 定制你的鍵盤和滑鼠 -- 轉譯 電腦的鍵盤通常含有一些 "特殊功能" (special function)鍵,在此有一 些方法來 "制定"(program)這些特殊功能鍵,使它們能完成特定的功能以適合 你工作的方式。例如,你可以定義一些鍵來輸入那些你常用的命令,或只需按 一個鍵便能夠輸入一些程式的片段。 在X中,你能制定的不只是功能鍵而已,其它一般的鍵和滑鼠的按鈕也都 可制定。對每一個應用程式,你均可指定特別的功能給鍵盤和滑鼠按鈕,或兩 者之組合。 (例如在 xedit中你可以結合SHIFT 鍵和滑鼠的右按鈕來讓你向前 移動一個單字)。 所有使用X Toolkit的程式均允許使用者利用一個被稱之為 鍵盤轉譯 (translations) 的設施來執行此種定義,且此種定義藉著正規的 resources 結構傳遞給應用程式。 (那些不使用X Toolkit的應用程式,同樣 地也可以用相同的設施來制定, 但它們需個別的定義所以不能廣泛地應用,從 現在起,我們假設每當討論有關轉譯的種種,均為對那些使用X Toolkit的應 用程式而言。) 就如同所有的 resources一樣,轉譯是當應用程式執行時才被處置。例如 你可以擁有數個具備不同轉譯設定的 xedit,在同時一起執行。( 你可以讓一 個xedit 適合編輯本文,另一個適合編輯程式碼,而另一個適合編輯文書)。 本章討論轉譯 -- 包刮它們的定義格式,如何將它們設定到應用程式,和 它們所涵蓋功能的范圍。我們首先以實例來介紹,逐漸地導引你看到不同的角 度。而後比較正式和詳細地討論轉譯。最後,我們列出當你使用轉譯時常會碰 到的錯誤,並給你一些如何克服這些問題的提示。 17.1 實際使用轉譯 Toolkit 轉譯結構最簡單的用途便是讓你制定你鍵盤的鍵。例如,當你使 用xterm 為一個執行一般shell 命令的視窗時,你可能希望定義一些特殊功能 鍵來輸入你常用的命令,且希望指定的關系如下: 當我按下這個鍵時... 我希望這個字串被輸入 F1 rm core *.tmp <newline> 利用Toolkit 達到此目的方法為:指定一個值給使用轉譯的widget中的resources 。此值設定應用程式中所必需的定制 (customisation),且被Toolkit 的 Trans- lation Manager (轉譯管理器) 所處理。此 resources屬於類別Translation, 且其成員名稱幾乎一定是translations。 在下一節我們將看到設定到resources 中的值的格式。 17.1.1 如何對一個應用程式指定轉譯 對前述xterm 的例子,我們定義 (在即將被應用程式讀入的resource資料 庫中或一些resource檔案中) 一個規格類似: xterm*VT100*Translations: (contd.) <key>F1: string("rm core *.tmp") 注意:不完整!! 其意為在任何類別 VT100的 xterm widget 中,當鍵 F1 被按下時,插入 字串 "rm core *.tmp")。 不幸的是,並沒有這麽簡單,轉譯管理器會把上面的規格解釋為 "去掉所 有現存的轉譯,且加入... " ,所以所有正常的像 " A鍵是插入一個 A" 這種 系結 (binding)都會消失。為了克服這點,你必需使用一些被稱為 directive (指引)的語法插入在 resource 值之前:

xterm*VT100*Translations: #override(contd.) <key>F1: string("rm core *.tmp") 通常你會希望保持大部份現存的系結,而只是把你明確指定的值覆蓋上去 ,所以你一般都是在你的轉譯表中,指定 #override。 現在這個規格可以開始工作了,藉著啟始一個 xterm且把此規格 (在兩個 單引號 (')中間的部份) 當成選項 -xrm 的引數來測試它: xterm -xrm 'xterm*VT100*Translations: ... 等等' 按下特殊功能鍵 F1,你將看到指定的字串成功的插入,但並未包含新列字元 (newline) ,你可以用一點語法的技巧來克服它,像: xterm*VT100*Translations: #override(contd.) <key>F1: string("rm core *.tmp")string(0xd) 這解釋了以下兩點: 1. string()的作用和它的引數相關。你可以直接輸入本文 (例如 string(lpq)) ,但如果本文包含空白或非字母字元,則必需在本文前後加上雙引號。 如果引數是以 "0X" 開頭,則將其後解釋為十六進位,並插入相對的 ASCII 字元。(例如,0xd是RETURN) 2. 在你指定此功能時可結合一個以上的作用,在上例,我們用到 string() 作用兩次,如果我們知道其它的作用,我們也一樣可以系結起來。 定義許多的轉譯在一起 你可以根據需求在一個表中定義許多的轉譯。假設,我們在前面的轉譯中增加 系結: 當我按下這個鍵時... 我希望這個字串被輸入 F2 lpq-Plpa3 <newline> 對此的轉譯為: <Key>F2: string("lpq-Plpa3")string(0xd) 所以可以將本列加入前面的表中。但是轉譯管理器的格式規則告訴我們必需將 兩個轉譯以 "\n" 分開且獨立成為一列: xterm*VT100*Translations: #override(contd.) <key>F1: string("rm core *.tmp")sting(0xd) \n(cond.) <Key>F2: string("lpq-Plpa3")string(0xd) 以上的形式將造成管理上的困難,你可以藉著包含 "隱藏的新列字元" 來使它 具可讀性一些: (新列字元以倒斜線 ""處理) xterm*VT100*Translations: #override\n\ <key>F1: string("rm core *.tmp")sting(0xd)\n\ <Key>F2: string("lpq-Plpa3")string(0xd) 你可以放置任意多個你所需的 "隱藏的新列字元" , 且幾乎在任何地方均可, 它們只是被忽略而已。 (只要和轉譯管理器相關,甚至你每隔一個單字便使用 一個也沒關系。但千萬不要在一個規格的 resource 特徵部份使用它們,它們 無法被resource manager解釋,也沒有相同的效果。) 如果你感覺有些混淆, 不用擔心。簡單地說,resource結構需要的是要在一列中的一個resource規格 的 "值" 的部份,而轉譯管理器以分開的列來分開 (也就是以\n終結),而使用 者剛好以每一個實際分開的列代表一個意義以增加可讀性,所以規則很簡單: 在除了最後一列的每一個轉譯列均加上一個 "\n"。 17.1.2 轉譯可系結許多型式的作用 上述的 xterm范例,展示了如何能夠當你按下一個鍵時,插入任意的字串。但 轉譯結構的功能比這更多 -- 它可以系結任何widget所提供的作用到按鍵,讓 我們詳細一點地看一下這些作用。 前述的例子,我們在 xterm的 VT100 widget完成了鍵F1和F2在 string() 上的對應。我們將仍以 xterm為例,說明更多的作用。 查閱xterm 的指南頁,在標題KEY TRANSLATIONS 和 KEY/BUTTON BINDINGS 你將發現列有數個作用。我們將定義一個轉譯對應鍵F3到insert-selection() 作用之上,所以我們可以用鍵盤來取代滑鼠,將先前 "剪"下的本文 "貼"出。 指南頁告訴我們此作用需要一個引數,從列出的預設系結,我們可以看出預設 的 "剪貼" 結構為使用 CUT_BUFFER0, 所以我們將CUT_BUFFER0當作引數。我們 的resource規格是: xterm*VT100*Translations: #override\n\ <key>F3: insert-selection(CUT_BUFFER0) 到目前為止,這只是一點小小的便利。然而,假定說你花了許多時間在本文文 件上工作,你用 tbl格式化,你用 nroff在螢幕上預視 (preview)它們,用 troff 排版,且將輸出送到你的一個用過濾器 (filter) 為tr2printer的印表 機上。設定轉譯為: xterm*VT100*Translations: #override\n\ <key>F3: string("ed") insert-selection(CUT_BUFFER0)\

Copyright © Linux教程網 All Rights Reserved