Jump to content

interception-tools (Українська)

From ArchWiki

interception-tools це набір утиліт для контролю та налаштування поведінки клавіатурного вводу, та вводу загалом.

Interception-tools працює на нижчому рівні за схожі інструменти (xcape, xmodmap) завдяки використанню libevdev та libudev(3). Це робить його одним з небагатьох варіантів для налаштування поведінки клавіатури у X11, Wayland та Linux console.

Установка

Установіть interception-tools.

Доступно чимало вже готових плагінів:

Налаштування

Intercept-tools складаються з інструментів командного рядка та сервісу systemd.

Необхідно додати налаштування за адресою /etc/interception/udevmon.yaml перед тим як запускати сервіс udevmon.service.

Примітка: Спочатку читаються налаштування з файлів в директорії /etc/interception/udevmon.d/ а якщо їх немає використовується /etc/interception/udevmon.yaml.

Як воно працює

libevdev - це, по суті, read(2) на стероїдах для пристроїв /dev/input/eventX. Він знаходиться між ядром і процесом який обробляє події вводу. У найпростішому випадку, наприклад, для інструментів типу evtest, це матиме такий вигляд:

kernel | libevdev | evtest

Або для модулів вводу X.Org:

kernel | libevdev | xf86-input-evdev | X server | X client

Чи для Wayland:

kernel | libevdev | Compositor | Wayland client

Тобто libevdev знаходиться настільки близько до ядра що просто не знає про роботу X/Wayland/tty клієнтів.

Практика

Interception-tools має 4 утиліти:

  • intercept: переспрямовує події вводу в sdtout,
  • mux: поєднує потоки різних пристроїв,
  • udevmon: слідкує за пристроями вводу та запускає задачі,
  • uinput: повертає події вводу з stdin в віртуальний пристрій вводу.

Підвищений пріоритет

Оскільки udevmon працює із найнижчим рівнем, одразу біля пристроїв вводу, йому варто надати найвищій пріоритет щоб уникнути затримок чи помилок. Наприклад так, із логуванням в файли і конфігурацією udevmon.yaml:

# nice -n -20 udevmon -c udevmon.yaml > udevmon.log 2> udevmon.err &
Примітка: Systemd сервіс udevmon.service виконується із Nice=-20.

Переспрямування

Найпростіше використання це переспрямування з одного пристрою в віртуальний, без обробки:

$ intercept -g ПРИСТРІЙ | uinput -d ПРИСТРІЙ

де ПРИСТРІЙ це шлях до системного відображення реального пристрою вводу, наприклад /dev/input/by-path/platform-i8042-serio-0-event-kbd.

Примітка: прапорець -g необхідний для отримання ексклюзивного доступу до пристрою, що дозволить новому віртуальному пристрою повністю замінити його: uinput захоплює його, а інші зможуть захопити клон.

Обробка

Для того щоб обробити ввід і змінити його достатньо просто додати обробку в конвеєр між intercept та uinput.

Наприклад із встановленим interception-caps2esc плагіном:

$ intercept -g ПРИСТРІЙ | caps2esc | uinput -d ПРИСТРІЙ
Примітка: Якщо не використовувати прапорець -g пристрій не буде захоплено, intercept буде лише відстежувати його.

Налаштування через YAML

This way of intercepting the input can quickly become sub-optimal, this is where udevmon comes in handy. udevmon accepts a YAML configuration with a list of jobs (sh commands by default) to be executed.

In case the device matches a given description:

$ udevmon -c caps2esc.conf.yml
- JOB: intercept -g DEVNODE | caps2esc | uinput -d DEVNODE
  DEVICE:
    LINK: /dev/input/by-path/platform-i8042-serio-0-event-kbd

The LINK configuration will match a device with a specific name, but it will accept also a regex option. This can be combined with multiple job specifications to create a default behavior, in each case only the first matching job is going to be executed:

- JOB: intercept -g DEVNODE | caps2esc -m 2 | uinput -d DEVNODE
  DEVICE:
    LINK: /dev/input/by-id/usb-SEMITEK_USB-HID_Gaming_Keyboard_SN0000000001-event-kbd
- JOB: intercept -g DEVNODE | caps2esc | uinput -d DEVNODE
  DEVICE:
    EVENTS:
      EV_KEY: [[KEY_CAPSLOCK, KEY_ESC]]
    LINK: .*-event-kbd

Об'єднання пристроїв

Beside input emulation, the uinput tool also serves purpose to print a device's description in YAML format:

$ uinput -p -d /dev/input/by-id/my-kbd

which itself can be fed back to uinput as:

$ uinput -c my-kbd.yaml

It can also merge device and YAML characteristics, which can be used for instance to combine events coming from keyboard and mouse:

e.g. instance CapsLock+Click as Ctrl+Click

$ uinput -p -d /dev/input/by-id/my-kbd -d /dev/input/by-id/my-mouse -c my-extra.yaml

Паралельні задачі

Утиліта mux використовується для поєднання декількох потоків в один. Спочатку створюєтьсяміксер, і після цього він може бути використаний як споживач чи джерело в різних потоках. В конфігурації формату YAML міксер створюється за допомогою ключа CMD. Він працює окремо від інших задач створених ключами JOB.

В наступному прикладі ввід від клавіатури захоплюється міксером на ім'я cap2sec_mixer що був створений ключем CMD. Відстежуваний (не перехоплений) ввід від миши також спрямовується в цей міксер Клавіши миши генерують події EV_KEY, тож caps2esc зможе їх обробити, перетворюючи "CapsLock + кнопка миши" на "Ctrl + кнопка миши.

- CMD: mux -c caps2esc_mixer
- JOB: mux -i caps2esc_mixer | caps2esc | uinput -c /etc/interception/gaming-keyboard.yaml
- JOB: intercept -g DEVNODE | mux -o caps2esc_mixer
  DEVICE:
    LINK: /dev/input/by-id/my-kbd
- JOB: intercept DEVNODE | mux -o caps2esc_mixer
  DEVICE:
    LINK: /dev/input/by-id/my-mouse