Kernel

從事件設備擷取鍵輸入並映射它(切換觸摸板鍵未映射)

  • March 19, 2015

我有一台安裝了 Ubuntu 13.10 的聯想 IdeaPad Yoga 13。該設備的鍵盤上有一個“切換觸摸板”按鈕 ( F5)。鍵盤的F*按鈕是顛倒的(所以要得到F5,我需要按Fn+ F5F5實際上是切換鍵)。

我發現該按鈕實際上是由鍵盤讀取的(而不是像某些設備那樣的觸摸板),它位於/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

這非常有效。

編輯——我提供的必須啟動的解決方案沒有。我明天會弄清楚並更新這個答案。現在我想你可以在手動啟動時執行它。

引用自:https://unix.stackexchange.com/questions/103230