Переназначение клавиатуры на «нижнем уровне» в X

Переназначение клавиатуры на «нижнем уровне» в X

Раскладки клавиатуры имеют схожий поток с моделью OSI, хотя и не так хорошо определены. В настоящее время я перераспределяю на более высоком уровне, чем мне бы хотелось. Очевидно, что уровень 1 соответствует физической клавиатуре, а уровень 7 — приложению, но я не уверен, сколько еще слоев есть или где они находятся в соответствии.

Если бы это был настольный компьютер с отдельной программируемой физической клавиатурой, я бы был доволен, но, увы, это ноутбук, и мне нужно поддерживать переназначения при использовании встроенной клавиатуры.

Кстати, я меняю местами следующие пары клавиш: [Tilde/Esc], [Caps/LCtrl], [Back{пробел,слэш}]. Я также использую Dvorak, но это настраивается в ОС стандартным образом.

В настоящее время я изменяю /usr/share/X11/xkb/keycodes/evdev, чтобы внести свои изменения в X (и создать пользовательский файл макета для консолей, но это не имеет значения). Я не уверен, где это находится в «стек слоев».

Проблема:Моя раскладка клавиатуры не транслируется в сеансы консоли Proxmox, которые используют веб-клиент VNC. (Раскладка также не применяется, но это ожидаемо.) Проблема, очевидно, в том, что клиент VNC подключает клавиатуру на более низком уровне, где переназначение evdev еще не применено.

В Windows я использую утилиту KeyTweak для генерации карт скан-кодов для реестра, который, по сути, является «слоем 3». Я играл в игры, которые, по-видимому, подключали клавиатуру на «слое 2», но это не проблема, поскольку в большинстве игр очень мало приходится печатать.

В заключение, Я не уверен, где evdev попадает в мою воображаемую модель клавиатуры OSI, но как мне переназначить на более низком уровне? Мне не нужно менять переназначение по какой-либо причине, так что это изменение может быть в основном постоянным. Если бы я мог сделать это в BIOS, я бы это сделал.

решение1

Ответ оказался udev. Я в основном следовалэта почта, но суть такова:

  • Установитьevtest
  • Запустите evtestи нажмите клавиши, которые вы хотите переназначить, чтобы увидетьобаскан-коды и коды клавиш.
  • Создайте новый файл с /etc/udev/hwdb.d/названием примерно такого 70-keyremap.hwdbсодержания:
    • Я предполагаю, что номер — это порядок файла, но у меня не было никаких существующих файлов, на которых можно было бы его основать, поэтому я не уверен, каковы его prereqs, из-за которых ему может потребоваться более высокий номер. На самом деле, hwdb.dу меня на Tumbleweed не было этого каталога, поэтому мне пришлось его создать, но он все равно работал.
  • Бегать systemd-hwdb update.
  • Перезагрузить

_

# This is from the brokkr.net post I linked above
# Format can be found on [https://wiki.archlinux.org/title/Map_scancodes_to_keycodes].

$ cat 70-keymap.hwdb
evdev:atkbd:dmi:bvn*:bvr*:bd*:svn*:pn*:pvr*
 KEYBOARD_KEY_01=41     # Remap Tilde to Esc
 KEYBOARD_KEY_29=01     # Remap Esc to Tilde (evtest showed "1" but when I put that without the leading zero, it was interpreted as the literal [1] key.)
 KEYBOARD_KEY_3A=29     # Remap Caps to LCtrl
 KEYBOARD_KEY_1D=58     # Remap LCtrl to Caps
 KEYBOARD_KEY_0E=43     # Remap Backspace to Backslash
 KEYBOARD_KEY_2B=14     # Remap Backslash to Backspace

Обновлять: Вышеуказанный метод отлично сработал на моем ноутбуке, но когда я подключил его, внешние клавиатуры все еще использовали раскладку клавиатуры по умолчанию. Оказалось, это потому, что внутренняя клавиатура взаимодействует с помощью PS/2, который все еще использует скан-коды AT ( atkbdв строке устройства), но USB совершенно другой. В итоге мне пришлось снова запустить evtest, чтобы получить скан-коды с платы USB и записать другую раскладку. Вот мой результирующий файл:

evdev:atkbd:dmi:*
 KEYBOARD_KEY_01=41
 KEYBOARD_KEY_29=01
 KEYBOARD_KEY_3A=29
 KEYBOARD_KEY_1D=58
 KEYBOARD_KEY_0E=43
 KEYBOARD_KEY_2B=14

evdev:input:b0003v*
 KEYBOARD_KEY_70029=41
 KEYBOARD_KEY_70035=01
 KEYBOARD_KEY_70039=29
 KEYBOARD_KEY_700e0=58
 KEYBOARD_KEY_7002a=43
 KEYBOARD_KEY_70031=14

Связанный контент