如何使用 libinput 代替 xinput?

如何使用 libinput 代替 xinput?

我的笔记本电脑的键盘不再工作了。因此,我编写了一个脚本,可以使用 禁用板载键盘xinput float ID。在新版本的 Ubuntu (17.10) 上,由于对 wayland 的更新,此功能不再起作用。

当我使用 列出我的设备时sudo libinput list-devices,我得到:

[...]
Device:           Rapoo E6100
Kernel:           /dev/input/event13
Group:            6
Seat:             seat0, default
Capabilities:     keyboard
Tap-to-click:     n/a
Tap-and-drag:     n/a
Tap drag lock:    n/a
Left-handed:      n/a
Nat.scrolling:    n/a
Middle emulation: n/a
Calibration:      n/a
Scroll methods:   none
Click methods:    none
Disable-w-typing: n/a
Accel profiles:   n/a
Rotation:         n/a
[...]
Device:           AT Translated Set 2 keyboard
Kernel:           /dev/input/event4
Group:            9
Seat:             seat0, default
Capabilities:     keyboard
Tap-to-click:     n/a
Tap-and-drag:     n/a
Tap drag lock:    n/a
Left-handed:      n/a
Nat.scrolling:    n/a
Middle emulation: n/a
Calibration:      n/a
Scroll methods:   none
Click methods:    none
Disable-w-typing: n/a
Accel profiles:   n/a
Rotation:         n/a
[...]

雷柏E6100是工作键盘,AT 翻译套装 2 键盘是板载键盘损坏了。

我读到,为了忽略某个设备,可以从中删除该设备的功能(https://wayland.freedesktop.org/libinput/doc/latest/udev_config.html#udev_device_type)。如何使用libinput实现这一点?

或者是否有可能直接忽略第 9 组?

答案1

禁用键盘的一个快速而肮脏的方法可能是evtest使用抓住然后事件被传递到测试程序,而不再传递到图形服务器。

$ sudo evtest --grab /dev/input/event4 >/dev/null

您必须让此程序始终运行。


禁用该设备的更困难的方法是为其添加一个设置ID_INPUT为空的 udev 规则,以便 libinput 会忽略它。我还没有尝试过以下方法,因此请将其用作探索指南,而不是最终解决方案。

首先,列出键盘事件设备的 udev 信息,例如:

$ udevadm info /dev/input/event4
...
E: ID_INPUT=1
E: ID_INPUT_KEY=1
E: ID_INPUT_KEYBOARD=1
E: ID_SERIAL=05f3_0007

现在,您必须找到可以唯一标识您的设备的东西。通常,这是 USB 供应商和产品 ID(如上所示ID_SERIAL)。E:前缀表示此变量是在 udev 环境中设置的,因此在 udev 规则中,您应该说您想要匹配ENV{ID_SERIAL}=="05f3_0007"

但是,对于您的笔记本电脑,您可能需要找到其他匹配项。您可以在设备树的更高层搜索,以找到具有更易于匹配的属性的父级:

$ udevadm info -a /dev/input/event4
...
looking at parent device '/devices/pci0000:00/.../input/input4':
  KERNELS=="input4"
  SUBSYSTEMS=="input"
  ATTRS{name}=="HID 05f3:0007"
  ...

因此,udev 规则可以匹配 ID_SERIAL,而不是匹配ATTRS{name}=="HID 05f3:0007"。对于您的情况,我期望的是ATTRS{name}=="AT Translated Set 2 keyboard"

找到合适的匹配项后,创建自己的文件/etc/udev/rules.d/99-my.rules(以 99 开头以使规则最后),使用覆盖规则将值重置ID_INPUT为空。严格遵守此文件的格式。请注意,除了最后一个条件外,所有条件都是与 进行比较,==最后一个条件是使用单个 进行赋值=

ACTION=="add|change", ENV{ID_SERIAL}=="05f3_0007", ENV{ID_INPUT}=""

或者更可能的情况是:

ACTION=="add|change", ATTRS{name}=="AT Translated Set 2 keyboard", ENV{ID_INPUT}=""

通常,udev 应该会自动注意到文件的更改,但如果没有sudo udevadm control --reload,您可以尝试触发设备的更改:

$ sudo udevadm trigger --action=change /dev/input/event4

我不确定这对于固定设备如何工作,因为对于 USB 设备,通常您可以简单地拔下它并重新插入,因此您可能需要重新启动。

您可以使用 监视 udev 正在做什么udevadm monitor

相关内容