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

40

J'utilise un Raspberry Pi en combinaison avec Chromium (mode kiosque) pour afficher certaines statistiques. Le Pi n’ayant pas de clavier connecté, j’ai donc cherché une solution pour envoyer des frappes du terminal au processus Chromium (onglet) . La saisie normale fonctionne, mais comment puis-je 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
Burnersk
la source

Réponses:

51

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

Vous devez trouver l'ID de la fenêtre à laquelle vous souhaitez envoyer la frappe. Vous pouvez le faire avec xdotool. xdotool search --class Chromerenvoie la liste des identifiants de toutes les fenêtres de Chrome. Si cela retourne plus d'un, vous devez choisir celui que vous voulez. Vous pouvez utiliser xdotool search --namepour faire correspondre le titre à la place 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 identifiant de fenêtre, vous pouvez appeler xdotoolpour injecter une frappe. Malheureusement, de nombreuses applications rejettent les événements synthétiques, par exemple les frappes au clavier et les événements de souris envoyés par une autre application. C'est le cas des 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 le focus clignotera rapidement dans la fenêtre Chrome et inversement. L'extrait de code suivant est envoyé F5à la première fenêtre de 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)

Rappelez-vous que cela envoie F5à cette fenêtre et qu’il appartient au programme de décider quoi en faire. Dans Chrome, cela recharge l'onglet en cours.

Gilles, arrête de faire le mal
la source
4
le --windowiddrapeau est maintenant --window(la commande vous en avertit)
Louis Maddox
2
L' --titleoption est maintenant --name(la commande l'avertit fidèlement)
jpaugh
2
la nidification est totalement inutile, elle devrait l'être xdotool search --class Chrome key F5
phil294
1
@Blauhirn Cette imbrication était nécessaire dans les anciennes versions de xdotool. Mais merci, j'ai mis à jour ma réponse pour montrer également la nouvelle syntaxe.
Gilles 'SO- arrête d'être méchant'
Oh, et depuis que je suis en train de le mettre à jour, Chrome rejette les événements synthétiques de nos jours. soupir
Gilles 'SO- arrête d'être méchant'
15

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

 xdotool key --windowid <window> <keystroke>

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 des scripts et mis à jour mon fichier .lircrc comme indiqué ici:

http://pcfellow.com/ClementineRemote.html

Mike
la source
Je me demande pourquoi votre premier exemple ne fonctionne pas? Il serait bien d’envoyer des frappes sur des fenêtres non focalisées.
Geremia
1
@Geremia, cela ne fonctionne probablement pas pour la raison indiquée dans les SENDEVENT NOTES de la documentation xdotool.
Janthelme
4

J'ai eu un cas d'utilisation similaire sur un Raspberry Pi sous Raspbian Wheezy. J'avais besoin de faire pivoter les onglets sur Chrome en utilisant le mode kiosque (malheureusement, l'installation d'une extension pour le faire sur l'ancien Chrome n'est plus raisonnable). L'exemple de la réponse acceptée comporte des fautes de frappe ou ne fonctionne tout simplement pas avec les versions de mon logiciel. Voici ce qui fonctionne pour moi:

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

Si vous utilisez Chromium pour afficher une page Web personnalisée et souhaitez l'actualiser régulièrement, vous pouvez y ajouter le tag suivant:

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

pour l'actualiser automatiquement toutes les 5 secondes (vous pouvez le définir plus court ou plus long si vous le souhaitez).

André Borie
la source
2
Bien essayé mais je ne possède pas Twitter, le logiciel de surveillance de mon fournisseur de services Internet et d'autres sites que je dois surveiller;) J'aurais probablement dû en faire mention auparavant
burnersk
4
Vous pouvez insérer cette balise dans la page à l'aide d'un script utilisateur. Peut-être une solution moins fragile que d’envoyer une pression de touche à la fenêtre.
Sherbang
2

J'ai toujours utilisé la touche d'accès rapide automatique pour faire des choses comme appuyer sur une touche d'envoi, mais ce n'est pas disponible sous Linux, mais une recherche rapide sur Google révèle qu'il existe IronAHK ( http://www.ironahk.net/ ). documentation disponible pour le moment, mais cela peut faire l'affaire.


la source
Le lien ne fonctionne plus.
Antonín Procházka le