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

Повʼязані статті
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-git
AUR
interception-caps2esc-nocaps-git
AUR
interception-dual-function-keys
to modify the behavior of a key when held.
interception-hideaway
AUR
interception-k2k-git
AUR
interception-ralt2hyper
AUR
interception-space2meta
AUR
interception-uswitch
AUR
interception-vimproved-git
AUR
interception-xswitch
AUR
Налаштування
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