Como emular um teclado virtual com um conjunto de caracteres arbitrário?

2

Estou escrevendo alguns aplicativos que mudam o funcionamento do seu teclado. (Um que permite a digitação de chave e outro que permite que você diga sílabas em voz alta para digitar caracteres individuais.) Os "layouts" desses aplicativos são tratados de maneira que não importa o tipo de teclado ou que tipo de layout do teclado que a pessoa tem ao executar o programa, ele deve imprimir o caractere que você diz para imprimir de qualquer maneira. Eu tive que passar por muitos obstáculos para fazer isso funcionar, e acho que entendo como a entrada de teclado normalmente funciona agora em um computador Linux comum:

  • Na inicialização do computador, o XKB memoriza uma tabela de qual evdev scancodes corresponde aos códigos de teclas XF86.
  • No carregamento do layout, o XKB memoriza outra tabela de quais teclados XF86 correspondem aos caracteres Unicode a serem digitados, principalmente lendo /usr/include/X11/keysymdef.h . Em seguida, ele memoriza mais uma tabela de quais códigos de teclas XF86 correspondem a quais teclados (este é o "layout"). Isto é presumivelmente apenas colapsado em um mapeamento de códigos de teclas para caracteres.
  • Agora, sempre que evdev ouve um pressionamento de tecla do teclado e envia um scancode para XKB ...
  • ... e o XKB diz ao X para digitar um caractere Unicode específico.

Como o back-end de meus aplicativos é evdev , e o que eu realmente quero fazer é o que o X faz, isso é muito frustrante, porque eu tenho que simular tudo entre eles. Posso apenas dizer diretamente ao X o que fazer? Não me importo de precisar de acesso de administrador; que obviamente vem com o território. Apenas, quero dizer, se o XKB pode simular teclados com geometrias arbitrárias, por que não posso fingir ser um teclado com uma chave para cada caractere Unicode?

Minhas aplicações estão em Python, mas posso me contentar com qualquer coisa em outros idiomas.

EDIT: Parece que a barragem está no ponto em que a leitura do processo na tecla pressiona as chamadas XLookupString() no relatório do XKeyEvent gerado pelo pressionamento de tecla. O processo interpretará o pressionamento de tecla como correspondendo a qualquer que seja o KeySym que XLookupString() retorna. Isso é uma má notícia, porque XLookupString() obtém as informações sobre a correspondência keycode-keysym do layout do XKB. Então, para falsificar a digitação de um keysym arbitrário, ou precisamos fazer o XKB mentir sobre o layout, ou fazer XLookupString() lie sobre o keysym.

    
por mszegedy 09.12.2015 / 05:11

0 respostas