Я повторно отобразил свою Caps Lock для возвращения.
/etc/default/keyboard
XKBLAYOUT="us"
XKBVARIANT="altgr-intl"
BACKSPACE="guess"
XKBOPTIONS="caps:backspace"
Это довольно работает отлично, за исключением того, что это не работает на некоторые определенные инструменты. Я использовал xev
узнать, что продолжается.
Клавиша Backspace нажимается
KeyPress event, serial 38, synthetic NO, window 0x2400001,
root 0x159, subw 0x0, time 1028211, (335,635), root:(452,749),
state 0x10, keycode 22 (keysym 0xff08, BackSpace), same_screen YES,
XLookupString gives 1 bytes: (08) "
XmbLookupString gives 1 bytes: (08) "
XFilterEvent returns: False
KeyRelease event, serial 38, synthetic NO, window 0x2400001,
root 0x159, subw 0x0, time 1028272, (335,635), root:(452,749),
state 0x10, keycode 22 (keysym 0xff08, BackSpace), same_screen YES,
XLookupString gives 1 bytes: (08) "
XFilterEvent returns: False
Caps Lock нажимается
KeyPress event, serial 38, synthetic NO, window 0x2400001,
root 0x159, subw 0x0, time 859789, (391,558), root:(508,672),
state 0x10, keycode 66 (keysym 0xff08, BackSpace), same_screen YES,
XKeysymToKeycode returns keycode: 22
XLookupString gives 1 bytes: (08) "
XmbLookupString gives 1 bytes: (08) "
XFilterEvent returns: False
KeyRelease event, serial 38, synthetic NO, window 0x2400001,
root 0x159, subw 0x0, time 859875, (391,558), root:(508,672),
state 0x10, keycode 66 (keysym 0xff08, BackSpace), same_screen YES,
XKeysymToKeycode returns keycode: 22
XLookupString gives 1 bytes: (08) "
XFilterEvent returns: False
Я также попробовал его в использовании браузера
addEventListener('keyup', event => {
console.log(event.keyCode, event.key, event.code)
})
Это регистрирует следующее, когда я нажимаю клавишу Backspace и Caps Lock
8 "Backspace" "Backspace"
8 "Backspace" "CapsLock"
Таким образом, в основном моя Caps Lock повторно отображается на клавише Backspace, но она только работает, если инструменты и веб-сайты используют надлежащие проверки. Я Дон хочет зарегистрировать отчет об ошибках для каждого инструмента или веб-сайта я когда-либо, использую, который реализует это неправильно.
Действительно ли возможно отобразить Caps Lock таким способом, которым это полностью эмулирует клавишу Backspace вместо того, чтобы действовать как повторно отображенная Caps Lock?
Во-первых, давайте посмотрим, как нажатие клавиши обрабатывается (взятый из этого ответа):
/keyboard/→ scancode
→ / входной драйвер / → keycode
→ сервер/X XKB/→ keysym
scancode
устройство определенный код, который связывается с определенным ключом и может отличаться между различными поставщиками/продуктами. keycode
и keysym
распространены к приложениям. keycode
служит уровнем абстракции, поскольку это - агностик устройства и агностик локали. То же keycode
может произвести отличающийся keysym
s, в зависимости от локали и состояния модифицирующих клавиш. Это - причина, почему некоторые приложения только ищут keycode
, особенно при контакте с сочетаниями клавиш.
Таким образом, наша цель состоит в том, чтобы отобразиться scancode
из Вашей клавиши Caps Lock к keycode
из клавиши Backspace. Приложения будут затем видеть то же keycode
и keysym
независимо, ли Вы нажимаете BackSpace или CapsLock.
Это отображение сделано udev использование hardwaredatabase файла (hwdb.bin), который компилируется из .hwdb файлов в обоих /lib/udev/hwdb.d/
и /etc/udev/hwdb.d/
.
scancode
->keycode
отображениеСначала необходимо определить bustype
, vendor
, product
и version
из Вашего устройства ввода данных (клавиатура), а также scancode
из ключа Вы хотите повторно отобразиться и key code identifier
Вы хотите отобразить его на.
Выполненный evtest
(Вам, вероятно, придется установить его сначала), и определите свою клавиатуру в списке устройств. На клавиатурах с дополнительными ключами как Игра/Пауза, WWW, и т.д. эти ключи часто выставляются как другое устройство ввода данных. Если Вы не получаете вывода при нажатии клавиши, поражаете Control+C и пробуете другое устройство. После того как Вы определили свою клавиатуру, помните первый столбец (/dev/input/eventX
) и нажмите клавишу, которую Вы хотите повторно отобразить. Значение после (MSC_SCAN)
scancode
. На моей клавиатуре:
$ evtest
Available devices:
/dev/input/event0: Power Button
/dev/input/event1: Power Button
/dev/input/event2: G19 Gaming Keyboard
/dev/input/event3: G19 Gaming Keyboard
...
Select the device event number [0-18]:2
...
Event: time 1522111203.117945, -------------- SYN_REPORT ------------
Event: time 1522111220.778787, type 4 (EV_MSC), code 4 (MSC_SCAN),value 70039
Event: time 1522111220.778787, type 1 (EV_KEY), code 14 (KEY_BACKSPACE), value 1
... scancode
70039.
Теперь выполните следующую команду, где eventX
тот, который Вы выбрали прежде:
$ grep "" /sys/class/input/eventX/device/id/*
Вывод для моей клавиатуры
/sys/class/input/event2/device/id/bustype:0003
/sys/class/input/event2/device/id/product:c228
/sys/class/input/event2/device/id/vendor:046d
/sys/class/input/event2/device/id/version:0110
Добираться key code identifier
, любое использование вывод evtest
или посмотрите на раздел Ключей и кнопок в /usr/include/linux/input-event-codes.h
для полного списка. Идентификатор является частью после KEY_
преобразованный в нижний регистр, например. KEY_BACKSPACE
становится клавишей Backspace.
Смотрите на /lib/udev/hwdb.d/
. Мы создадим текстовый файл в /etc/udev/hwdb.d/
с именем файла, начинающимся с числа, больше, чем файл, соответствующий нашему типу устройства. Для клавиатуры это может быть любым числом, больше, чем 60, в то время как для джойстика это должно быть больше, чем 70. Например, 65-keyboard-custom.hwdb
. Используйте свой любимый текстовый редактор, но имейте в виду, что необходимо запустить его как root
, например.
$ sudo gedit /etc/udev/hwdb.d/65-keyboard-custom.hwdb
Добавьте следующее содержание
evdev:input:b[bustype]v[vendor]p[product]e[version]*
KEYBOARD_KEY_[scancode]=[key code identifier]
... где
evdev:...
строка не имеет никакого предыдущего пространстваKEYBOARD_KEY...
строка имеет точно одно предыдущее пространствоВ моем примере файл похож на это:
evdev:input:b0003v046DpC228e0110*
KEYBOARD_KEY_70039=backspace # map CapsLock to BackSpace
Первая строка будет подобрана к Вашему устройству. Можно указать дополнительный evdev:
строки и Вы можете использовать больше чем один подстановочный знак (*
) соответствовать дополнительным устройствам, но иметь в виду, что scancodes являются конкретным устройством. Можно также добавить больше чем одно отображение scancode. Взгляните на /lib/udev/hwdb.d/60-keyboard.hwdb
для вдохновения. Более подробная и актуальная версия того файла может быть найдена в репозитории онлайн.
Скомпилируйте новую конфигурацию в аппаратную базу данных:
$ sudo systemd-hwdb update
Если Вы хотите применить изменения сразу, сообщите udev:
$ sudo udevadm trigger
Обратите внимание на то, что значения конфигурации могут только быть добавлены или изменены, в то время как система работает. При удалении конфигурации (например, scancode, отображающийся), необходимо перезагрузить для изменений для вступления в силу.
Не забудьте также возвращаться переотображение, Вы сделали прежде (использование /etc/default/keyboard
), потому что это будет все еще применено ко всем клавиатурам.