¿Cómo enviar pulsaciones de teclas (F5) desde la terminal a un programa GUI?

40

Estoy usando una Raspberry Pi en combinación con Chromium (modo quiosco) para mostrar algunas estadísticas. El Pi no tiene un teclado conectado, así que busqué una solución para enviar pulsaciones de teclas desde la terminal al proceso de Chromium (pestaña) . La entrada normal funciona, pero ¿cómo envío algo como F5(una tecla especial: actualización del navegador) a través de esta solución?

# pidof chromium
20809 20790 20788 20786 20783
# echo 'some text' > /proc/20809/fd/0
Burnersk
fuente

Respuestas:

51

Programas GUI no leen desde su entrada estándar, que obtienen su entrada desde el servidor X . Hay herramientas para inyectar una pulsación de tecla en una ventana. xdotool es bastante común y conveniente.

Deberá encontrar la ID de ventana a la que desea enviar la pulsación de tecla. Puedes hacerlo con xdotool. xdotool search --class Chromedevuelve la lista de ID de ventanas de todas las ventanas de Chrome. Si esto devuelve más de uno, debe elegir el que desee. Puede usar xdotool search --namepara hacer coincidir el título en lugar de la clase. También puede analizar la salida de wmctrl y extraer la ID de ventana deseada.

Una vez que haya encontrado la ID de ventana correcta, puede llamar xdotoolpara inyectar una tecla. Desafortunadamente, muchas aplicaciones rechazan eventos sintéticos, es decir, pulsaciones de teclas y eventos de mouse enviados por otra aplicación. Este es el caso con las versiones actuales de Chrome. Es posible inyectar una pulsación de tecla desde otra aplicación mediante un mecanismo diferente, pero eso requiere que la ventana esté enfocada. Puede hacer todo eso con xdotool, pero hará que el foco parpadee rápidamente a la ventana de Chrome y viceversa. El siguiente fragmento se envía F5a la primera ventana de Chrome (en un orden algo arbitrario).

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

O con versiones anteriores de xdotool:

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

Recuerde que esto se envía F5a esa ventana y depende del programa decidir qué hacer con ella. En Chrome, esto vuelve a cargar la pestaña actual.

Gilles 'SO- deja de ser malvado'
fuente
44
la --windowidbandera está ahora --window(el comando te lo advierte)
Louis Maddox
2
La --titleopción es ahora --name(el comando lo advierte fielmente)
jpaugh
2
la anidación es totalmente innecesario, debería ser xdotool search --class Chrome key F5
phil294
1
@Blauhirn La anidación era necesaria en versiones anteriores de xdotool. Pero gracias, he actualizado mi respuesta para mostrar también la sintaxis más nueva.
Gilles 'SO- deja de ser malvado'
Ah, y como estoy actualizando esto, Chrome rechaza los eventos sintéticos hoy en día. suspiro
Gilles 'SO- deja de ser malvado'
15

La solución sugerida anteriormente usó xdotool como este

 xdotool key --windowid <window> <keystroke>

que no funcionó para mí Después de experimentar un poco, llegué a

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

Una vez, eso parecía estar funcionando, definí algunos scripts y actualicé mi archivo .lircrc como se muestra aquí:

http://pcfellow.com/ClementineRemote.html

Micro
fuente
Me pregunto por qué tu primer ejemplo no funciona. Sería bueno enviar pulsaciones de teclas a ventanas no enfocadas.
Geremia
1
@Geremia, probablemente no funcione por la razón provista en las NOTAS DE ENVÍO en la documentación de xdotool.
Janthelme
4

Tuve un caso de uso similar en una Raspberry Pi con Raspbian Wheezy. Necesitaba rotar las pestañas en Chrome usando el modo quiosco (lamentablemente, instalar una extensión para hacer esto en el viejo Chrome ya no es razonable). El ejemplo de la respuesta aceptada tiene algunos errores tipográficos o simplemente no funciona con mis versiones de software, esto es lo que funciona para mí:

xdotool key --window "$(xdotool search --class Chromium | head -1)" Ctrl+Tab
Ben Brian
fuente
4

Si está utilizando Chromium para mostrar una página web personalizada y desea que se actualice regularmente, puede agregarle la siguiente etiqueta:

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

para actualizarlo automáticamente cada 5 segundos (puede configurarlo más corto o más largo si lo desea).

André Borie
fuente
2
Buen intento, pero no me pertenece Twitter, el software de supervisión de mi ISP y otros sitios que tengo que vigilar;) Probablemente debería haber mencionado esto antes
burnersk
44
Puede insertar esa etiqueta en la página utilizando un script de usuario. Podría ser una solución menos frágil que enviar una pulsación de tecla a la ventana.
Sherbang
2

Históricamente he usado Auto Hot Key para hacer cosas como enviar pulsaciones de teclas, sin embargo, eso no está disponible en Linux, pero una búsqueda rápida en Google revela que hay IronAHK ( http://www.ironahk.net/ ) no hay mucho documentación disponible todavía, pero puede hacer el truco.


fuente
El enlace ya no funciona.
Antonín Procházka