`xdotool` no envía claves

8

Estoy tratando de enviar pulsaciones de teclas a través de xdotool. Sin embargo, el envío no funciona correctamente.

A continuación se muestra el registro de un script que debe seleccionar todo el texto en Gedit y copiarlo (pero no hace nada en su lugar), junto con su salida (capturado al redirigir stdout y stderr):

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

He intentado con Thunderbird, y el script envía las claves, pero sin modificadores (no Control, eso es). Por cierto, en el guión, las teclas están rodeadas por ", como "ctrl+a".

La diferencia entre Gedit y Thunderbird puede ser que Gedit es una aplicación GTK3, mientras que Thunderbird parece una aplicación GTK2 (pero Firefox, que parece una aplicación GTK3, se comporta como Thunderbird).

xdotool versión 3.20141006.1
Sistema operativo: Debian GNU / Linux 8.1 (Linux kernel 3.16.0-4-amd64)
Desktop Manager: GNOME Shell 3.14.4

Elena
fuente
1
si se utiliza xbindkeysentonces usted tiene que soltar las teclas que activan el guión de xdotool keyup ...para un funcionamiento fiable
grabantot

Respuestas:

7

Cuando una aplicación genera un evento de teclado o mouse en lugar de un periférico de entrada, ese evento se marca como "sintético". Muchas aplicaciones rechazan eventos sintéticos.

En teoría, hay una razón de seguridad para eso: puede ejecutar una aplicación en su pantalla X pero con una cuenta diferente o en una máquina diferente, pero X es tan malo para aislar aplicaciones (nunca fue diseñado para eso) que no debería No permita que aplicaciones no confiables accedan a su pantalla. Y si no lo hace, entonces no hay razón para rechazar eventos sintéticos.

Hasta donde yo sé, Gtk no ofrece una forma genérica de decidir si se permiten eventos sintéticos. Depende de las aplicaciones individuales, y no sé cuál es el valor predeterminado si al programador no le importa.

Hay otra forma de inyectar eventos de entrada, con la extensión XTEST. Los eventos inyectados de esta manera aparecen exactamente como los eventos de un periférico de entrada: efectivamente, provienen de un periférico de entrada de "prueba". La desventaja de este enfoque es que se enrutan a una ventana de la misma manera que cualquier otro evento, por lo que se envían a la ventana que tiene el foco (a menos que sea interceptado por el administrador de ventanas). Puede enviar eventos XTEST con (versiones suficientemente recientes de) xdotool, eso es lo que hace si no pasa una ID de ventana.

xdotool windowactivate 29360262
xdotool key ctrl+a ctrl+c

Sí, eso es molesto. Puede encontrar una discusión sobre este problema en la wiki de Selenium . Parece que hay una manera de enviar eventos falsos a una aplicación GTK + a través de señales GTK o eventos GDK, pero no sé cómo funciona.

Gilles 'SO- deja de ser malvado'
fuente