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).