Переназначение клавиш клавиатуры
Задача: сделать так, чтобы некоторая клавиша клавиатуры (например, Sleep) начала распознаваться по-другому (например, как F14).
Это нужно в двух случаях:
- чтобы при нажатии Power, Sleep или им подобным не запускалось соответствующее действие
- чтобы при нажатии редкой или вообще не распознаваемой клавиши приезжал известный код (к которому можно привязать или уже привязаны действия)
PS/2
TODO с помощью setkeycodes и loadkeys
USB
Настройку различных внешних устройств делает udev. Для тонкой настройки он пользуется специальной базой данных — HWDB. Стандартная настройка HWDB лежит в файлах каталога /lib/udev/hwdb.d/ (там можно посмотреть примеры), дополнительная — в файлах подкаталога /etc/udev/hwdb.d. После исправления HWDB надо пересобирать (файл /etc/udev/hwdb.bin) и сообщать udev-у, что устройство изменилось.
- (0) Отключение реакции по умолчанию. Если вы (как я) пытаетесь переопределить клавишу Power или Sleep, сначала надо временно отключить обработку этой клавиши со стороны logind или acpid, иначе при каждом нажатии компьютер будет выключаться/засыпать.
- (1) Определение устройства. В системе есть несколько input-устройств, чтобы выбрать нужное, надо запустить evtest и понажимать на нужную клавишу.
- Одна клавиатура может распознаваться как несколько, в моём случае основные клавиши видны на event4, а Sleep оказалась на event5
- Смотрим на значение VALUE поля MSC_SCAN
$ evtest $ No device specified, trying to scan all of /dev/input/event* $ Available devices: $ /dev/input/event0: USB Laser Game Mouse $ /dev/input/event1: USB Laser Game Mouse $ /dev/input/event2: USB Laser Game Mouse Consumer Control $ /dev/input/event3: USB Laser Game Mouse $ /dev/input/event4: NOVATEK USB Keyboard $ /dev/input/event5: NOVATEK USB Keyboard System Control $ /dev/input/event6: NOVATEK USB Keyboard Consumer Co ... Select the device event number [0-23]: 5 Input driver version is 1.0.1 Input device ID: bus 0x3 vendor 0x461 product 0x10 version 0x110 Input device name: "NOVATEK USB Keyboard System Control" ... Event: time 1557767075.173940, type 4 (EV_MSC), code 4 (MSC_SCAN), value 10082 ...
- (3) Идентификатор устройства. Есть несколько способов идентифицировать устройство в настройке HWDB, самый простой — по USB ID, который виден в выводе evtest: bus 0x3 vendor 0x461 product 0x10
- TODO: другие способы?
- (4) Файл настройки. Создадим файл настройки /etc/udev/hwdb.d/20-kbd.hwdb, заменяющий код клавиши на F14; обратите внимание на аббревиатуру, она повторяет предыдущую строку
evdev:input:b0003v0461p0010* KEYBOARD_KEY_10082=f14
- (5) Обновление базы: systemd-hwdb -s update
- (6) Проверка заполнения HWDB:
$ systemd-hwdb query 'evdev:input:b0003v0461p0010*' KEYBOARD_KEY_10082=f14
- (7) Повторная регистрация клавиатуры: udevadm trigger /dev/input/event5
- (8) Проверка. Можно снова запустить evtest /dev/input/event5, чтобы убедиться, что при нажатии Sleep выводилось что-то вроде
Event: time 1557768424.373223, type 4 (EV_MSC), code 4 (MSC_SCAN), value 10082 Event: time 1557768424.373223, type 1 (EV_KEY), code 184 (KEY_F14), value 1
- (9) Включение реакции по умолчанию. Имеет смысл вернуть на место обработку клавиш типа Power, если они нажаты не на клавиатуре, а на корпусе, например.