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:
evdev
scancodes corresponde aos códigos de teclas XF86. /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. evdev
ouve um pressionamento de tecla do teclado e envia um scancode para XKB ... 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.
Tags python keyboard-layout xkb keyboard x11