Захват события XI2 RawKeyPress и интерпретация его с помощью Python
самостоятельно решен.
Справочная информацияЛинукс кодНиже от: linux_xmodmap_tutorial
Scancode → номер, который ваша клавиатура отправляет на компьютер. Для клавиатур USB это определяется стандартом USB.
Код ключа → число, используемое ядром Linux для обозначения ключа (или кнопки / колеса мыши). Ядро Linux переводит сканкод в код ключа.
Keysym → имя для ключа. KeySime получает приложения X11.
Я могу ошибаться но чтоsudo evtest
отпечатки выглядят как набор кодов 1 и так/dev/input/event*
выходные данные похожи, по крайней мере, с моей системы скан-коды и коды клавиш Linux в основном одинаковы.
Команда xev печатает код клавиши и keysym, и я заметил, что код клавиши не меняется независимо от используемой раскладки клавиатуры, раскладки qwerty и dvorak производят разные коды клавиш, но одинаковые коды клавиш.
Тем не менее, это не код ключа linux, не скрытый идентификатор использования, ни какой-либо из наборов скан-кодов: set1, set2 и set3.
Согласно Arch Wiki (я не могу публиковать ссылки):/etc/udev/hwdb.bin
переводит скан-код в код ключа.
Очевидные нюансы с этим:
вики говорят, что есть файлы не по умолчанию * .hwdb, которые можно скомпилировать вhwdb.bin
hwdb.bin
может обнаруживать разные клавиатуры и может по-разному переводить скан-код в код клавиши.Для Ubuntu единственный файл hwdb, который я могу найти:/etc/udev/hwdb.d/61-keyboard-local.hwdb
и это почти пусто. Таким образом, по умолчанию Ubuntu сохраняет стандартные коды сканирования и использует их в качестве кодов клавиш.
Какой-то хакер оставил нам подсказку:https://www.charvolant.org/doug/xkb/html/index.html
Файлы правил сопоставления кода сканирования с кодом ключа (какой из них используется - вопрос) находятся в:/usr/share/X11/xkb/keycodes
setxkbmap -print -verbose 10
печать
Trying to load rules file ./rules/evdev...
Trying to load rules file /usr/share/X11/xkb/rules/evdev...
Итак, приведенные выше файлы должны контролировать загрузку Xkb (Linux сильно меняется, поэтому не стоит ожидать того же в будущем).
Пример:
setxkbmap -print -verbose 10
Setting verbose level to 10
locale is C
Trying to load rules file ./rules/evdev...
Trying to load rules file /usr/share/X11/xkb/rules/evdev...
Success.
Applied rules from evdev:
rules: evdev
model: pc105
layout: us,us
variant: dvp,
Trying to build keymap using the following components:
keycodes: evdev+aliases(qwerty)
types: complete
compat: complete
symbols: pc+us(dvp)+us:2+inet(evdev)
geometry: pc(pc105)
xkb_keymap {
xkb_keycodes { include "evdev+aliases(qwerty)" };
xkb_types { include "complete" };
xkb_compat { include "complete" };
xkb_symbols { include "pc+us(dvp)+us:2+inet(evdev)" };
xkb_geometry { include "pc(pc105)" };
Раздел в/usr/share/X11/xkb/rules/evdev
который, вероятно, управляет поведением загрузки файла кода ключа:
! model = keycodes
pc98 = evdev(pc98)
applealu_jis = evdev+macintosh(jisevdev)
olpc = evdev+olpc(olpc)
olpcm = evdev+olpc(olpcm)
* = evdev
! layout[1] = keycodes
$azerty = +aliases(azerty)
$qwertz = +aliases(qwertz)
* = +aliases(qwerty)
Мое предположениеXServer просматривает идентификатор поставщика клавиатуры и идентификатор устройства и применяет различные правила для перевода скан-кода в код клавиши.
Могу ли я получить скан-код из кода ключа X11?xkb/keycodes/evdev
Похоже, что он используется в качестве правила перевода для большинства клавиатур, его использование может помочь.
нет
Традиционный базовый протокол X11 не предоставляет ни идентификатора поставщика, ни идентификатора устройства клавиатуры, сгенерировавшей событие клавиатуры.
XI2 - расширение входа X 2.x
https://www.x.org/releases/X11R7.7/doc/inputproto/XI2proto.txt
A RawEvent provides the information provided by the driver to the
client. RawEvent provides both the raw data as supplied by the driver and
transformed data as used in the server.
Теперь я попробовал RawKeyPressЯ не мог извлечь скрытый идентификатор использования или скан-код, хотя, возможно, я просто пропустил их.
Захват события XI2 RawKeyPress и интерпретация его с помощью Python