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

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

我有一台安装了 Ubuntu 13.10 的 Lenovo 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。有什么方法可以映射此按钮以使其在我的笔记本电脑上切换触摸板吗?如果是这样,我该怎么做?

答案1

事实证明,内核确实接收到了它,但一直抱怨它未被识别。

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

打开终端并运行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再次尝试了该命令,但键映射到了keycode 191

sudo setkeycodes e03e 191

这非常有效。

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

答案2

从表面上看,该设备是一个键盘(在软件中被识别为与“核心”键盘分开),但 X 服务器没有监听它。

尝试在下面添加一个输入部分/etc/X11/xorg.conf.d。也就是说,/etc/X11/xorg.conf.d如果目录尚不存在,则创建一个目录,并extra-keyboard-buttons在该目录中创建一个包含以下内容的文件

Section "InputClass"
    Identifier "extra-keyboard-buttons"
    Driver "kbd"
    MatchProduct "AT Translated Set 2 keyboard"
EndSection

我不确定那条MatchProduct线;如果它不起作用,请尝试摆弄MatchXXX指令

一旦正确设置了该文件,当您启动 X 服务器时,它应该处理来自该键盘的事件,并且您应该在其中xev和其他地方看到事件。记下键码(我不确定 X11 键码是否与本例中的硬件键码相同)并将键符号与其关联。您可以通过.Xmodmap主目录中调用的文件来完成此操作,其中包含

keycode 190 = XF86_Launch5

你现在可以定义键盘快捷键使用这些键。

要切换触摸板,请使用命令xinput。运行xinput list以查看可用的输入设备并记下触摸板的名称(我将Touchpad在下面称呼它)。运行xinput list-props Touchpad以列出其属性;其中之一应称为“Device Enabled”,旁边有一个数字(例如 135)。以下脚本将切换触摸板:

#!/bin/sh
device_name='Touchpad'
property=135
flipped_state=$(xinput list-props "$device_name" |
                awk "/\\($property\\)/ {print 1 - \$NF}")
xinput set-prop "$device_name" "$property" "$flipped_state"

将其保存在文件中~/bin/toggle-touchpad并使其可执行 ( chmod +x ~/bin/toggle-touchpad)。要将其绑定到密钥,请安装xbindkeys并将其配置为运行您的脚本,方法是将以下行放入~/.xbindkeysrc

"toggle-touchpad"
  XF86_Launch5

相关内容