'xdotool' não envia chaves

6

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), junto com sua saída (capturada redirecionando 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 (sem Control , isto é). By the way, no script, as chaves 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 Linux 3.16.0-4-amd64)
Desktop Manager: GNOME Shell 3.14.4

    
por Elena 09.07.2015 / 19:10

1 resposta

4

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 em seu monitor X, mas sob uma conta diferente ou em uma máquina diferente - mas X é tão ruim em isolar aplicativos (nunca foi projetado para isso) que você não deve permitir que aplicativos não confiáveis acessem seu monitor. E se você não o fizer, não há razão para rejeitar eventos sintéticos.

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

Existe outra maneira de injetar eventos de entrada, com a extensão XTEST. Os eventos injetados dessa forma aparecem exatamente como os eventos de um periférico de entrada: efetivamente, eles vêm de um periférico de entrada de “teste”. A desvantagem desta abordagem é que eles são roteados para uma janela da mesma forma que qualquer outro evento, então eles 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 de) xdotool, isso é o que acontece se você não passar uma ID de janela.

xdotool windowactivate 29360262
xdotool key ctrl+a ctrl+c

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

    
por 13.07.2015 / 02:01