问题的详细描述

问题的详细描述

已解决 (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

相关内容