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 des frappes du terminal au processus Chromium (onglet). L'entrée normale fonctionne mais comment envoyer quelque chose comme F5
(une touche spéciale :rafraichissement du navigateur) via cette solution ?
# pidof chromium
20809 20790 20788 20786 20783
# echo 'some text' > /proc/20809/fd/0
Réponse acceptée :
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 frappe dans une fenêtre. xdotool est assez courant et pratique.
Vous devrez trouver l'ID de la fenêtre à laquelle vous souhaitez envoyer la frappe. 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 renvoie plus d'un, vous devez choisir celui que vous voulez. Vous pouvez utiliser xdotool search --name
pour correspondre sur le 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 événements de frappe et de souris envoyés par une autre application. C'est le cas des versions actuelles de Chrome. Il est possible d'injecter une frappe depuis 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 clignoter rapidement la mise au point sur la fenêtre Chrome et inversement. L'extrait suivant envoie F5 à la première fenêtre Chrome (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.