Como enviar pressionamentos de tecla (F5) do terminal para um programa GUI?

26

Estou usando um Raspberry Pi em combinação com o Chromium (modo de quiosque) para mostrar algumas estatísticas. O Pi não tem um teclado conectado, então procurei uma solução para enviar pressionamentos de tecla do terminal para o processo Chromium (tab) . A entrada normal funciona, mas como faço para enviar algo como F5 (uma chave especial: atualização do navegador) por meio dessa solução?

# pidof chromium
20809 20790 20788 20786 20783
# echo 'some text' > /proc/20809/fd/0
    
por burnersk 22.08.2013 / 09:54

5 respostas

35

Os programas GUI não lêem suas entradas padrão, eles recebem sua entrada do servidor X . Existem ferramentas para injetar um pressionamento de tecla em uma janela. O xdotool é bastante comum e conveniente.

Você precisará encontrar o ID da janela para o qual deseja enviar o pressionamento de tecla. Você pode fazer isso com o xdotool. xdotool search --class Chrome retorna a lista de IDs de janela de todas as janelas do Chrome. Se isso retorna mais de um, você precisa escolher o que você deseja. Você pode usar xdotool search --name para corresponder ao título em vez da classe. Você também pode analisar a saída de wmctrl e extrair a ID da janela desejada.

Depois de encontrar a ID da janela correta, você pode chamar xdotool para injetar um pressionamento de tecla. Infelizmente, muitos aplicativos rejeitam eventos sintéticos, ou seja, pressionamentos de tecla e eventos de mouse enviados por outro aplicativo. Este é o caso das versões atuais do Chrome. É possível injetar um pressionamento de tecla de outro aplicativo por um mecanismo diferente, mas isso requer que a janela seja focada. Você pode fazer tudo isso com o xdotool, mas isso fará com que o foco pisque rapidamente na janela do Chrome e volte. O snippet a seguir envia F5 para a primeira janela do Chrome (em uma ordem arbitrária).

xdotool search --class Chrome windowactivate --sync %1 key F5 windowactivate $(xdotool getactivewindow)

Ou com versões mais antigas do xdotool:

xdotool windowactivate $(xdotool search --class Chrome) &&
xdotool key F5 &&
xdotool windowactivate $(xdotool getactivewindow)

Lembre-se que isto envia F5 para aquela janela e cabe ao programa decidir o que fazer com ela. No Chrome, isso recarrega a guia atual.

    
por 23.08.2013 / 01:56
12

A solução sugerida acima usou o xdotool como este

 xdotool key --windowid <window> <keystroke>

que não funcionou para mim. Depois de algumas experiências, cheguei a

 xdotool windowactivate --sync <window> key <keystroke>

Uma vez que parecia estar funcionando, eu defini alguns scripts e atualizei meu arquivo .lircrc como mostrado aqui:

link

    
por 05.02.2014 / 16:48
3

Eu tive um caso de uso semelhante em um Raspberry Pi rodando Raspbian Wheezy. Eu precisava girar as guias no Chrome usando o modo de quiosque (infelizmente, instalar uma extensão para fazer isso no Chrome antigo não é mais razoável). O exemplo da resposta aceita tem alguns erros de digitação ou simplesmente não funciona com minhas versões de software, eis o que funciona para mim:

xdotool key --window "$(xdotool search --class Chromium | head -1)" Ctrl+Tab
    
por 15.12.2015 / 23:19
2

Se você estiver usando o Chromium para exibir uma página da web personalizada e desejar atualizá-la regularmente, adicione a seguinte tag a ela:

<meta http-equiv="refresh" content="5">

para atualizá-lo automaticamente a cada 5 segundos (você pode defini-lo mais curto ou mais, se quiser).

    
por 22.08.2013 / 13:08
1

Eu usei historicamente o Auto Hot Key para fazer coisas como enviar pressionamentos de teclas, mas isso não está disponível no Linux, mas uma rápida pesquisa no Google revela que há IronAHK ( link ) ainda não há muita documentação disponível, mas isso pode funcionar.

    
por 22.08.2013 / 10:40