Как использовать libinput вместо xinput?
Клавиатура моего ноутбука больше не работает. Поэтому я написал скрипт, который отключил бы встроенную клавиатуру xinput float ID
, В новой версии Ubuntu (17.10) это больше не работает из-за обновления Wayland.
Когда я Iist мои устройства с 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
[...]
Rapoo E6100 - рабочая клавиатура, а AT Translated Set 2 - сломанная встроенная клавиатура.
Я читал, что для того, чтобы игнорировать устройство, его возможности могут быть удалены ( https://wayland.freedesktop.org/libinput/doc/latest/udev_config.html). Как этого можно достичь с помощью libinput?
Или есть возможность просто игнорировать группу 9?
1 ответ
Быстрый и грязный способ отключения клавиатуры может заключаться в использовании evtest
схватить это. Затем события доставляются в тестовую программу и больше не проходят через графический сервер.
$ sudo evtest --grab /dev/input/event4 >/dev/null
Вы должны оставить эту программу запущенной все время.
Более сложный способ отключить устройство - добавить для него правило udev, которое устанавливает ID_INPUT
опустошить, чтобы 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_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
,