捕获来自事件设备的键输入并对其进行映射(未映射切换的触摸板键)


10

我有安装了Ubuntu 13.10的Lenovo IdeaPad Yoga 13。设备在键盘(F5)上具有“切换触摸板”按钮。键盘的F*按钮是反向的(要得到F5,我需要按Fn+ F5F5实际上是切换键)。

我发现按钮实际上是由位于的键盘(而不是像某些设备的TouchPad)读取的/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。有什么方法可以映射此按钮以使其在笔记本电脑上切换触摸板?如果是这样,我该怎么办?

Answers:


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.

我们感兴趣的是“ 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

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

sudo setkeycodes e03e 191

这工作得很好。

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


1
如何以一种不错的方式使其永久化?(即在重置/启动后)
vak

4

从外观上看,该设备是键盘(在软件中与“核心”键盘分开识别),但是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键码是否与硬件键码相同),并将一个keyym与其关联。您可以通过.Xmodmap主目录中包含

keycode 190 = XF86_Launch5

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

要切换触摸板,请使用命令xinput。运行xinput list以查看可用的输入设备,并记下触摸板的名称(Touchpad以下将其称为)。运行xinput list-props Touchpad以列出其属性;其中之一应称为“已启用设备”,其旁边有一个数字(例如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

感谢您的回答。不幸的是,这没有用。虽然可以,但请随时查看我自己的答案!:)
Hosh Sadiq 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.