第15章 定義應用程式的預設選項 -- Resources
大多數的X程式接受命令列選項,以便讓你指定前景和背景的顏色、字型
、起始位置等等。這種需求是有必要的,因為如果你在程式內硬性規定使用某
種字型,而在執行此程式的機器上並沒有這種字型,則將使得程式無法執行,
所以你不應硬性規定某些三數。
當你每次執行程式時不太可能在命令列中指定所有需要的選項,因為有太多種
可能的組合了,所以X提供了一個叫做resources 的一般性結構,用來傳遞預
設的設定給應用程式。當你閱讀指南頁時,你可能已經注意到要你三照resources
,但卻不知道什麽是resources ,我們將在此解釋。
你在系統中幾 所有的定制動作都將運用到resources ,事實上你為一
個應用程式所選擇的每一個選項的設定都要用到resources ,從簡單的項目例
如色彩或字型,到定制你的鍵盤或管理你的顯示器如何工作,它非常的方便,
而且在系統中到處都用得到。
本章我們描述什麽是resources ,及關於它們是如何發展的資訊,接下來
我們描述X Toolkit(工具),它完全地使用到了resources 的結構;然後
告訴你一些resources 工作的細節,你該如何設定它們,及你能用它們設定哪些
型態。
這是相當長的一章,有幾個新的觀念被加進來,一開始會有些困難,但不
需太擔心,原則上resources 結構非常地簡單,只是第一眼看起來好像有許多
"魔術符號" 而已,也許你應該先很快地浏覽一遍,然後再詳細地重讀一遍。
15.1 什麽是resources ?
在X的文獻中,”resources ”有兩種意義。第一種是相當低階的,意指
被server管理或建立而被應用程式使用的東西。視窗、游標、字型等均屬於這
種意義。
另一種意義也就是通常你在指南頁中常看到”resources ”的意義:它是
一種傳遞預設設定、三數和其它值給應用程式的方法。在本章中我們局限於
討論此種意義之resources 。在解釋現行系統如何工作前,先回顧一下X的早
期版本是如何掌握這些功能的,因為現行的結構由此產生。
15.1.1 ”預設”的背景
在X較早的版本,對於像視窗背景顏色、視窗邊界的顏色、應用程式所使
用的字型這類項目你可以輕易地設定其預設值。
預設值的設定方式很直接,你只需指定一個視窗的屬性和它的預設值。例如:
.Border : red
意即所有的視窗均為紅色的邊(除非你在命令列中重新設定邊的顏色),你也
可以把程式的名稱放在屬性之前,則只有被指名的程式才會改變,所以把以下
這個規格
xclock.Border:blue
和先前的規格結合在一起的意義為:預設所有視窗均為紅色的邊,只有xclock
的視窗為藍色的邊。
每當你設定預設值,程式會自動取用該值,所以你 需每次均指定你的選
擇,它讓你依照適合你的工作習慣來使用字型,不論是你要用較小的字型以獲
得更多的資訊顯示,或是用較大的字型以便閱讀,它讓你為特定的應用程式選
擇顏色,你可以定義應用程式的起始位置,所以你可以自行設計一些啟始螢
幕的布置,因為許多的預設值(字型、色彩等)實際上精確的意義為”resources”
,所以”resources ”的意義逐漸擴增為”預設值設定(default setting) ”
或”設定預設選項(setting default options) ”。
15.1.2 Resources 傳遞資訊到應用程式
隨著X的發展,應用程式也隨之擴增,需要有一個設施傳遞大量的資訊到應
用程式以定制或指定它們的行為,而不再只是有關色彩和字型的資訊而已,
例如你可以告訴 xbiff檢查信件的頻率,或定義 xterm的功能鍵(function-key)
12為 入某一特定的字串,或在 xedit中連續碰觸兩次滑鼠中按鈕代表選擇目
前這段本文等等。
所以逐漸地,resource及預設設施已遂一被發展出來,直到目前對於傳遞
任何資訊到一個應用程式已是一個一般性的結構。你可以像文字串一樣地指定
資訊,應用程式會在內部解釋它:例如把這字串當作一個滑鼠按鈕的名稱,或一種顏
色,或由應用程式所發出的一個功能和 "resources"是如何指定的。
這個結構也逐漸地復雜起來以便讓你能正確地指定在何處應用預設值。在
以前,你只能指定所有的程式或某一個特定的程式。現在的系統你可以設定的
預設值如:”終端機視窗的選單選項”或”在所有視窗的標簽”或甚至”除了
xterm以外的所有編輯器視窗按鈕盒中的功能按鈕”。
X Toolkit, 使得resources在使用上有很大的包容性並且增進了應用的
精確度。你需要先了解 Toolkit是什麽,才能適當地使用resource 結構,我
們將在下一節討論。
15.2 X Toolkit
我們先前曾提過,X並不決定使用者介面,它只是提供一些結構,讓應用
程式設計者能組合成任何形式的介面。理論上這是非常合 需求的 -- 它使得
系統擁有一個一般性目的的工具且沒有使用上的限制,但從另外的角度來看,
它有很大的缺點:
.對一個使用者而言,不同的應用程式有不同的介面,不只是難學難記,
且應用程式無法平順地 (smoothly) 相互協調工作(例如無法在視窗之間
做剪貼),你得到的是一群個別的、獨立的程式,而不是一個一致的、
合作無間的系統。
.從程式設計師的立場,意味著基本視窗系統上的每一件事均需從頭做起,
選單、卷動棒、時鐘、功能鈕等等都必須一一生產。甚至在單一的產品,
不同的程式師做了一點稍有不同的事,便會導致許多不相容的情況。
為了克服上述的問題,Toolkit(工具)的方式應運而生。
在某些范圍,Toolkit 會決定使用者介面的形式,但是無論如何,它會盡
量減少這種影響,並讓使用者介面發展者有更多選擇的可能性,Toolkit 被分
為兩個部份:
1. 一組基本的結構和函數用以建構使用者介面的元素,被稱為Toolkit
Intrinsics(內部的工具)。不論是什麽樣的介面,任何工具均需使
用到它,所以我們可以把Toolkit Intrinsics視為”固定的”,也就
是無可替代的。
2. 一組提供特定的使用者介面(或介面的形式)的元素,這些元素被稱
為 widgets (小工具),而Toolkit 的第二部份稱為 widget set (小
工具組),我們認為這是可以替換的,不同的介面提供不同的Widget
Sets ,甚至它們都使用Intrinsics。
下面兩個小節更詳細地說明這兩個部份。
15.2.1 Toolkit 的第一個部份 -- Intrinsics
Intrinsics定義的實體稱為widgets,並提供了所有建立、管理和毀壞widget
所需的設施。理論上,一個widget是一個處理特定動作的使用者介面的元素,實際
上一個widget是X視窗加上規則和功能以決定它的輸入和輸出的動作,也就是
說,它如何對使用者有所反應。
為了幫助解釋widget的觀念,我們將給一點范例,但是請注意!它們並不
是Intrinsics的一部份,而是我們將於下一小節討論的一個特定的widget組的
一部份,在此提出目的只是為了方便。
Command Widget(命令widget):這是一個在螢幕上含有一些文字的長方
形”按鈕”(也就是一個小視窗)。當指標在這個按鈕之上時,它的邊會呈現
高亮度,當一個滑鼠按鈕在這個widget被碰觸時,一個被程式師指定的軟體常
式(routine) 便會被執行。
你已經使用過command widget好幾次了:在xedit 的命令選單和在xman的
主選項視窗。
Scrollbar Widget(卷動棒widget):同樣的,你也已經使用過了好幾次,
在xterm 和xedit 中卷動本文,在xman中卷動本文和目錄列。
Intrinsic 提供了基本的結構,任何一個提供介面的較高階軟體均需要使
用到它,它提供了以下的功能:
.建立和毀壞widget。
.把一群widget當成一個單元(unit)來管理。
.掌握geometry,也就是說位置,包括從最高階(也就是應用程式的 -geometry
選項)到最低階(管理應用程式用到的sub-widget的位置(例如選單按鈕
的位置))。
.掌握”事件”,例如在一個widget中, 當滑鼠按鈕被碰觸時呼叫適當的程
序、管理視窗的曝光 (eXPosure)和掌握鍵盤的輸入。
.管理給resources 和預設的每一個widget。
15.2.2 Toolkit 的第二部份 -- Widget Sets
廣義來說,Intrinsics只提供你建造一個使用者介面的骨架,Widget Set則
實際地提供了一個既定的介面,且不同的widget組提供不同形式的介面,雖然
對任何范圍的需求並無法預防混用widget,但一般仍希 一個系統固定在
一致性的widget set上。
在X core 版上只有一個widget set提供,我們描述於下:
Athena Widget Set (雅典娜widget set)
大部份的M99v core版的應用程式使用Toolkit 和Athena Widget S
選項)到最低階(管理應用程式用到的sub-widget的位置(例如選單按鈕
的位置))。
.掌握”事件”,例如在一個widget中, 當滑鼠按鈕被碰觸時呼叫適當的程
序、管理視窗的曝光 (eXPosure)和掌握鍵盤的輸入。
.管理給resources 和預設的每一個widget。
15.2.2 Toolkit 的第二部份 -- Widget Sets
廣義來說,Intrinsics只提供你建造一個使用者介面的骨架,Widget Set則
實際地提供了一個既定的介面,且不同的widget組提供不同形式的介面,雖然
對任何范圍的需求並無法預防混用widget,但一般仍希 一個系統固定在
一致性的widget set上。
在X core 版上只有一個widget set提供,我們描述於下:
Athena Widget Set (雅典娜widget set)
大部份的M99v core版的應用程式使用Toolkit 和Athena Widget S