systemd-hwdb thinkpad t490s keyboard buttons remap

Добрый вечер! Начинавем утренний сеанс боли!

У меня на ноутбуке немецкая клавиатура. Мне в целом всё равно какие там значки где нарисованы, но вто то что левый шифт маленький, а справа от него кнопка с <> — это вообще почему как зачем. Я не могу одной рукой нажать прекрасный шорткат <ctrl>+<shift>+<alt>+c!

В пррошлом у меня уже была точно такая же проблема, но это было ещё во время когда systemd не покорил мир и нет даже уверенности что это было не в hal.

Ну а нынче, значит, это даже не udev, а уже systemd-hwdb что какая-то одна и та же херня и непонятно почему зачем для чего.

Этот пост уровень боли один, уровень боли wacom будет позже.

Вам понадобится три консоли, две из них под рутом.

В первой обычной нерутовой вы делаете:

# nvim /usr/lib/udev/hwdb.d/60-keyboard.hwdb

Этот файл будет нашей путеводной звездой.

Во второй рутовой консоли вы делаете:

# true > /etc/udev/hwdb.d/72-tp-t490s-keyboard.hwdb
# nvim /etc/udev/hwdb.d/72-tp-t490s-keyboard.hwdb

В третьей рутовой консоли вы начинаете плакать от жалости к себе.

Для начала нам понадобится узнать как называется клавиатура, понятия не имею как это сделать адекватно, но сделаем это неадекватно (похоже, это и есть адекватно):

# evtest

No device specified, trying to scan all of /dev/input/event*
Available devices:
/dev/input/event0:	Sleep Button
/dev/input/event1:	Lid Switch
/dev/input/event10:	HDA Intel PCH HDMI/DP,pcm=7
/dev/input/event11:	HDA Intel PCH HDMI/DP,pcm=8
/dev/input/event12:	Elan Touchpad
/dev/input/event13:	Elan TrackPoint
/dev/input/event14:	Keychron Keychron K1 SE
/dev/input/event15:	Keychron Keychron K1 SE
/dev/input/event16:	Logitech Gaming Mouse G402
/dev/input/event17:	Logitech Gaming Mouse G402 Keyboard
/dev/input/event2:	Power Button
/dev/input/event3:	AT Translated Set 2 keyboard
/dev/input/event4:	Video Bus
/dev/input/event5:	PC Speaker
/dev/input/event6:	ThinkPad Extra Buttons
/dev/input/event7:	HDA Intel PCH Mic
/dev/input/event8:	HDA Intel PCH Headphone
/dev/input/event9:	HDA Intel PCH HDMI/DP,pcm=3

Select the device event number [0-17]: 3

Input driver version is 1.0.1
Input device ID: bus 0x11 vendor 0x1 product 0x1 version 0xab54
Input device name: "AT Translated Set 2 keyboard"
Supported events:
...

Смотрим на список доступных устройств, выбираем <3>, оно там что-то пишет про что-т доступное и потом начинает ждать нажимания на кнопки. Нажимаем на эту дурацкую кнопку и получаем:

Properties:
Testing ... (interrupt to exit)
Event: time 1701374575.257013, type 4 (EV_MSC), code 4 (MSC_SCAN), value 56
Event: time 1701374575.257013, type 1 (EV_KEY), code 86 (KEY_102ND), value 1

И вот у нас уже есть всё что у нас есть!

Радостно бежим во вторую консоль (где открыт файл с будущими правилами) и горько плачем от осознания полного неосознания. Но правило надо всё же написать поэтому открываем консоль один и внимательно смотрим на то что на что мы смотреть не хотим. Но ищем там две вещи:
1. Зачем?
2. Почему?
3. За что?

Не найдя, смотрим на вообще формат и как заматчить нашу клавиатуру. Заматчить несложно, в начале этого файла есть:

#  - Input driver device name and DMI data match:
#      evdev:name:<input device name/>:dmi:bvn*:bvr*:bd*:svn:pn*
#    <input device name/> is the name device specified by the
#    driver, </vendor>

