interception-tools (Українська)
interception-tools це набір утиліт для контролю та налаштування поведінки клавіатурного вводу, та вводу загалом.
Interception-tools працює на нижчому рівні за схожі інструменти (xcape, xmodmap) завдяки використанню libevdev та libudev(3). Це робить його одним з небагатьох варіантів для налаштування поведінки клавіатури у X11, Wayland та Linux console.
Установка
Установіть interception-tools.
Доступно чимало вже готових плагінів:
- interception-caps2esc to switch
CapsLock
withCtrl
/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 &
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