從事件設備擷取鍵輸入並映射它(切換觸摸板鍵未映射)
我有一台安裝了 Ubuntu 13.10 的聯想 IdeaPad Yoga 13。該設備的鍵盤上有一個“切換觸摸板”按鈕 (
F5
)。鍵盤的F*
按鈕是顛倒的(所以要得到F5
,我需要按Fn
+F5
,F5
實際上是切換鍵)。我發現該按鈕實際上是由鍵盤讀取的(而不是像某些設備那樣的觸摸板),它位於
/dev/input/event3
. 所以使用sudo input-events 3
我能夠弄清楚按鈕發送掃描碼190:輸出
sudo lsinput
:/dev/input/event3 bustype : BUS_I8042 vendor : 0x1 product : 0x1 version : 43907 name : "AT Translated Set 2 keyboard" phys : "isa0060/serio0/input0" bits ev : EV_SYN EV_KEY EV_MSC EV_LED EV_REP
輸出
sudo input-events 3
:23:13:03.849392: EV_MSC MSC_SCAN 190 23:13:03.849392: EV_SYN code=0 value=0 23:13:03.855413: EV_MSC MSC_SCAN 190 23:13:03.855413: EV_SYN code=0 value=0
除了 之外,似乎沒有其他程序(例如
xev
)能夠讀取它input-events
。有沒有辦法映射這個按鈕,讓它在我的筆記型電腦上切換觸摸板?如果是這樣,我該怎麼做?
事實證明,核心確實撿到了它,但一直抱怨它沒有被辨識。
對於遇到此問題或想要映射作業系統未讀取的密鑰的任何其他人,請繼續閱讀。
打開終端並執行
dmesg | grep -A 1 -i setkeycodes
. 這將為您提供多個這樣的條目:[ 9.307463] atkbd serio0: Unknown key pressed (translated set 2, code 0xbe on isa0060/serio0). [ 9.307476] atkbd serio0: Use 'setkeycodes e03e <keycode>' to make it known.
我們感興趣的是“setkeycodes”之後的十六進制值,在本例中是
e03e
. 如果你有多個,你可以執行tail -f /var/log/kern.log
. 完成後,您可以點擊您要查找的按鈕,這將為您提供與上面相同的行,同樣,我們只需要十六進制值。記下這一點。現在執行
xmodmap -pke | less
並找到適當的映射。就我而言,我需要映射它來切換我的觸摸板,這意味著我對以下行感興趣:keycode 199 = XF86TouchpadToggle NoSymbol XF86TouchpadToggle
如果您找不到您感興趣的內容,請閱讀@Gilles 答案,因為您也可以定義自定義映射,然後繼續閱讀(如果核心讀取它,您不需要將其添加到 xorg.conf。 d)
現在我執行了以下命令:
sudo setkeycodes [hexadecimal] [keycode]
,所以在我的情況下變成了:setkeycodes e03e 199
。現在您可以使用以下行來測試它是否有效和/或您是否擁有正確的映射:
xev | grep -A2 --line-buffered '^KeyRelease' | sed -n '/keycode /s/^.*keycode \([0-9]*\).* (.*, \(.*\)).*$/\1 \2/p'
執行此命令時,您需要關注新打開的視窗 (
xev
) 並檢查控制台輸出。就我而言,它的內容如下:207 NoSymbol
這顯然是錯誤的,因為我要求 keycode
199
,所以它被映射到XF86TouchpadToggle
. 再次查看xmodmap -pke
,發現keycode 207
實際上是映射到 的NoSymbol
,發現偏移量相差8,於是又試了setkeycodes
一遍命令,但是key映射到了keycode 191
。sudo setkeycodes e03e 191
這非常有效。
編輯——我提供的必須啟動的解決方案沒有。我明天會弄清楚並更新這個答案。現在我想你可以在手動啟動時執行它。