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