Уже были стоны и жалобы от меня по поводу несколько убогой клавиатуры, точнее раскладки, точнее расположению
Если коротко, команда ниже забиндит
sudo setkeycodes b7 127
Для других клавиатур и ноутбуков может сработать, но нужно уточнять сканкод (b7
в примере выше).
Эту команду помещаем в /etc/rc.local
или в аналогичный.
Кому нужно подробностей и альтернативных вариантов - смотрим под катом.
В современных системах почти все устройства ввода обслуживаются evdev. В пару с ними трудится udev. Последний может помочь первому в части переопределения сканкодов клавиш.
Собственно все инструкции описаны в:
less /lib/udev/hwdb.d/60-keyboard.hwdb
Вот выдержки, которых достаточно для настройки:
# - AT keyboard DMI data matches:
# evdev:atkbd:dmi:bvn*:bvr*:bd*:svn<vendor>:pn<product>:pvr*
# <vendor> and <product> are the firmware-provided strings
# exported by the kernel DMI modalias.
Эта часть описывает шаблон выбора для AT клавиатур. Да, встроенная клавиатура в T530 это AT клавиатура. Привет NKRO из коробки :) Но об этом дальше.
Следующая часть описывает шаги, которые нужно выполнить после настроек.
# To update this file, create a new file
# /etc/udev/hwdb.d/70-keyboard.hwdb
# and add your rules there. To load the new rules execute (as root):
# udevadm hwdb --update
# udevadm trigger /dev/input/eventXX
# where /dev/input/eventXX is the keyboard in question. If in
# doubt, simply use /dev/input/event* to reload all input rules.
Итак, определяем что у нас за клавиатура, смотрим выхлоп dmesg
:
...
[ 2.282100] input: AT Translated Set 2 keyboard as /devices/platform/i8042/serio0/input/input3
...
С вероятностью 147% оно всегда будет так. Запоминаем (особенно последнюю цифру):
/devices/platform/i8042/serio0/input/input3
Теперь определяем сканкод клавиши (подставляем цифру в конце, которую запомнили выше, т.е. input3
-> event3
):
sudo evtest /dev/input/event3
Получаем такой выхлоп:
...
Event: time 1487483975.506795, type 4 (EV_MSC), code 4 (MSC_SCAN), value b7
Event: time 1487483975.506795, type 1 (EV_KEY), code 99 (KEY_SYSRQ), value 0
Event: time 1487483975.506795, -------------- SYN_REPORT ------------
Если выхлоп не получаем, или получаем не тот, который ожидаем: просто перебираем разные номера для event.
Смотрим строку с MSC_SCAN
, значение сканкода поле value
- b7 искомый сканкод.
Кстати, клавиша определяется как KEY_SYSRQ
, но работает только как
Далее нам нужно имя клавиши (и код заодно), которые используются внутри ядра. Смотрим в
/usr/include/linux/input-event-codes.h
нужную клавишу. Имя для udev - нижним регистром имя макроопределения, без префикса KEY_
. Для setkeycodes
- dec значение.
Клавиша меню это:
#define KEY_COMPOSE 127
Имеем:
- Имя для udev: compose
- Код для
setkeycodes
: 127
Пишем правило для udev (/etc/udev/hwdb.d/70-thinkpath-t530-keyboard.hwdb
):
evdev:atkbd:dmi:bvn*:bvr*:bd*:svn*:pn*:pvr*
KEYBOARD_KEY_b7=compose # map PrtScr to Menu
Так как у нас только одна AT клавиатура, и другую подключить нельзя, то правило выше вполне имеет право на жизнь, но при желании можно уточнить как-то так:
evdev:atkbd:dmi:bvn*:bvr*:bd*:svnLENOVO*:pn*T530*:pvr*
KEYBOARD_KEY_b7=compose
Выполняем команды, которые рекомендуют в комментариях к исходному фалу базы:
sudo systemd-hwdb update
sudo udevadm trigger /dev/input/event*
И радуемся жизни. Или используем setkeycodes
:
sudo setkeycodes b7 127
тут всё понятно: b7 - узнанный сканкод. 127 - числовое значение KEY_COMPOSE
.
После этого, всё, что использует драйвер evdev, будет воспринимать кнопку setkeycodes
будет работать везде, где используется evdev. Стоит отметить, что сканкод платформо-специфичен. Под платформой понимается: AT PS/2, USB HID и т.п. Об этом планирую в другой статье рассказать.
Естественно после всех манипуляций выше вы лишаетесь кнопки Print Screen, но его функциональность в части снятия скриншотов это просто условность и можно настроить окружение так, что бы работала другая комбинация. А можно переназначить другую клавишу аналогичным способом. К примеру,
Другим решением может стать использовать кнопки Launch1.
Полезные ссылки на тему:
- https://wiki.archlinux.org/index.php/extra_keyboard_keys
- https://wiki.archlinux.org/index.php/Map_scancodes_to_keycodes
man 8 setkeycodes
man 1 loadkeys
- если хочется магии в консоли.