Как эмулировать виртуальную клавиатуру с произвольным набором символов?

Я пишу пару приложений, которые меняют работу вашей клавиатуры. (Тот, который позволяет записывать ключевые слова, и другой, который позволяет говорить слогам громко, чтобы набирать отдельные символы.) «Макеты» этих приложений обрабатываются таким образом, что не имеет значения, какая клавиатура или какой раскладка клавиатуры, которую человек имеет во время запуска программы, он должен печатать символ, который вы ему скажете, в любом случае. Мне пришлось перепрыгнуть через множество обручей, чтобы заставить это работать, и я думаю, что понимаю, как клавиатура обычно работает сейчас на типичном Linux-компьютере:

  • При запуске компьютера XKB запоминает таблицу того, что evdev scancodes соответствует кодам клавиш XF86.
  • При загрузке макета XKB запоминает еще одну таблицу того, что XF86 keysyms соответствует тому, что символы Unicode печатаются, главным образом, путем чтения /usr/include/X11/keysymdef.h . Затем он запоминает еще одну таблицу того, какие коды клавиш XF86 соответствуют тем, что keysyms (это «макет»). Предположительно, это просто свернуто в отображение кодов клавиш в символы.
  • Теперь, когда evdev слышит нажатие клавиши с клавиатуры и отправляет scancode на XKB …
  • … и XKB сообщает X, чтобы вывести конкретный символ Юникода.

Поскольку бэкендом моих приложений является evdev , и то, что я действительно хочу сделать, это то, что делает X, это очень неприятно, потому что я должен имитировать все между ними. Могу ли я просто сказать X, что делать? Я не возражаю против доступа администратора; что, очевидно, идет с территорией. Я имею в виду, если XKB может имитировать клавиатуру с произвольной геометрией, почему я не могу притворяться клавиатурой с ключом для каждого символа Юникода?

  • Как запустить приложение на определенной голове?
  • как использовать xrandr для зеркального отображения только части моего главного экрана?
  • Как я могу обмениваться окнами приложений между OS X и Linux?
  • Попросите определенные ключи пройти через lockscreen
  • Как запустить xev с консоли?
  • Как запустить скрипт python с помощью Anaconda из командной строки?
  • Мои приложения находятся на Python, но я могу обойтись с другими языками.

    EDIT: Кажется, что плотина находится в точке, где процесс чтения в XLookupString() вызывает вызовы XLookupString() в отчете XKeyEvent сгенерированном XKeyEvent клавиши. Процесс будет интерпретировать нажатие клавиши как соответствующее любому KeySym , возвращаемому XLookupString() . Это плохая новость, потому что XLookupString() получает информацию о соответствии keycode-keysym из макета XKB. Поэтому, чтобы подделать ввод произвольного ключа, нам нужно сделать XKB ложью о макете или заставить XLookupString() лгать о keyym.

    Linux и Unix - лучшая ОС в мире.