Поддельный код клавиши для повторно отображенных клавиш на клавиатуре

Я повторно отобразил свою 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?

1
задан 26 March 2018 в 22:32

1 ответ

Во-первых, давайте посмотрим, как нажатие клавиши обрабатывается (взятый из этого ответа):

/keyboard/→ scancode → / входной драйвер / → keycode → сервер/X XKB/→ keysym

scancode устройство определенный код, который связывается с определенным ключом и может отличаться между различными поставщиками/продуктами. keycode и keysym распространены к приложениям. keycode служит уровнем абстракции, поскольку это - агностик устройства и агностик локали. То же keycode может произвести отличающийся keysyms, в зависимости от локали и состояния модифицирующих клавиш. Это - причина, почему некоторые приложения только ищут 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.

Настройте udev

Смотрите на /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]

... где

  • [у типа шины], [поставщика], [продукта] и [версии] есть точно 4 символа (клавиатура с нулями в случае необходимости), и буквы должны быть прописными
  • [scancode] не нужно дополнение, но буквы должны быть нижним регистром
  • 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), потому что это будет все еще применено ко всем клавиатурам.

2
ответ дан 7 December 2019 в 13:25

Другие вопросы по тегам:

Похожие вопросы: