como pressionar as teclas de proxy

2

Como posso construir um componente que fica entre o teclado e os aplicativos que capturam todos os pressionamentos de tecla e emitem seus próprios sinais de pressionamento de tecla. Os sinais emitidos não serão necessariamente de 1 para 1 com os capturados. Por fim, estou tentando criar um método de entrada semelhante ao ibus (eu também apreciaria informações sobre como o ibus funciona tecnicamente).

Depois de ler esta pergunta , eu acho o local apropriado para capturar seria depois que os códigos de teclas ou os símbolos de chaves fossem gerados. Eu também entendo que o X permite que um cliente pegue todos os eventos do teclado que soem relevantes para o que estou tentando fazer.

    
por Elfalem 27.10.2017 / 06:13

1 resposta

3

Existem basicamente duas maneiras:

1) No nível do kernel, encontre o dispositivo / dev / input que produz seus keypresses, abra-o e faça um "grab" -octl (o mesmo que evtest --grab faz). Isso fará com que esse dispositivo de entrada envie os principais eventos exclusivamente para seu aplicativo. Em seguida, use /dev/uinput para criar seu próprio dispositivo de entrada a partir do seu aplicativo, onde você pode enviar os principais eventos para fora. X deve se conectar a esse dispositivo automaticamente.

2) No nível X, interceptar eventos de pressionamento de tecla, assim como o gerenciador de janelas, e enviar seus próprios eventos com XSendEvent . Não tenho certeza se uma captura seria a melhor maneira de fazê-lo; As garras são planejadas para uma situação em que algum aplicativo deseja interceptar temporariamente todos os eventos durante uma interação específica.

Eu não tenho ideia do que o ibus faz (talvez até mesmo um terceiro método), eu não o analisei em detalhes.

Editar

Eu tive que procurar por isso, porque é muito tempo que eu li sobre todos os detalhes do X.

Existem duas funções básicas: XGrabKeyboard , que gera eventos FocusIn e FocusOut, e assume o controle total do teclado (captura ativa). Esta é a função que eu quis dizer quando falei sobre X grabs acima, e esta é a função que deve estar ativa apenas temporariamente.

Há também XGrabKey , que registra uma captura passiva para códigos de teclas específicos. Olhando muito rapidamente para o código-fonte do gerenciador de janelas fvwm , este parece ser o que o gerenciador de janelas usa.

Os detalhes disso são complicados o suficiente para que você provavelmente queira desenterrar alguma documentação sobre como programar um gerenciador de janelas (ou ler o código-fonte, talvez até ibus do código-fonte).

    
por 27.10.2017 / 09:30