已解决 (2016-11-15):请参阅问题下方的更多内容。
问题的详细描述
我试图在 Lenovo Yoga 900-13ISK2 上按 Fn+F6 键时禁用触摸板(实际上,由于我的 BIOS 设置,我不必按 Fn 键)。
在尝试任何操作之前,每当我按下 Fn+F6 键时,我都会在以下位置得到以下信息dmesg
:
atkbd serio0: Unknown key pressed (translated set 2, code 0xbf on isa0060/serio0).
atkbd serio0: Use 'setkeycodes e03f <keycode>' to make it known.
atkbd serio0: Unknown key released (translated set 2, code 0xbf on isa0060/serio0).
atkbd serio0: Use 'setkeycodes e03f <keycode>' to make it known.
此外,每当我将笔记本电脑置于“平板电脑模式”时,我都可以在 dmesg 中看到以下内容:
atkbd serio0: Unknown key pressed (translated set 2, code 0xbf on isa0060/serio0).
atkbd serio0: Use 'setkeycodes e03f <keycode>' to make it known.
ideapad_laptop: Unknown event: 1
atkbd serio0: Unknown key released (translated set 2, code 0xbf on isa0060/serio0).
atkbd serio0: Use 'setkeycodes e03f <keycode>' to make it known.
因此,当进入平板电脑模式时,就像按下/释放 Fn+F6 键以及另一个事件一样。最后一个事件似乎与键盘的背光有关(因为按 Fn+Space 控制背光会在 中引起相同的日志dmesg
)。从平板电脑模式进入笔记本电脑模式时,仅
ideapad_laptop: Unknown event: 1
记录。
这一切都是在 Linux 4.8 上发生的。我使用 Ubuntu
config-4.4.0-43-generic
作为创建文件的基础.config
(如https://gist.github.com/mvaled/36b2aa23b194d33ecd5e43efe8905cba)。
之后,我创建了/etc/udev/hwdb.d/10-yoga.hwdb
:
evdev:atkbd:dmi:bvn*:bvr*:bd*:svnLENOVO:pn*80UE*:pvr*YOGA*900-13ISK2*
KEYBOARD_KEY_bf=touchpad_toggle
udevadm hwdb -u
在和(或重新启动)之后udevadm trigger
,按 Fn+F6 停止记录未知按键事件并evtest
显示按键:
Event: type 4 (EV_MSC), code 4 (MSC_SCAN), value bf
Event: type 1 (EV_KEY), code 530 (KEY_TOUCHPAD_TOGGLE), value 0
但触摸板仍保持启用状态。
我已经能够通过发出以下命令来禁用/启用触摸板:
$ xinput set-prop "SYNA2B29:00 06CB:77C6" 'Device Enabled' 0
$ xinput set-prop "SYNA2B29:00 06CB:77C6" 'Device Enabled' 1
此时我被困住了。哪个组件应该捕获 KEY_TOUCHPAD_TOGGLE 事件并对其执行某些操作?
我知道触摸板是由“i2c_designware_platform”驱动程序驱动的。键盘似乎是由“ideapad_laptop”驱动的。这合理吗?
解决方案
解决方案是将文件更改/etc/udev/hwdb.d/10-yoga.hwdb
为:
evdev:atkbd:dmi:bvn*:bvr*:bd*:svnLENOVO:pn*80UE*:pvr*YOGA*900-13ISK2*
KEYBOARD_KEY_bf=f21
@dirkt 提供了有关该文件的信息/usr/share/X11/xkb/symbols/inet
。阅读此文件可以清楚地看到 X11 将 F21 键映射到 XF86TouchpadToggle:
key <FK21> { [ XF86TouchpadToggle ] };
因此,我没有将扫描码映射到,touchpad_toggle
而是将其映射到功能键 F21。
无需脚本。
遗留问题
当您将笔记本电脑置于平板电脑模式时,该笔记本电脑会发送此事件。但是,当返回笔记本电脑模式时,它不会再次发送它,因此触摸板保持禁用状态。
此外,如果您在笔记本电脑模式下禁用触摸板,则进入平板电脑模式会启用它。
答案1
您已经解决了难题的所有困难部分:-)
您要么需要运行一个对切换命令做出反应的专用程序,要么使用一个正在运行并且可以对按键做出反应的现有程序。一些窗口管理器可以非常灵活地配置为对按键做出反应,例如我fvwm
在笔记本电脑上使用亮度和音量键。因此,请找出您正在使用的窗口管理器以及如何配置它。
xev
您可以通过运行、聚焦并按 Fn+F6找到 X 键码而不是内核键码。
第二个问题是要执行切换操作,您需要知道当前状态。最简单的方法可能是编写一个小 shell 脚本来读取Device Enabled
属性xinput
,然后使用 启用或禁用它xinput set-prop
。每当您收到找到的 X 偶数代码时,请从窗口管理器运行此 shell 脚本(如果可以的话)。
解决方案
解决方案是将文件更改/etc/udev/hwdb.d/10-yoga.hwdb
为:
evdev:atkbd:dmi:bvn*:bvr*:bd*:svnLENOVO:pn*80UE*:pvr*YOGA*900-13ISK2*
KEYBOARD_KEY_bf=f21
@dirkt 提供了有关该文件的信息/usr/share/X11/xkb/symbols/inet
。阅读此文件可以清楚地看到 X11 将 F21 键映射到 XF86TouchpadToggle:
key <FK21> { [ XF86TouchpadToggle ] };
因此,我没有将扫描码映射到,touchpad_toggle
而是将其映射到功能键 F21。
无需脚本。
遗留问题
当您将笔记本电脑置于平板电脑模式时,该笔记本电脑会发送此事件。但是,当返回笔记本电脑模式时,它不会再次发送它,因此触摸板保持禁用状态。
此外,如果您在笔记本电脑模式下禁用触摸板,则进入平板电脑模式会启用它。
答案2
在 xorg 下使用 synaptics,我经常使用:
synclient touchpadoff=1 # for disable and =0 for enable