<BTn5Motion> Button5 <Motion>
<BtnMotion> 任何按鈕的 <Motion>
作用的格式和作用的表列
每一個轉譯在一或多個作用之上系結一個序列的一或多個事件。在表列中的個
別作用是以空白分開的。 (不可用逗點分開,那將會導致錯誤)。
個別的作用格式如下:
action-name(parameters)
即使沒有參數被指定,在作用名稱 (action-name)後的括弧,仍然不可省略。
例如:
start-selection()
如果在作用名稱和左括弧中間留有空白,你將會得到一個錯誤。
作用名稱只包含了字母、數字、錢號($)、底線(_)四種字元。每一個widget
提供它自己的作用集合 (如果有的話) ,且自我包含這些作用名稱的硬碼
(hard-coded)表列。
參數(parameters)是一個零到多個字元字串的表列,中間以逗點分開。參
數的意義為對特定的作用作指定 (事實上大多數的作用並沒有任何參數) 。參
數字串可以不加引號,例如:
insert-selection(PRIMARY)
或者前後加上雙引號,這種情形通常為參數字串內包含了空白或一個逗點,例
如:
string("plot<x,y>")
沒有一個一般性的方法,讓你在參數字串中的任何位置包含一個雙引號,雖然
像這樣 string(ab"cd)'將雙引號放在字串中間是可被處理的。也沒有一般性的
方法在同一個參數字串中同時包含字串和雙引號。因為如此,有些widget在解
釋它們自己的參數時,可以自行加入它們自己的語法規則。例如:對xterm 的
VT100 widget的 string()作用,如果一個不帶雙引號且開頭為 "0x"的字串,
此字串被解釋為代表一個ASCII 字元的十六進位數。
在此結束我們對轉譯規格及格式的描述。由此,你應有能力了解在不同X
手冊列出的轉譯,且可寫你自己的轉譯。為了幫助你,下節列出你常見的問題
,以及如何克服它們。
17.3 在轉譯規格中常見的問題
轉譯在觀念上簡單,但實際上很混亂。即使你常常使用,語法仍然復雜而難解。
無論如何,如果你是初學者,最好的方式是你以別人的轉譯當作自己的轉譯的
基礎。在指南頁中有幾個對xbiff、xdm(目前尚未介紹過,將於第20章介紹
)、xterm 的轉譯范例,將對你有所幫助。
如果你發現你的轉譯有錯誤的話,有幾點值得去檢查:
.轉譯只能應用在使用Toolkit的程式上。如果你試圖對非Toolkit應用程
式定義轉譯,看起來不會有任何問題,只是轉譯不會作用而已。
讓我們來看一下為什麽,以對xcalc (這是一個非Toolkit程式)使用轉譯
為例。你對一個resource名稱像 *xcalc*translations定義一個轉譯表,
且用xrdb載入至你的資料庫。xrdb並不會抱怨,因為它不知道是那一個
應用程式使用到resource,它只會設定資料庫,稍後供Resource Manager
查詢。現在你執行xcalc ,它對轉譯是一無所知,所以不會向資料庫查
詢轉譯,當然也絕不會編譯它們了。
.不要省略 #override,除非你確實知道你要做什麽。如果你因錯誤省略
它,例如在xedit 中,你將發現沒有任何的鍵可輸入任何的東西 (因為
預設的轉譯 "<Key>:insert-char()"被去掉了)。
.檢查你對每一列均有終結。如果你在轉譯表中的一列忽略了"\n"或"\n"
,在其後所有的轉譯都會被忽略。如果你在最後一列的末端加上一個倒
斜線(\) ,或是省略了檔案中最後一個新列字元(newline),整個轉譯表
都會被忽略。(不過這是xrdb的問題,而非轉譯管理器的問題)。
這種錯誤在你編輯一個現存的轉譯表時特別容易發生。
.當你定義的轉譯和預設有沖突時,可能會導致奇怪的行為,特別是對滑
鼠按鈕事件,每一次按下或"Down"事件,會相關到一個松開或"Up"事件
,當你對此部份沒有明確定義時,可能會有一個預設的系結仍然存在,
(鍵盤的按下和松開也是成對的事件) .所以:
1.檢查預設系結的文件。
2.如果你只對按下/松開配對的一半指定一個轉譯,確定另一半並非預設
轉譯的一部份,如果是的話,需對它明確地指定一個轉譯。
3.如果你仍然不能解決,暫時由表中移去#override,這將去掉所有的預
設轉譯,讓你了解問題是由於和預設轉譯沖突所造成,還是因為你的
轉譯表有錯誤。
.轉譯管理器對語法不正確的問題,無法很好的告訴你原因何在。例如如
果你有一個轉譯像:
<Key>F6: string("abc""def")
參數的語法並不正確,F6鍵將沒有作用,但你也看不到錯誤訊息。
.如果你轉譯一序列的事件,且需要對每一個均指定修飾鍵,你必需明確
地對每一個都指定。例如如果你需要一個轉譯使用ctl-X ctl-K:
Ctrl <Key>X, Ctrl <Key>K: ...
而如果你使用:
Ctrl <Key>X, <Key>K: ...
你的指定為 ctl-X K
.檢查你所需的widget是否有你指定的名稱和類別。例如對xterm ,你可
以在一個表的開頭指定:
xterm*Text*translations:
這將什麽事也沒作,xterm 正規視窗widget的類別VT100。通常,不論
xrdb或轉譯管理器均不會有反應,因為看起來沒錯。
.轉譯可能指定正確,也可以工作,但它的作用和你預期的不符。例如對
xterm 的轉譯:
Meta Ctrl <Key>m: mode-menu()
是正確的,且會工作。但mode-menu()實際上檢查滑鼠左或中按鈕是否有
招喚它,其它方面不做任何事。
.在一個轉譯中不指定修飾鍵,並不意味著當修飾鍵按下時轉譯會無效。
它真正的意義為: "我並不在乎有沒有修飾鍵" 。如果需要的話,使用
"None",""或!符號。使用時要小心預設的轉譯是否會妨礙到你。
.轉譯是針對widget而指定的,所有在轉譯中的作用必需由widget提供。
在你指定轉譯resource名稱的地方很容易忘掉這一點。例如:
xman*translations: \
<EnterWindow>: reset()\n\
<LeaveWindow>: set()
將導致許多錯誤:set()和reset()作用只有被Command widget定義,但
xman有數種其它型態的widget可接受轉譯,且轉譯管理器會抱怨這些
widget並未提供set()和reset()。解決之道為更完整些的指定resource
名稱,例如在本例為 xman*Command*translations 。
.對任何給定的resource,當resource資料庫被詢問時,Resource Manager
會傳回一個值給widget,這個傳回的值的 "特徵值" (characteristic)
(resource名稱)大多與widget的和屬性的完整類別/成員名稱相符。所
以你對所有的Text widget指定一個一般性的轉譯後,又對xedit指定一
個轉譯,希望它們並存是不可能的,只有一個轉譯表會傳給widget。例
如:
*Text*Translation: #override\
(對Text一般性的轉譯)
...
xedit*Text*Translation: #override\
(對xedit 的Text特定的轉譯)
...
你只能得到在xedit 中特定的轉譯,或是在別處得到一般性的轉譯。
#override 會有所混淆,它的意義為 "把轉譯加入現存的之中" 。但這
完全由轉譯管理器處理,當時候到時,轉譯管理器會決定傳遞哪個值給
由Resource Manager所造的widget。對Resource Manager而言,#override
只是傳遞給widget值的部份中的一個文字字串而已。
因為你使用resource來指定轉譯,所以錯誤可能在兩個領域均會發生。為
了減少錯誤的范圍,當你對轉譯頗有經驗時,在你已載入轉譯resource之後,
最好能明確地列印出你的resource資料庫。例如:如果你對XProg 寫入轉譯,
且轉譯在檔案mytrans 中,以下列命令來執行程式:
xrdb mytrans ; xrdb -q ; xprog ...
17.4 結論
這漫長的一章涵蓋了被X Toolkit 所使用的標准轉譯結構,它讓你指定
按下一個鍵或按鈕會有什麽影響。這些轉譯指定到每一個widget,且你藉著使
用標准resource結構傳送轉譯表給widget。你看到如何對一個鍵盤的鍵、滑鼠
按鈕和其它像移動一個指標進入視窗的事件作指定轉譯。然後我們藉著指定不
同狀態的修飾鍵所造成的影響,比較嚴謹地定義我們需要轉譯的事件。
本章的第二個部份涵蓋相同的領域,但較為正式,且詳細解釋在轉譯規格
中,可用到的語法,特別是修飾鍵。
最後,我們簡列使用轉譯常見的問題,及一些如何解決它們的建議。
本章包含了許多材料。它們運用了極少的觀念,但語法復雜,易生錯誤,
且不顯而易見。如果一開始覺得困難,不必擔心。從一些簡單的轉譯著手 (也
許是xterm),且以指南頁中的范例或別人的轉譯表為基礎來發展修改。當你有
經驗之後會進展快速;你將洞悉語法且能看出其後會發生什麽狀況。
=====
第18章 鍵盤和滑鼠 -- 對應和參數
在前章我們看到了Toolkit 所提供的轉譯結構,它讓你對一個應用程式的個別
成員,定制你的鍵盤和滑鼠。在本章,我們來看另一種較低層次的定制,它是
由server所管理,稱之為對應(mapping) ,你只需要告訴server你的鍵盤所需
的不同的配置,它就會被每一個連接到你server上的應用程式應用到。例如:
取代通常的QWERTY鍵盤,你可能希望重新安排鍵盤以適應那些對鍵盤並不熟悉
的使用者 (你可能把鍵盤按ABCDEF... 重新排過,當然鍵盤按鈕上所印的字也
需更改成相符)。你也能對一些Control,Shift等等的修飾鍵作指定。對滑鼠
按鈕,一樣有一個相關的對應,可將 "邏輯的" 按鈕對應到實際動作。整體而
言,你使用這些鍵盤和滑鼠的對應的頻率,將小於轉譯。
此外,尚有非常常用的第三種型態的定制可用:你可以設定有關你鍵盤和
滑鼠各種不同的參數。例如響鈴聲音的大小,按下鍵時是否有滴答聲等等。
在本章,我們先描述鍵盤、滑鼠和修飾鍵的對應,接下來描述你如何使用
xset程式,來定義類似像鍵盤有無滴答聲的參數設定。
18.1 鍵盤和滑鼠對應 -- xmodmap
server本身處理一個層次的定制,它對於所有使用到此server或顯示器的應用程
式均發生效用:這就是鍵盤對應 (keyboard mapping)。
每一個鍵,有一個單獨的碼對應它,稱之為鍵碼(keycode)。鍵和鍵碼之間
的關系是絕對固定的。 (粗略來說,你可以說 "鍵碼就是鍵")。
連接到每一個鍵碼 (或鍵)的是一個keysym的表列。一個keysym是一個代表
印在鍵盤符號上的數字常數。在預設的情況,大多數的鍵只有一個keysym 與之
對應,例如 SHIFT,A,B,Delete,Linefeed等等。keysym既非ASCII或EBCDIC
字元,也非server用以維持keysym和字元的關系。你可以對每一個鍵有兩個
keysym。在預設對應中,有很多連接到兩個keysym的鍵,例如冒號( 和分號(
,7 和 &等等。對一個鍵附屬的keysym表列中,第一個keysym是未按下修飾鍵
的狀況下的鍵。第二個keysym是指當SHIFT (或Lock)已被同時按下時的鍵,如
果在表列中只有一項,且為字母,則系統自動假設第二項為相對的大寫字母。
超過兩項的keysym並沒有特別的意義,鍵盤和keysym之間的關系被稱之為鍵盤
對應。
盡量地以server處理一般的鍵和keysyms 。它對鍵碼沒有附屬意義,且它
自己本身不會使用對應從鍵碼對應至keysyms :它只是傳遞資訊給client應用
程式。特別的是,server對ASCII 或其它的字元集合 (character sets) 毫無
概念;它只是說明 "某鍵被按下,某修飾鍵也同時被按下,keysym表列中某
keysym和某鍵相關" 。它是client (典型的使用標准的X Library) 對keysym
和修飾鍵附屬的意義:例如,它決定如果keysym產生時ctrl也被按下,它必需
被解釋為ASCII 字元 hex 0x1,也就是說ctl-A。 特定的client可以決定特殊
的修飾鍵的意義;例如在xterm 中,當你和MTEA鍵同時按下一個鍵,程式將此
轉換為ESC 後面跟隨著被按下的字元。 (也就是說,如果你按下meta-A,實際
上會產生兩個字元 ASCII 0x1b, ASCII 0x41)。
server在此領域內提供一個額外的設施。你可以定義讓server將鍵碼解釋
成修飾鍵,例如 "當鍵碼為若干的鍵被按下時,它相同於CONTROL修飾鍵被實際
按下"。這種定義並不互斥:如果你定義鍵F7為Shift 修飾鍵,它並不會影響任
何現存的修飾鍵。此種設施稱之為修飾鍵對應 (modifier mapping)。X提供八
個修飾鍵:Shift、Lock(caps-lock)、Control、Mod1到Mod5。習慣上,Mod1被
解釋為Meta。
最後,對滑鼠按鈕有一個類似的指標對應 (pointer mapping)。對每一個
實際的按鈕,你可以對它們指定一個相關的邏輯按鈕數字。
實際上,如果你改變你的鍵盤或滑鼠的對應,你相當於是說制造廠商對你
的輸入裝置配置不當,你將把它修正為適合你所需要的。當然,如果你改變了
對應,你應該把對應鍵上面所印的符號也隨之修改;不過,通常更改的都是一
些控制和修飾鍵,所以就不是那麽需要了。換句話說,如果你改變了對應,使
得鍵盤配置和一個特定國家標准 (例如:法國或德國) 相符,你必需更換實際
鍵盤上的符號。
你可以預期得到,改變鍵盤對應是一件相當稀罕的事,你可能設定它一次
之後就不再改變它。在以下幾節,我們將很快的看一看如何使用程式xmodmap
,查看現有的對應和修改它們。
18.1.1 查看現有的對應
你使用xmodmap 來列出現有的對應,就如同改變它們一樣。你可以指定不同的
命令列選項,來選擇想要印出的不同的對應:
列出現有鍵的對應:指定 -pk選項。
列出現有修飾鍵的對應:指定 -pm選項 (或是什麽選項也不選,因為這是
xmodmap的預設作用)。
列出現有指標 (按鈕)的對應:指定 -pp選項。
例如,將所有的對應一起印出,使用命令:
xmodmap -pm -pk -pp
列出鍵、修飾鍵、指標的對應之范例如圖18 - 1,18 - 2,18 - 3。(鍵對應只
有列出一部份,因為完整的對應實在太長了。)
┌————————————————————┐
│ p228 fig 18.1 │
│ │
│ 圖18-1 列出鍵盤對應的范例 │
└————————————————————┘
┌————————————————————┐
│ p229 fig 18.2 │
│ │
│ 圖18-2 列出修飾鍵對應的范例 │
└————————————————————┘
┌————————————————————┐
│ p229 fig 18.3 │
│ │
│ 圖18-3 列出指標對應的范例 │
└————————————————————┘
18.1.2 執行 xmodmap 改變對應 -- 一般性選項
當xmodmap 用來改變或設定對應,它可以處理一或多個表式 (expression) 的
作用。你可以把這些輸入在一個檔案中,假設此檔案名稱叫myfile,可用下列
命令兩者之一:
xmodmap myfile
xmodmap - <myfile
第二列的短橫線是必需的,如果少了它,程式將只完成預設的作用 (列出修飾
鍵的對應) 。除了在檔案中輸入規格之外,你也可以在命令列中用 -e 選項直
接指定它們:
xmodmap -e expression
xmodmap -e expression-1 -e expression-2
為了得到更多有關xmodmap 作用的資訊,可以指定冗贅 (verbose)選項,-v 或
-verbose。你可以藉著使用 -n 選項不實際的改變對應而獲得相同的列印輸出
(printout) 。 (此功能和Unix中make命令的 -n 選項相同,其意為 "假裝執
行我要求你做的事,正確的告訴我你將如何進行,但並不實際地完成作用")。
這個選項對新手或不確定自己是否做的正確的情況非常有用。
每一個表式的語法並不相同,但一般性的格式為:
keyWord target = value(s)
(等號的兩邊均需為空白)。
18.1.3 改變指標對應
指標對應是一個邏輯按鈕數字的表列。 (邏輯的button-1我們稱為LEFT,邏輯
的 button-2 稱為MIDDLE等等,實際的 button-1 是滑鼠左邊的按鈕,button-2
是隔壁的按鈕等等,所以預設的邏輯的按鈕和實際的一致)。在表列中的第一個
項目是邏輯的按鈕和實際的 button-1 的關系,下一個則是對實際的 button-2
的關系,以此類推。例如,顛倒按鈕的次序,使用命令:
xmodmap -e "pointer = 3 2 1 "
結果按下滑鼠右邊的按鈕,會被解釋成LEFT。
18.1.4 改變鍵對應
xmodmap 讓你將一個鍵 (也就是說鍵碼) 連結到一個新的keysym表列,使用表
式:
keycode keycode = keysym-1 [keysym-2 ...]
安排keysym-1連結到鍵時沒有修飾鍵,當SHIFT 按下時keysym-2連結到鍵,如果
還有下一個keysym的話,對keycode 而言是第三順位等等。 (請記住,在前兩個
之後的keysym,系統並未附屬特別的意義,應用程式如果需要的話可以附屬意義
)。
讓我們舉實際的例子。一些鍵盤把一些非字母數字 (alphanumeric)鍵放在
不標准的地方,所以我們假設你要將F6鍵重定義當沒有修飾鍵按下時為 "9",
當SHIFT 按下時為 "("。要寫入這個xmodmap 的表式,你需要知道三件事:F6
的鍵碼,和 "9"與 "("的keysym。我們在第12章提到過,執行xev 便可獲得
這些:分別按下"F6", "9", "("三個鍵,你便可得到它們的鍵碼和keysym。然
後將它們放入你的表式中。例如在我們的系統中我們使用命令:
xmodmap -e "keycode 21 = 9 parenleft"
為了容易一些,你通常不需要查問鍵碼,xmodmap 允許你使用下列格式:
keysym target-keysym = keysym-1 [keysym-2 ...]
它的意義為 "附屬在此鍵的keysym表列現在改由target-keysym來附屬"。例如
針對我們方才的范例,我們可以用:
xmodmap -e "keysym F6 = 9 parenleft"
如果你將相同的keysym附屬到數個鍵,xmodmap 會搞混掉,像這種情況你應堅
持使用keycode ... 這種符號表示法。
18.1.5 改變修飾鍵對應
在server中修飾鍵對應是一個表列的集合,每個修飾鍵有一個表列。對一個修
飾鍵的表列中,包含了所有當此修飾鍵被按下時會有意義的鍵 (鍵碼) 。xmodmap
允許你在一個表列中增加項目,去除項目,或完全清除一個表列。對此三個操
作的格式為:
add modifier = list-of-keysyms
remove modifier = list-of-keysyms
clear modifier
不幸的是,語法有點兒混淆,因為取代你所需的鍵碼,你必需指定keysym附屬
到鍵碼。
舉一個例子:假如你需要在你鍵盤的右邊有一個第二個的Ctrl鍵。在我們
的鍵盤上有一個Alternate 鍵沒有被用來做任何事,所以我們將修改它,命令
為:
xmodmap -e "add Control = Alt_R"
為了多解釋一些情況,讓我們假設你沒有一個多馀的鍵,但有一個第二個的
Meta鍵在鍵盤的右手邊,而我們要用它。我們首先必需去除它的Mod1對應 (你
必須使用 "Mod1" ,"Meta"沒有用) ,而後將它加入Control 對應。 (如果有
需要的話,我們可以擁有雙重的對應,所以在Control-Meta組合鍵時才會有作
用,在一些編輯器中常會用到)。命令為:
remove Mod1 = Meta_r
add Control = Meta_r
將上述命令列放入一個比方說叫mymaps的檔案中,執行命令xmodmap mymaps。
它可以工作,但如果你用xmodmap -pm 去查看,你會發覺Control 和Meta混合
在一起,所以最好改變鍵上的keysym為:
remove Mod1 = Meta_R
add Control = Meta_R
keysym Meta_R = Control_R
在xmodmap 的指南頁中,有幾個更多的交換修飾鍵的范例。
注意:當增加一個鍵到修飾鍵對應,keysym只是用來指定xmodmap 中的鍵
。它完全是xmodmap 本地的,且只是一個符號而已:只有當相關的鍵碼傳遞到
server,才實際上的改變對應。同樣地,keysym 和 keycode 表式對修飾鍵對
應絕對沒有影響。一個常見的錯誤是執行下面這個命令:
xmodmap -e "keysym F1 = Contrl_R"
期望F1鍵能像一個control 鍵般作用。它不會 -- 因為你相當於告訴系統 "我
已經把這個符號印在F1鍵上面" 而已。你應該這樣作:
xmodmap -e "add Control = F1"
如果你合並上一列的命令會使得對應表列看起來清楚些。
我們對不同對應的處理的描述到此告一結束。
18.2 鍵盤和滑鼠參數設定 -- xset
最後我們來看一看最平常的設施,對你的鍵盤、滑鼠和螢幕設定不同的參數的
設施。這些參數使用xset程式 (我們曾經用來控制server的字型搜尋路徑) 來
設定。在以下的敘述,我們只用一組引數來展示xset,但你可以同時指定多組
你所要的不同定義的設定。
控制終端機響鈴
用xset你可以讓鈴聲響或不響,設定它的音調 (pitch),和它持續的時間 (假
設你的機器提供這些操作):
讓鈴聲不響 xset -b
xset b off
讓鈴聲能響 xset b
xset b on
設定鈴聲的音量 xset b vol
(最大音量之vol%) 例:xset b 50
設定鈴聲的音量,和 xset b vol p
音調(單位Hertz(赫)) 例:xset b 50 300
設定鈴聲的音量,音調, xset b vol p d
和持續的時間(單位百萬 例:xset b 50 300 100
分之一秒)
控制鍵的滴答(click)
讓鍵的滴答不作用 xset -c
xset c off
讓鍵的滴答作用 xset c
xset c on
設定滴答聲的音量 xset c vol
(最大音量之vol%) 例:xset c 50
控制鍵的自動重復(auto-repeat)
讓鍵的自動重復不作用 xset -r
xset r off
讓鍵的自動重復作用 xset r
xset r on
滑鼠參數 -- 加速和門檻
指標在螢幕上的移動和滑鼠的移動是成比例的。加速 (multiplier) 是應用在
指標移動上的一個乘數,例如你的加速是四,當你移動滑鼠時,指標將以正常
四倍的速度移動。 (如果指標正常時移動n 個像素,現在則會移動 4 X n個像
素)。
當你希望在螢幕上將指標移動一段長距離時,相當高的加速是很方便,但
當你要作一些細部的指引時,它看起來就很笨拙 -- 指標看起來在來回跳動。
為了克服此點,server提供了一個門檻 (threshold):如果當指標一次移動超
過門檻個像素,加速也會被帶進來執行。
設定滑鼠的加速到a xset m a
例:xset m 5
設定加速,設定門檻到t xset m a t
例:xset m 5 10
控制螢幕節約器結構
螢幕節約器 (screen saver)是一種設施,它意圖降低一個固定的圖樣(pattern)
老是燃燒你螢幕的螢光體的機率。它的理念為螢幕損害大都起因於讓系統閒置
(idle)一長段時間,所以螢幕節約器在一段特定的時間內如果沒有輸入動作後
,不是整體性的閃動螢幕,便是顯示一個不同的圖樣。
如果你選擇的是顯示一個不同的圖樣,根視窗的背景涵蓋整個螢幕,一個
大X 的游標出現在螢幕上,且會周期性的移動。當大X 游標在移動時,會改變
大小,而且背景也會隨機的變動。 (在背景圖樣較小時你可能不會注意到,但
若比較大時,你可以看到它在跳動)。
當螢幕節約器結束作用後,如果要花許多的時間才能重畫應用視窗,你可
以指定只有在重畫螢幕而不需產生任何曝光(exposure)事件 (也就是不必要求
應用程式重畫它們自己的視窗) 的情況下,螢幕節約器才會作用。 這只應用
於顯示不同的圖樣的情況,整體性的閃動螢幕純為硬體作用,不會影響到應用
程式。
讓螢幕節約器能作用 xset s
讓螢幕節約器不能作用 xset s off
用螢幕閃動的方式 xset s blank
只有在無曝光事件下才作用 xset s noexpose
允許有曝光事件下仍然作用 xset s expose
用不同圖樣的方式 xset s noblank
當系統閒置t 秒後作用 xset s t
例:xset s 600
每p 秒之後改變圖樣 xset s t p
例:xset s 600 10
讓我們將這些組合起來,假設我們希望螢幕節約器在系統閒置80秒後開始作用
,用不同的圖樣的方式,周期為3 秒,不介意曝光事件是否發生:
xset s noblank s 80 3 s expose
注意:xset s 並不提供 on 這個值。
18.3 結論
本章的第一個部份,告訴你如何改變從實際的到邏輯的鍵和按鈕的對應,這些
對應可被client應用程式解釋。你看到如何使用xmodmap 來列出或改變每一個
鍵盤的鍵、修飾鍵和滑鼠按鈕的對應。這些對應由server維護,所以可以被每
一個使用到此server的應用程式應用到。這種結構讓你有改變鍵盤配置的自由
,不論是個人的喜好或是一個額外的標准。
在本章的第二個部份,你看到如何使用xset對一些常見的特性作設定,如
鍵的滴答聲、終端機的響鈴、螢幕節約器和滑鼠的速度 ("加速")。
=====
第19章 進一步介紹 uwm 和如何定制它
在第6章,你學到如何使用uwm 來完成基礎的視窗建構工作需求,而能以一個
舒服的方式使用視窗。現在我們繼續談視窗,集中於兩個主要的范圍:
1.此程式所提供的一些特別的特色,特別是:
.不使用選單,直接使用滑鼠建構視窗。
.我們尚未描述過的一些選單選擇。
.編輯現存表徵圖的標題。
2.如何定制uwm ,包含:
.對任何你所需的命令定義你自己的選單。
.將各種不同的視窗管理器功能系結到滑鼠按鈕和修飾鍵 (SHIFT,
CONTROL 等等)。
19.1 uwm 的新特色
現在我們來討論一些在先前介紹視窗管理器時,為了保持盡量地簡單,而省略
的標准的uwm 功能。
19.1.1 不使用uwm 的選單來管理視窗
直到目前,你仍然依賴著uwm 的選單來建構你的視窗 -- 移動它們、對它們重
定大小等等。如果所有的情況都使用選單,是相當慢的,所以uwm 提供你可直
接完成它任何命令的選項。
你可以使用滑鼠按鈕和修飾鍵,來指定你要執行的功能,和所要操作的視
窗。你現在應該已非常熟悉各種不同的視窗管理器功能和它們如何工作,所以
我們將很快地說明如何不使用選單來選擇這些功能。
Move:移動一個視窗
1.按下META鍵,保持按住。
2.指標位置所在的視窗將被移動。
3.用右按鈕,拖拽視窗到新的位置。
Resize:重定一個視窗的大小
1.按下META鍵,保持按住。
2.指標位置所在的視窗將被重定大小。
3.用中按鈕,拖拽視窗的外框到新的大小。
Lower:將一個視窗送到堆疊的底部
1.按下META鍵,保持按住。
2.將欲被送到堆疊的底部的視窗,碰觸一下左按鈕。
Raise:將一個視窗升到堆疊的頂端。
1.按下META鍵,保持按住。
2.將欲被送到堆疊的頂端的視窗,碰觸一下右按鈕。
Circulate up:將最底層被遮蔽的視窗升到最上層,你有兩種選擇:
1.按下META鍵,保持按住。
2.在根視窗上,碰觸一下右按鈕。
或
1.同時按下META和SHIFT 鍵,保持按住。
2.在螢幕上的任何地方,碰觸一下右按鈕。
Circulate Down:將最上層的視窗移到最底層,作法同Circulate Up,但
改為左按鈕。
Iconify:之前我們曾提過兩種形式的表徵圖化,一種是視窗曾經表徵圖
化過(已定義過表徵圖的位置) ,另一種為對 "新" 的視窗表徵圖化
。
表徵圖化一個新的視窗:
1.按下META鍵,保持按住。
2.將指標位置移至欲被表徵圖化的視窗。
3.按下LEFT按鈕,保持按住...
4. ... 拖拽表徵圖的外框到你所需的位置。
5.松開按鈕和META鍵。
注意它和Lower 操作程序的不同點,在此你是按下... 拖拽... 松開滑
鼠按鈕,而對Lower ,你只是碰觸一下按鈕。
表徵圖化一個曾經表徵圖化過的的視窗:
1.同時按下META和CTRL鍵,保持按住。
2.在你欲表徵圖化的視窗上,碰觸一下左按鈕。
(如果你對先前並未表徵圖化的視窗作這個操作,或經由resource結構
無法取得表徵圖的位置,表徵圖將出現在指標所在的位置)。
De-Iconify:將表徵圖還原為它的視窗 (在視窗原來的位置):
1.按下META鍵,保持按住。
2.在表徵圖上,碰觸一下中按鈕。
如果你覺得這些對滑鼠按鈕功能的結合十分笨拙且不易記憶,別擔心,很
多人都是如此。有更好的法子,剛才那些只是預設的設定,你可以完全由自己
來建構。在本章的後半部,我們將告訴你如何做。現在我們先來看一看,在標
准選單的一些功能和它們能做些什麽。
19.1.2 一些更多的選單選擇
這是一些我們在第6章中沒有解釋的標准的選單選擇。
Focus:讓你設定鍵盤的焦點(focus),也就是說,將鍵盤附屬於一個視窗
,所以不論螢幕上的指標在何處,鍵盤的輸入總是在同一個視窗。一
般鍵盤的輸入總是指向目前指標所在的視窗。
設定焦點到一個特定的視窗:選擇focus ,出現手指形游標,在你所
欲指定的視窗碰觸一下按鈕。
恢復正常:選擇focus ,在背景視窗上碰觸一下。
Restart:停止uwm ,重新啟動它,重新讀入建構檔 (下節說明) 且執行它
。在你改變建構檔且希望馬上執行新的設定時 (否則將等到你重新啟
動一個新的周期) 使用此選擇。
Freeze:暫停螢幕上所有的顯示,當你要對你的螢幕攝影時可以使用這個
選擇。欲重新恢復顯示,使用 ...
Unfreeze:重新恢復顯示,所有的視窗會立即更新。
Exit:中止uwm 。當你要殺掉uwm 時使用,例如在啟動一個不同的視窗管
理器之前。
Perferences 選單
我們在第6章提過,有兩種方法叫用uwm 的WindowOps選單 -- 在背景視
窗上按下中按鈕,或在按住META和SHIFT 兩個鍵的情況下,在任何地方碰觸一
下中按鈕。用第二種方法讓你呼叫出第二個選單,只要將指標移到WindowOps
選單的外邊,標頭為Preferences 的視窗就會出現。
在Preference中的選擇,只是一些xset程式中設定滑鼠和鍵盤的選項而已。
注意:Lock On 和 Lock Off選擇是和記錄有關的,可能會導致一個錯誤
的訊息在你的主控台視窗印出。
19.1.3 改變現存表徵圖上的標題
uwm 的預設表徵圖 -- 灰色的盒中有一個名稱 -- 如果你對同一個應用程式執
行數次拷貝後會有缺點,例如有三個xterm 的表徵圖,你無法明確的區分它們
。為了克服這點,uwm 允許你可以編輯表徵圖中的字串為你所需的任何字串。
(這只能在uwm 自己預設的表徵圖使用,例如你無法編輯在xclock的特定表徵
圖中的字串)。
欲編輯在一個表徵圖中的名稱:
1.將指標移至所欲編輯的表徵圖。
2.鍵入你所希望的任何文字。
3.你可以去掉文字,不論是先前存在或方才才輸入的,方法如下:
去掉前一個字元:按DELETE。
去掉整個名稱:按ctl-U。
19.2 定制uwm
uwm 具有高度的可建構性。你可以將整個范圍的參數和定義儲存在一個建構檔
中,當uwm 啟始時會將之讀入。我們前節曾經提過,你可以在中途改變建構檔
,藉著在WindowOps選單中Restart選項,告訴uwm 重新讀入它。
uwm 的建構檔
預設uwm 有兩個建構檔,其中之一為
/usr/lib/X11/uwm/system.uwmrc
通常由系統管理者設定,且第一個被讀入。另一個
$HOME/.uwmrc
是你自己的建構檔。兩個檔案均需要存在,uwm 硬性規定了預設設定。
注意:如果你用不正確的語法設定一個建構檔,當uwm 讀入時,你會得到
一個錯誤訊息像:
uwm: /usr/nmm/.uwmrc: 38: syntax error
uwm: Bad .uwmrc file...aborting
uwm 將不會啟動。當在一個新的周期啟動時,這沒有什麽大問題。然而,如果
你是在中途重新設定uwm ,你可以結束但沒有視窗管理器,且沒有xterm ,沒
有編輯視窗來編輯這個錯誤的檔案,無法啟始其它的視窗。如果此種情況發生
,你必需從其它的終端機或機器關閉X,或毀壞 (crash)你的系統。
uwm 的命令列選項
如果你不需要系統建構檔案,也不需要任何預設的設定,你可以藉著uwm 的命
令列選項 -b 抑制它們。
如果你要使用其它的檔案,就像兩個預設的建構檔一般,你可以用
-f filename 來指定它。
19.2.1 系結功能到鍵和按鈕
uwm 讓你定義當一個特定的滑鼠按鈕按下時,有某個功能會作用,例如當你在
一個視窗中碰觸一下中按鈕,它將被升到堆疊的頂層。這種系結結構和Toolkit
轉譯並沒有牽連,它完全由uwm 本身來完成。
為了讓這些結構更有用,你可以指定其它的條件來運用更多的功能,或許一個
修飾鍵 (像META) 需被按下,或許作用只發生在指標位於一個表徵圖上而非應
用程式視窗或背景視窗。我們已實際的看過這些例子:
此功能發生 ... 只有在這些 ... 只有指標在 ... 當這個
於... 修飾鍵被按下, 此種型態的視窗 滑鼠事件發
而且... ,而且... 生時
Resize META 一般視窗 按住中按鈕
且移動
WindowOps 沒有 背景視窗 按住中按鈕
選單
WindowOps META 和 沒有關系 按住中按鈕
選單 SHIFT
你藉著你的 .uwmrc(或其它的建構檔)所包含的系結規格來指定系結。規格
的格式和上面的表格類似,就像:
uwm-function = modifiers : window context : mouse events
( uwm 功能 = 修飾鍵 : 視窗的環境 : 滑鼠事件 )
這些元素為:
uwm 功能:uwm 的內建功能之一的名稱。例如功能f.move即是你用以移動視
窗的功能,f.lower 將視窗降低一層等等。這些功能將於下更完整地描
述。
功能名稱必需跟隨著一個等號(=)。
修飾鍵:在運用上述功能時,當指定的滑鼠事件發生時,必需被按下的修飾鍵
表列。正確的修飾鍵名稱為:
ctrl(或c),對CONTROL鍵。
meta(或m或mod1),對META鍵。
shift(或s),對SHIFT鍵。
lock(或l),對CAPSLOCK鍵。
這些名稱必需正確的列出。你可以使用一或二個修飾鍵,如果你使用兩個
鍵,用一個 ""符號來分開它們。
你可以省略整個修飾鍵表列 (即此功能對應於滑鼠事件發生時並沒有修飾
鍵被按下),但尾端的冒號 ":" 不可省略。
視窗的環境:限制只有指標在螢幕上指定位置的型態符合特定條件時,功能
才會發生。正確的環境如下:
window(或w):指標必需位於一個應用視窗中。
icon(或i):指標必需位於一個表徵圖中。
root(或r):指標必需位於根視窗或背景視窗中。
你可以指定任何數目的環境,用 "" 來區隔它們。如果你沒有指定,則功能
的發生與指標位置無關。
滑鼠事件:何種滑鼠事件對應到此功能。指定的事件為一個按鈕名稱 -- 任何的
left(或l)
middle(或m)
right(或r)
跟隨著一個動作:
down : 當按鈕被按下時會符合。
up : 當按鈕被松開時會符合。
delta : 當按鈕被按下且移動超過一定數目的像素時會符合。
所有的這些你已實際使用過它們,在本章開頭所描述的一些作用的系結為:
f.resize = meta : window : middle delta
f.iconify = meta : icon : middle up
f.raise = meta : windowicon : right down
uwm 的預設系結在檔案 $TOP/clients/uwm/default.uwmrc,見圖19 - 1。
┌————————————————————┐
│ p242-243 fig 19.1 │
│ │
│ 圖19-1 預設的 .uwmrc 建構檔 │
└————————————————————┘
uwm 的內建功能
uwm 的指南頁列出可應用的功能。你已經從圖19 - 1見過其中大部份,你可以
看出,功能是和WindowOps及Preferences中的選項相關。
然而,有一個有關pushing視窗(f.pushleft, f.pushup等等)的功能集合你
從未見過。pushing的意思為:你朝一個特定的方向移動一個視窗,移動的距離
固定。這和f.move不同的是,後者以交談的方式,指定視窗移動的方向和距離。
預設f.pushdown系結到同時按下CONTROL和META鍵,且按住中按鈕。試它幾
次,你將發現你的視窗稍微移動了一點 -- push 功能對細部移動視窗非常有用。
另一個功能為f.moveopaque。它也移動一個視窗,但不像f.move,它並不會
給你一個指示視窗新的位置的方格,你直接拖拽整個視窗本身。這可以讓整個螢
幕清爽些,但比較慢,且一般視窗移動時會有抖動的現像。
19.2.2 定義你自己的選單
f.menu是一個非常強大的uwm 的功能:它讓你定義你自己的選單。此選單可選
用到uwm 本身的功能,或任何的shell 命令,或一個特定的動作,像是在一個
剪緩沖區插入本文。
在你的建構檔中定義一個選單共有兩個步驟。首先你定義選單上所需的
系結,其次你定義選單本身的內容。系結的部份像我們先前所用過的,但在尾
端增加了一欄選單名稱。例如WindowOps 選單 (藉著在背景視窗中按下中按鈕
來呼叫)的系結是:
f.menu = : root : middle down : "WindowOps"
在此,選單名稱既是用以顯示選單出現時的名稱,也連結到建構檔中的選單內
容規格。
選單內容的格式很簡單:對每一個選擇項,包含了一列當選擇項出現在選
單的 "名稱" ,和當它被選擇到時所做的動作。讓我們觀察一個縮水的WindowOps
定義:
menu = "WindowOps" {
New Window : !"xterm &"
RefreshScreen : f.refresh
Redraw : f.redraw
Move : f.move
}
從這裡,我們可以看到其語法為:
menu = "menu name" {
...
selection lines
...
}
選單名稱和系結所指定的相同。選擇項列包含了選擇項名稱,分隔的冒號,和
負責的動作。這些動作為下列三者之一:
1.一個uwm 的功能:只用到它們的名稱,在上例為move那一列。
2.一個shell 命令:命令包含在雙引號中間 (用shell 的& 語法使其在背
景視窗中執行) 且在前面加一個驚歎號。在上例為xterm 那一列。 (如
果你省& ,uwm 將被懸置 (hang) 起來,等待命令的完成,如果此程式
為X的應用程式,它需要uwm 來安排它的視窗,這將會招致麻煩)。
3.一個本文字串:這將插入到一個 "剪" 的緩沖區,而後你可以像平常一
樣的 "貼" 它。
多種的選單連結到同一個鍵系結
通常你對一個特定的鍵/按鈕的組合,只會系結到一個選單,但你可以對同一個
系結有多種選單:如果你在一個選單中不選擇任何項目且把指標移動到選單的
邊上,你將得到下一個選單。你已經實際地看過這種例子:在同時按下META和
SHIFT 鍵的情況下按下中按鈕,你可以得到WindowOps 選單,然後是Preferences
選單。
系結多種選單非常的容易,只要在定義每一個系結時當作其它的系結並不
存在,而在定義選單的內容時用標准的方式即可。例如uwm 的預設設定包含了
系結:
f.menu = meta shift : : middle down : "WindowOps"
f.menu = meta shift : : middle down : "Preferences"
注意一個選單只能定義一次,但你可以用它來做任意多次的系結。 (查看預設
設定,你將看到WindowOps 選單被定義了一次但使用到兩次)。
指定選單的顏色
你可以指定在一個選單中所用的色彩。對選單名稱標題、每一個選擇項、指標
所在的高亮度選擇項,你都可以指定一個前景和背景色彩。一個有色彩的選單
的格式如下:
menu = "menu name" (head-fg : head-bg : hilite-bg : hilite-fg) {
...
selection-name : (item-fg : item-bg) : action
...
}
以下為一個混合的范例,使你的WindowOps 能擁有更多的色彩:
menu = "WindowOps" (yellow : blue : red : green) {
New Window : !"xterm &"
RefreshScreen : f.refresh
Redraw : (navy : magenta) : f.redraw
Move : f.move
}
此選單標題為藍底黃字,大多數的選擇項為白底黑字 (預設值),只有 "Move"
選擇項為紫紅色底海藍色字,而目前指標所在的選擇項為綠底紅字。
19.2.3 控制uwm 的參數變數
到目前為止,你可以用指定滑鼠和鍵的前後關系,來改變所指定的功能。在此
有一個另一種型態的uwm 的定制:你可以藉此改變許多內建功能操作的作法 (
mode) 和風格 (style),例如你可以指定在resize或move操作下,指示視窗新
的位置的九宮格,改變為只是一個外框而已。在指南頁中有列出所有的變數和
它的意義,在此我們只提一些特別有用的,和解釋一些比較模糊的。
讓預設建構檔中的設定無效:uwm 並沒有結構抑制讀取系統和使用者建構
檔。(-b 不會影響 $HOME/.uwmrc)。欲取消早先檔案中的設定,可以含入uwm
的變數resetbinding、resetmenus和resetvariables,將會分別的取消早先定
義的系結、選單和變數。 (確定你將這些變數放在檔案的頂端,否則它將取消
在檔案中所有在它之前的定義)。
限制視窗和表徵圖在螢幕的范圍以內:X允許你指定你的視窗位於螢幕的
任何位置,甚至部份或全部在螢幕之外,這樣有時會引起麻煩。當你建立一個
視窗,uwm 並未提供任何的幫助。但當你使用f.newiconify對一個表徵圖作解
除表徵圖化,如果變數normalw 被設定,則視窗會被完整的放在螢幕中,且盡
量接近你用指標指定的位置。 (如果你包含了normali 變數,同樣可用於表徵
圖)。
控制push作用:預設f.pushxxx 功能將一個視窗往適當的方向推動一個像
素的距離。你可以藉著指定 push=num 來推動num 個像素。你也可以完全地改
變操作的作法:取代通常的推動固定數目的像素的作法 (叫做pushabsolute)
,你可以指定pushrelative:這種情況視窗會被推動num 分之一大小的視窗。
例如如果你指定
push=5
pushrelative
則一個f.pushup將把視窗向上推動視窗本身高度五分之一的距離。
防止uwm 功能鎖定應用程式:預設一些uwm 的操作,像resize和move會導
致所有其它的client應用程式被凍結,也就是說,防止它們輸出到它們的視窗
。你可以藉著指定nofreeze取消它。
如果你需要獲得一些uwm 所屬短暫視窗的視窗傾印,則這是必需的 (如在
圖6 - 6 的resize盒)。 它的副作用為當使用resize和move時,外框格會大量
的閃動,以致難以看到。
19.3 結論
本章告訴你如何使用一些更多的uwm 的功能,現在你對系統有更多的經驗且可
以利用它們。特別是看到不用預設選單如何建構視窗,它使你工作的更迅速。
本章的第二個部份,列出你如何能定制uwm :如何附屬uwm 的內建功能到
指定修飾鍵和滑鼠動作的組合,如何定義一般性的選單,如何使用uwm 的參數
變數修改操作的作法。
在結束之前說一點題外話,uwm 和 xterm、xclock、xedit等一樣,只是server
的一個client程式而已。所以,遠端地執行uwm 是可能的,例如在saturn執行
uwm ,但是指定 -display venus:0,所以它是venus 的視窗管理器。這解釋
了網路元素深殖於系統,在一般工作站,這只是好奇,但在X終端機 (它不提
供一般性目的的處理 (processes)) 它實際地需要。
我們現在接近尾聲:你已有所有你執行視窗系統的所需的功能。你有視窗管理
器、應用程式、便利的工具、視窗有關的公用程式、大范圍的設施所以可以修
改以適合你的顯示器、你網路上的建構和你比較喜歡的工作。下一章,我們將
會把目前所學的放在一起,告訴你如何管理你完整的工作周期,且我們將包含
定義uwm 選單和perferences的實際的范例。
=====
第20章 全部放在一起 -- xdm
現在我們已涵蓋了你需要用到X的所有個別的項目,你知道如何啟動系統,
如何設定一個視窗管理器的執行,如何執行應用程式,如何從不同的角度定制
系統,最後,如何退出系統。
本章中,我們把這些分開的部份放在一起,且描述一個完整的檔案設定,
用來定制涵蓋所有的范例功能系統機器環境。在本章我們將看到我們所要介紹
給你的最後一個X的工具:顯示管理器(display manager) -- xdm,它提供一
個精巧和清楚的方法在你的機器上啟動X。
20.1 我們需要做些什麽
當我們啟動之後,我們需要安排螢幕,讓一些我們在整個執行期間中都會
使用的應用程式適得其所,讓一些偶然用到的則以表徵圖為開始時的表示方式。
我們需要執行視窗管理器,對某些種類的功能做一些設定。詳細來說,我們需
要下列的程式:
.一個xterm 的主控台,在螢幕左上角。
.uwm 在背景下執行。
.一個我們的(正常)編輯器的全螢幕xterm 視窗,以表徵圖啟始。
.在右上角一個(較一般為小)的時鐘。
.xbiff 在時鐘之下。
.一個計算器在右下角。
.一個用到我們所有最小的字型的表徵圖化的xterm ,它的高度為screen高。
.在xbiff 之下,排列我們使用遠方機器的頻率圖。
除了程式之外的項目:
.設定背景視窗為亮灰色。
.啟動鍵盤滴答(key-click) 的功能。
.從我們常用的網路主機存取到我們的server。
.載入我們對所有client用到的server設定的resource,在16章我們定義
的$HOME/.Xresources 檔案中,根視窗RESOURCE_MANAGER性質之上。
.啟動一個screen saver。
並且我們需要uwm 有選單讓我們能夠:
.容易地存取在網路上其它的主機。
.變更一些鍵盤和滑鼠的設定,且設定背景視窗的顏色。
.啟動那些我們偶而會用到的應用程式。
.啟動一些被選定的示范程式。
對這些我們自己的設定,在我們網路上其它的使用者需要不同的初始設定,
所以我們需要安排每一個使用者依他們自己的喜好設定,理想上,使用者應能
自行設定而毋需藉系統管理者的幫助,下一節我們來看程式xdm 如何能幫助我
們達成這些目的。
20.2 xdm -- X顯示管理器(X Display Manager)的概觀
xdm 管理一或多個顯示器,xdm 可在同一機器或遠方的機器上執行。它可
以做到所有xinit 能做到的,而且更多。它所隱含的概念為它應控制當你在X
工作時的完整周期 (session),意即從你進入直到結束視窗系統的周期。(用
xinit ,有效周期為當你執行xinit 開始,到你結束(logout)最初的xterm
視窗和關閉server。)
xdm 較這更進一步:你可以用它執行一個不確定的周期。當一個結束,下
一個便准備開始。實際上,如果你有需要,它讓你不變地指定一個顯示器。
xdm 完全取代xinit 。從現在起你可忘掉xinit ,而且不再需要使用它,
我們在最初使用xinit 的原因為它較易觀察和了解系統的運作。
xdm 是一個非常靈活的程式,你幾乎可用它建構任何你所需要的,在進一
步深入之前,讓我們觀察一個范例周期的預設行為,然後我們來看一看你如
何改進當一個使用者進入X系統所看到的初始介面。
20.2.1 一個用xdm 的范例周期
我們將使用xdm 來設定在我們機器上執行的X。你的機器已經啟動,但尚
未有視窗系統在其上執行。用下列的命令啟始xdm
xdm
xdm 開始執行,你幾乎立刻又看到你的shell 提示。然後螢幕背景變更為
通常灰色形式,且你看到一個大的X游標,所以你知道server已經啟始。
接下來是一長段修止狀態 -- 大約接續15秒或更久 -- 而後突然間一個帶
著歡迎標題的視窗出現了,要求你的登錄名稱(login name)和密碼(password),
如圖20-1(這是xdm 的authentication widget )。輸入你的使用者名稱和密
碼,又過了一會兒,你可以看到一個xterm 視窗在左上角出現,就如同圖5-3
一般,從現在起,你工作的方式和以前相同 -- 啟動你的視窗管理器,執行應
用程式等等。
┌——————————————————————┐
│ FIG 20.1 P.251 │
│ │
│ 圖20-1 xdm 的 authentication widget │
└——————————————————————┘
當你需要結束時,你也可用像以前相同的方式結束:logout最初始的xterm
視窗。但這裡xdm 和xinit 有不相同的地方,代之關掉server的是,回到非X
的環境,螢幕回到最初始灰色的背景,過一下子之後,你又再度看到X的登錄
視窗。事實上,xdm 是執行一個循環的周期。
注意:就像許多的Unix程式,最大的登錄名稱長度為8 個字元 -- 如果超
過這個長度,login 將會失敗。(如果你的實際login 程式允許你使用較長的
名稱,這種限制也許讓你感到奇怪。)
關閉xdm
有時你可能需要完全地關閉X。為了做到這點,你需要關閉xdm 。
在MIT 版中的server,會依循如果收到Unix訊號SIGTERM ,便會執行中止
程序。xdm 利用到這點:如果你送給它一個SIGTERM ,它將中止所有它所控制
的server後離開。這就是你中止系統的方法。
欲實際地中止xdm ,可以在一個xterm 視窗(在你的機器上)用ps來找出
xdm 的process-id,而後用kill送給它SIGTERM (你將看到數個xdm 處理的執
行:那個最年輕的便是你要的,也就是說,最低的process-id)。例如,在我
們的機器上執行中止的動作:
venus% ps ax 1 grep xdm
1997 ? IW 0:00 xdm
1998 ? IW 0:00 xdm
2000 ? IW 0:00 xdm
2078 p0 S 0:00 grep xdm
venus% kill -TERM 1997
你所有的應用程式將被強迫中止,server也隨之關閉。
注意:當相關於X的每一件事都結束後,你的螢幕可能只顯示通常X背景
的灰色形式,沒有任何的shell 提示或任何事。不要被愚弄了:你的shell 已
准備好接受你的命令 -- 按下RETURN鍵你將會看到。(因為在你以交談式下
xdm 命令之後,shell 已將提示號送出,所以不再重覆 -- 除非你按下RETURN)。
20.3 有關xdm 的更多
我們在前所述為xdm 的預設模式的操作,所以看起來並沒有比xinit 提供
得更多,如果你使用一個正常的工作站或顯示器,一些外貌將不是很有趣。無
論如何,X終端機(x-terminal)是一個日漸增加的大眾化設備,而xdm 可大量
地簡化管理類似的系統。X終端機通常沒有它自己的檔案系統,且不能支援一
般目的的程式,必需在網路的某處執行包含視窗管理器和顯示管理器的控制終
端機軟體,xdm 正是符合此需要的軟體。
xdm 在下列這些場合較xinit 為優:
.它可控制數個server,也暗示說,其中有一些為遠方的server,也許是
在X終端機或相當小的工作站上。
.它提供密碼來存取系統,同樣地,在X終端機上非常有用(但在一個你
已經login 的工作站會有一點困擾。)
.它提供無限期的X的周期。你可以建構顯示器經常性地以X操作,所以