Extra keyboard keys
許多鍵盤都有一些"特殊按鍵"(也叫熱鍵),用於執行某個應用程序或者輸入那些不被包含在標準鍵盤映射表中的特殊字符。由於沒有相應的規格標準,內核無法知道如何處處理它們,這也是為什麼我們需要(手工的)將這些按鍵映射到特定的動作。我們有兩種方法來實現:
- 通用的做法,使用 Xorg 提供的工具 (以及桌面環境的工具)。
開始之前,你需要學習一些(新)詞彙...
掃描碼(scancode)是一個鍵的最小識別 ID。如果一個鍵沒有掃描碼值,我們無法做任何事,因為內核看不到它。
鍵位碼(keycode)是一個鍵的第二級識別 ID,對應到一個函數。
符號(symbol)是一個鍵的第三級識別 ID,Xorg 通過該 ID 引用按鍵。
第一步: 映射掃描碼[編輯 | 編輯原始碼]
你的大部分按鍵應該已經有鍵位碼了,或者至少有掃描碼。沒有掃描碼的鍵無法被內核識別。
使用 xev[編輯 | 編輯原始碼]
使用圖形界面程序 "xev" (不需要切換到終端環境)。安裝 xev 程序:
# pacman -S xorg-xev
使用下面一行命令你可以啟動 xev 然後直接 grep 到重要的部分:
$ xev | grep -A2 --line-buffered '^KeyRelease' | sed -n '/keycode /s/^.*keycode \([0-9]*\).* (.*, \(.*\)).*$/\1 \2/p'
在下面的例子中,我按下 "a", "r", "c" 和 "h" 鍵,以及兩個我的 Dell 鍵盤上的媒體鍵。這樣我得到以下輸出:
38 a 27 r 54 c 43 h 153 NoSymbol 144 NoSymbol
這個輸出的意思是 "a", "r", "c" 和 "h" 鍵的鍵位碼分別是 38, 27, 54 和 43 並且被正確的映射。而鍵位碼 153 和 144 的媒體鍵沒有對應的功能,使用 "NoSymbol" 指示。如果你按下一個按鍵之後終端裡沒有顯示,那就意味這內核無法看到這個按鍵或者沒有映射。
使用 showkey[編輯 | 編輯原始碼]
通常來說,使用showkey
程序可以知道你的按鍵是否擁有一個keycode。使用showkey程序後,你可以按下一個按鍵來查看屏幕上的輸出,如果什麼都不做,程序將在10秒後退出,這也是退出showkey程序的唯一方法。你需要在一個真正的控制台下執行showkey程序,就是說你得切出圖形界面,用ctrl+alt+F1組合鍵就能回到命令行的界面了。
$ showkey
嘗試按下你的按鍵。如果有keycode輸出則說明這個鍵是被映射了的。如果沒有,啊,真是一個悲劇。這說明內核認不出這個鍵或者是這個按鍵還沒被映射。
2.6 內核[編輯 | 編輯原始碼]
根據 keymap man page:
有可能 keymaps 從 showkey 獲取的以及 setkeycodes 是設置的鍵位碼與 X 中的 xev 獲取的值不同。記住當把 keymaps 翻譯成 keysyms 時,使用 xmodmap (參見 Extra keyboard keys in Xorg).
如果找到了鍵盤碼,請跳到後面的第二步,否則:
檢查掃描碼[編輯 | 編輯原始碼]
如果按鍵沒有鍵盤碼,可以通過 dmesg 命令從內核日誌中查找掃描碼:
# dmesg|tail -5
按下按鍵後可以看到:
atkbd.c: Unknown key pressed (translated set 2, code 0xf1 on isa0060/serio0). atkbd.c: Use 'setkeycodes e071 <keycode>' to make it known.
這樣就找到了按鍵的掃描碼,可以映射到鍵盤碼,參見 Map scancodes to keycodes。
如果沒有新日誌信息,說明內核不識別這個按鍵,無法使用它。
第二步: 映射按鍵碼[編輯 | 編輯原始碼]
終端中[編輯 | 編輯原始碼]
終端中可以用熱鍵打印某個字符或字符串,如果字符串設置為命令加回車,將自動執行命令!
詳情參見: Extra keyboard keys in console。
Xorg 中[編輯 | 編輯原始碼]
圖形環境中有多種方式將熱鍵映射到命令,參見:Extra keyboard keys in Xorg。
筆記本[編輯 | 編輯原始碼]
Asus M series[編輯 | 編輯原始碼]
可能在其它系列中也可以使用,使用下面方法可以使用多媒體按鍵,禁用光傳感器:編輯 /etc/rc.local
,添加:
$ echo 0 > /sys/devices/platform/asus-laptop/ls_switch