O `xdotool` não envia chaves

8

Estou tentando enviar pressionamentos de tecla via xdotool. No entanto, o envio não funciona corretamente.

Abaixo está o log de um script que deve selecionar todo o texto no Gedit e copiá-lo (mas não faz nada), juntamente com sua saída (capturada ao redirecionar stdout e stderr):

+ xdotool getwindowname 29360262
*Unsaved Document 1 - gedit
+ xdotool key --window 29360262 ctrl+a
+ sleep 1
+ xdotool key --window 29360262 ctrl+c
+ sleep 1

Eu tentei com o Thunderbird, e o script envia as chaves, mas sem modificadores (não Control, isso é). A propósito, no script, as teclas são cercadas por ", como "ctrl+a".

A diferença entre o Gedit e o Thunderbird pode ser que o Gedit é um aplicativo GTK3, enquanto o Thunderbird parece um aplicativo GTK2 (mas o Firefox, que parece um aplicativo GTK3, se comporta como o Thunderbird).

xdotool versão 3.20141006.1
Sistema operacional: Debian GNU / Linux 8.1 (kernel do Linux 3.16.0-4-amd64)
Desktop Manager: GNOME Shell 3.14.4

Elena
fonte
1
se você usar xbindkeys, então você tem que liberar as chaves que acionam seu script xdotool keyup ...para uma operação confiável
grabantot

Respostas:

7

Quando um evento de teclado ou mouse é gerado por um aplicativo e não por um periférico de entrada, esse evento é marcado como "sintético". Muitos aplicativos rejeitam eventos sintéticos.

Em teoria, há uma razão de segurança para isso - você pode executar um aplicativo no monitor X, mas em uma conta diferente ou em uma máquina diferente - mas o X é tão ruim em isolar aplicativos (nunca foi projetado para isso) que você não deveria permite que aplicativos não confiáveis ​​acessem sua tela. E se não o fizer, não há razão para rejeitar eventos sintéticos.

Até onde eu sei, o Gtk não oferece uma maneira genérica de decidir se deve permitir eventos sintéticos. Depende de aplicativos individuais e não sei qual é o padrão se o programador não se importar.

Há outra maneira de injetar eventos de entrada, com a extensão XTEST. Eventos injetados dessa maneira parecem exatamente como eventos de um periférico de entrada: efetivamente, eles vêm de um periférico de entrada de "teste". A desvantagem dessa abordagem é que eles são roteados para uma janela da mesma maneira que em qualquer outro evento; portanto, são enviados para a janela que tem o foco (a menos que seja interceptado pelo gerenciador de janelas). Você pode enviar eventos XTEST com (versões suficientemente recentes) do xdotool, é o que faz se você não passar um ID de janela.

xdotool windowactivate 29360262
xdotool key ctrl+a ctrl+c

Sim, isso é chato. Você pode encontrar uma discussão sobre esse problema no wiki do Selenium . Parece que existe uma maneira de enviar eventos falsos para um aplicativo GTK + por meio de sinais GTK ou eventos GDK, mas não sei como isso funciona.

Gilles 'SO- parar de ser mau'
fonte