Jump to content

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

2 languages

- English
- 日本語

From ArchWiki

Повʼязані статті

- Input remap utilities
- Linux console/Keyboard configuration
- Xbindkeys
- Xmodmap

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

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

## Установка

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

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

- interception-caps2esc to switch `CapsLock` with `Ctrl`/`Esc`
- interception-caps2esc-delay-gitAUR
- interception-caps2esc-nocaps-gitAUR
- interception-dual-function-keys to modify the behavior of a key when held.
- interception-hideawayAUR
- interception-k2k-gitAUR
- interception-ralt2hyperAUR
- interception-space2metaAUR
- interception-uswitchAUR
- interception-vimproved-gitAUR
- interception-xswitchAUR

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

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

Categories:

- Input devices (Українська)
- Keyboard configuration (Українська)