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