web-dev-qa-db-fra.com

Comment envoyer des frappes (F5) du terminal à un programme GUI?

J'utilise un Raspberry Pi en combinaison avec Chromium (mode kiosque) pour afficher certaines statistiques. Le Pi n'a pas de clavier connecté, j'ai donc cherché une solution pour envoyer les frappes du terminal au processus Chrome (tab) . L'entrée normale fonctionne mais comment envoyer quelque chose comme F5 (une touche spéciale: rafraîchissement du navigateur) via cette solution?

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

Les programmes GUI ne lisent pas à partir de leur entrée standard, ils obtiennent leur entrée du serveur X . Il existe des outils pour injecter une touche dans une fenêtre. xdotool est assez courant et pratique.

Vous devrez trouver l'ID de la fenêtre à laquelle vous souhaitez envoyer la séquence de touches. Vous pouvez le faire avec xdotool. xdotool search --class Chrome renvoie la liste des ID de fenêtre de toutes les fenêtres Chrome. Si cela en renvoie plusieurs, vous devez choisir celle que vous souhaitez. Vous pouvez utiliser xdotool search --name pour correspondre au titre au lieu de la classe. Vous pouvez également analyser la sortie de wmctrl et extraire l'ID de fenêtre souhaité.

Une fois que vous avez trouvé le bon ID de fenêtre, vous pouvez appeler xdotool pour injecter une frappe. Malheureusement, de nombreuses applications rejettent les événements synthétiques, c'est-à-dire les frappes et les événements de souris envoyés par une autre application. C'est le cas avec les versions actuelles de Chrome. Il est possible d'injecter une frappe d'une autre application par un mécanisme différent, mais cela nécessite que la fenêtre soit focalisée. Vous pouvez faire tout cela avec xdotool, mais cela fera rapidement scintiller le focus vers la fenêtre Chrome et retour. L'extrait suivant envoie F5 à la première Chrome fenêtre (dans un ordre quelque peu arbitraire).

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

Ou avec les anciennes versions de xdotool:

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

N'oubliez pas que cela envoie F5 à cette fenêtre et c'est au programme de décider quoi en faire. Dans Chrome, cela recharge l'onglet actuel.

La solution suggérée ci-dessus a utilisé xdotool comme ceci

 xdotool key --windowid <window> <keystroke>

ce qui n'a pas fonctionné pour moi. Après quelques expériences, je suis arrivé à

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

Une fois, cela semblait fonctionner, j'ai défini quelques scripts et mis à jour mon fichier .lircrc comme indiqué ici:

http://pcfellow.com/ClementineRemote.html

15
Mike

Si vous utilisez Chromium pour afficher une page Web personnalisée et que vous souhaitez l'actualiser régulièrement, vous pouvez lui ajouter la balise suivante:

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

pour le rafraîchir automatiquement toutes les 5 secondes (vous pouvez le régler plus ou moins longtemps si vous le souhaitez).

4
André Borie

J'ai eu un cas d'utilisation similaire sur un Raspberry Pi exécutant Raspbian Wheezy. Je devais faire pivoter les onglets sur Chrome en utilisant le mode kiosque (malheureusement, installer une extension pour le faire sur l'ancien Chrome n'est plus raisonnable). L'exemple de réponse accepté) a quelques fautes de frappe ou ne fonctionne tout simplement pas avec mes versions de logiciel, voici ce qui fonctionne pour moi:

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

J'ai toujours utilisé la touche de raccourci automatique pour faire des choses comme envoyer des pressions de touches, mais ce n'est pas disponible sur Linux, mais une recherche rapide sur Google révèle qu'il y a IronAHK ( http://www.ironahk.net/ =) il n'y a pas encore beaucoup de documentation disponible, mais cela peut faire l'affaire.

2
hafnero