
Раскладки клавиатуры имеют схожий поток с моделью 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 не было этого каталога, поэтому мне пришлось его создать, но он все равно работал.
- Я предполагаю, что номер — это порядок файла, но у меня не было никаких существующих файлов, на которых можно было бы его основать, поэтому я не уверен, каковы его prereqs, из-за которых ему может потребоваться более высокий номер. На самом деле,
- Бегать
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