Добрый вечер! Начинавем утренний сеанс боли!
У меня на ноутбуке немецкая клавиатура. Мне в целом всё равно какие там значки где нарисованы, но вто то что левый шифт маленький, а справа от него кнопка с <>
— это вообще почему как зачем. Я не могу одной рукой нажать прекрасный шорткат <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