Executa o programa em um pressionamento de tecla sem interromper o evento principal

6

É possível ligar um pressionamento de tecla (global) a algum comando e ainda não interromper o pressionamento de tecla do preenchimento? O que quero dizer é que, se eu tentar a solução bindkey publicada em outro lugar aqui :

# In file: ~/.xbindkeysrc
# Bind key 'q' to running 'some_command'
"some_command"
  q

depois, a tecla 'q' nunca é completada como de outra forma faria: ou seja, nunca imprime o caractere 'q' no terminal, por exemplo.

Usando xdotool para enviar uma tecla 'q', pressione assim:

# In file: ~/.xbindkeysrc
# Bind key 'q' to running 'some_command'
"some_command && xdotool key q"
  q

resulta em loop desde que a tecla 'q' pressionada executada por xdotool irá executar outro 'algum_comando' através da ligação.

Para ser um pouco mais claro, eu quero que a tecla pressione 'q' para executar como normalmente e além disso execute algum comando externo. A solução acima substitui o evento de pressionamento de tecla 'q' com a execução de algum comando externo. O problema é que, se esse comando externo também simular uma tecla 'q', a ligação relança o comando externo e eu fico preso em um loop infinito.

    
por Zorawar 09.05.2015 / 17:55

1 resposta

5

OK, vou postar uma solução que encontrei, mas talvez outra pessoa tenha uma melhor. Após uma resposta apresentada aqui , posso ver todas as teclas pressionadas executando

xinput test <keyboad_id>

em um terminal. É então apenas um caso simples de enviar a saída desse comando para um programa que procura strings como "key release 24" (a saída quando 'q' é liberado no meu teclado) e que fará o que você quiser quando fizer isso. corresponde a essa string.

Por exemplo, podemos apertar a tecla 'q' e fazer um som como este:

xinput test <keyboard_id> | while read in ; do
  [[ $in = "key press   24" ]] && aplay /usr/share/sounds/purple/alert.wav
done

Podemos, obviamente, observar outras entradas também e executar outra coisa, se desejar.

    
por 10.05.2015 / 04:15