第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 -
第二列的短橫線是必需的,如果少了它,程式將只完成預設的作用 (列出修飾
鍵的對應) 。除了在檔案中輸入規格之外,你也可以在命令列中用 -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來附屬"。例如