X Window 系統使用指南--鍵盤和滑鼠--對應和參數
第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對一些常見的特性作設定,如 鍵的滴答聲、終端機的響鈴、螢幕節約器和滑鼠的速度 ('加速')。