从事件设备捕获键输入并映射它(切换触摸板键未映射)

Hos*_*diq 10 drivers kernel input events

我有一台安装了 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
Run Code Online (Sandbox Code Playgroud)

的输出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
Run Code Online (Sandbox Code Playgroud)

没有其他的程序(如xev)似乎能够阅读它除了input-events。有什么方法可以映射此按钮以使其在我的笔记本电脑上切换触摸板?如果是这样,我该怎么做?

Hos*_*diq 7

事实证明,内核确实捡到了它,但一直抱怨它没有被识别。

对于遇到此问题或想要映射操作系统未读取的密钥的任何其他人,请继续阅读。

打开终端并运行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.
Run Code Online (Sandbox Code Playgroud)

我们感兴趣的是“setkeycodes”之后的十六进制值,在本例中是e03e. 如果您有多个这些,您可以运行tail -f /var/log/kern.log. 一旦你这样做了,你可以点击你正在寻找的按钮,这会给你一个与上面相同的行,同样,我们只需要十六进制值。记下这一点。

现在运行xmodmap -pke | less并找到适当的映射。就我而言,我需要映射它以切换我的触摸板,这意味着我对以下行感兴趣:

keycode 199 = XF86TouchpadToggle NoSymbol XF86TouchpadToggle
Run Code Online (Sandbox Code Playgroud)

如果您找不到您感兴趣的任何内容,也请阅读@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'
Run Code Online (Sandbox Code Playgroud)

运行此命令时,您需要关注新打开的窗口 ( xev) 并检查控制台输出。就我而言,它的内容如下:

207 NoSymbol
Run Code Online (Sandbox Code Playgroud)

这显然是错误的,因为我请求的是 keycode 199,所以它被映射到XF86TouchpadToggle. 我xmodmap -pke再次检查,发现keycode 207实际上映射到NoSymbol,并且我注意到偏移量差异为 8,因此我setkeycodes再次尝试该命令,但键映射到keycode 191.

sudo setkeycodes e03e 191
Run Code Online (Sandbox Code Playgroud)

这工作得很好。

编辑——我提供的必须在启动时工作的解决方案没有。我明天会解决这个问题并更新这个答案。现在我想你可以在手动启动时运行它。