Формат файла тоже какое-то говно с оступом правила в один пробел от матча. Это зачем? Почему? За что? (Нашли!!!)

Ищем в этом же файле как называется кнопка которая нам нужна как результат, у меня это leftshift

Собираем наш увеселительный конструктор из запчастей разбросанных выше:

Input device ID: bus 0x11 vendor 0x1 product 0x1 version 0xab54
Input device name: "AT Translated Set 2 keyboard"

Event: time 1701374575.257013, type 4 (EV_MSC), code 4 (MSC_SCAN), value 56
Event: time 1701374575.257013, type 1 (EV_KEY), code 86 (KEY_102ND), value 1

Нам нужно имя устройства и значения первой строки где MSC_SCAN:

# @link https://hshhhhh.name/2023/12/01/4866/
# thinkpad t490s german keyaboard
evdev:name:AT Translated Set 2 keyboard:dmi:bvn*:bvr*:bd*:svn*:pn*
 KEYBOARD_KEY_56=leftshift # button on right of the left shift <> -- remap to left shift

Hint: оставляйте крайне избыточниые комментарии потому что в следущий раз вы сюда попадете лет через 6 и будете горько плакать, ибо линукс — это путь боли и отчаяния.

Чтош. Теперь сохраняем файл, идем в третью консоль и делаем там:

# systemd-hwdb update
# udevadm trigger
# udevadm info /dev/input/event3 | grep KEYBOARD_KEY
E: KEYBOARD_KEY_56=leftshift

# evtest 

...

Testing ... (interrupt to exit)

Event: time 1701378948.076153, type 4 (EV_MSC), code 4 (MSC_SCAN), value 56
Event: time 1701378948.076153, type 1 (EV_KEY), code 42 (KEY_LEFTSHIFT), value 1

Ура волшебство удача победа!

Но у вас наверняка возникнет вопрос что же делать если что-то не получается, а ведь как бы ну не может быть чтобы кто-то мог с первого раза угадать это волшебство.

У меня не получилось, могу порекомендовать вам горько поплакать! И писать десять тысяч разных тупых других комбинаций на другие любые кнопки постоянно пересоздавая hwdb binary db. Ничем не хочу вам помогать в данном случае! Вас все бросили! Вы наедине с собой! Подумайте, так ли вы хотите переопределять кнопки зачем вам это надо нормально же в целом!

Например, вы можете попробовать (у меня получмилось, но вы пробуйте! (я тоже буду в следущей части пробовать!)) использовать другой формат для матчинга:

# Supported hardware matches are:
#  - Generic input devices match:
#      evdev:input:bZZZZvYYYYpXXXXeWWWW-VVVV
#    This matches on the kernel modalias of the input-device, mainly:
#    ZZZZ is the bus-id (see /usr/include/linux/input.h BUS_*), YYYY, XXXX and
#    WWWW are the 4-digit hex uppercase vendor, product and version ID and VVVV
#    is a variable-length input-modalias describing the device capabilities.
#    The vendor, product and version ID for a device node "eventX" is listed
#    in /sys/class/input/eventX/device/id.

Что, в теории, должно было бы собраться в такое вот правило (вывод evtest вам в помощь), но у меня не заработало:

# @link https://hshhhhh.name/2023/12/01/4866/
# Input device ID: bus 0x11 vendor 0x1 product 0x1 version 0xab54
# Input device name: "AT Translated Set 2 keyboard"
#
# thinkpad t490s german keyaboard
# evdev:name:AT Translated Set 2 keyboard:dmi:bvn*:bvr*:bd*:svn*:pn*
evdev:input:b0011v0001p0001eab54*
 KEYBOARD_KEY_56=leftshift # button on right of the left shift <> -- remap to left shift

Больших слёз, боли и страдания!

#linux #udev #systemd #systemd-hwdb

2023.12.01 00:13