Para continuar com o que você desenvolveu atualmente, é possível usar o (s) pacote (s) de ferramentas evemu para usar os utilitários evtest
e evemu-event
. Liste os dispositivos de eventos de entrada com sudo evtest
e encontre a linha correspondente ao seu teclado. Eu tenho um teclado especial, então eu tenho:
/dev/input/event2: HID 05f3:0007
Agora escolha esse número (2 no meu caso) e pressione a tecla que você deseja reconhecer (Alt para você). Usei left shift e peguei
Event: time 15094562, -------------- SYN_REPORT ------------
Event: time 15094562, type 4 (EV_MSC), code 4 (MSC_SCAN), value 700e1
Event: time 15094562, type 1 (EV_KEY), code 42 (KEY_LEFTSHIFT), value 1
Vemos que recebi um evento do tipo EV_KEY com o código KEY_LEFTSHIFT obtendo o valor 1 quando pressionei shift e um evento similar com valor 0 quando o lancei.
Agora você pode simplesmente consultar o estado dessa chave a qualquer momento, por exemplo, após o chvt. Use, no meu caso,
sudo evtest --query /dev/input/event2 EV_KEY KEY_LEFTSHIFT
O código de retorno deste comando é 0 se o valor for 0 e 10 se o valor for 1. Você pode usar echo $?
para mostrar este valor.
Sabendo o estado da chave, agora você pode emular um evento de pressionamento de tecla para que o servidor X11 veja o estado "atual". No meu caso, eu faria
sudo evemu-event /dev/input/event2 --type EV_KEY --code KEY_LEFTSHIFT --value 1
Como você pode imaginar, provavelmente existe uma solução mais simples para o seu problema original. Em vez de usar xbindkeys
e ter esse problema corrigido aqui, você pode procurar uma solução diferente usando o libevent. Há exemplos em C no Subsistema de Entrada USB do Linux e parte 2 no Linux Journal. Seu sistema pode ter uma biblioteca Python evdev para tornar isso mais fácil.