Захват события XI2 RawKeyPress и интерпретация его с помощью Python

самостоятельно решен.

Справочная информацияЛинукс код

Ниже от: linux_xmodmap_tutorial

Scancode → номер, который ваша клавиатура отправляет на компьютер. Для клавиатур USB это определяется стандартом USB.

Код ключа → число, используемое ядром Linux для обозначения ключа (или кнопки / колеса мыши). Ядро Linux переводит сканкод в код ключа.

Keysym → имя для ключа. KeySime получает приложения X11.

Я могу ошибаться но чтоsudo evtest отпечатки выглядят как набор кодов 1 и так/dev/input/event* выходные данные похожи, по крайней мере, с моей системы скан-коды и коды клавиш Linux в основном одинаковы.

Код X11

Команда xev печатает код клавиши и keysym, и я заметил, что код клавиши не меняется независимо от используемой раскладки клавиатуры, раскладки qwerty и dvorak производят разные коды клавиш, но одинаковые коды клавиш.
Тем не менее, это не код ключа linux, не скрытый идентификатор использования, ни какой-либо из наборов скан-кодов: set1, set2 и set3.

Как генерируется ключевой код Linux?

Согласно Arch Wiki (я не могу публиковать ссылки):
/etc/udev/hwdb.bin переводит скан-код в код ключа.

Очевидные нюансы с этим:

вики говорят, что есть файлы не по умолчанию * .hwdb, которые можно скомпилировать вhwdb.binhwdb.bin может обнаруживать разные клавиатуры и может по-разному переводить скан-код в код клавиши.

Для Ubuntu единственный файл hwdb, который я могу найти:/etc/udev/hwdb.d/61-keyboard-local.hwdb и это почти пусто. Таким образом, по умолчанию Ubuntu сохраняет стандартные коды сканирования и использует их в качестве кодов клавиш.

Как генерируется код X11

Какой-то хакер оставил нам подсказку: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

Ответы на вопрос(0)

Ваш ответ на вопрос