`xdotool` n'envoie pas de clés


8

J'essaie d'envoyer des touches via xdotool. Cependant, l'envoi ne fonctionne pas correctement.

Vous trouverez ci-dessous le journal d'un script qui devrait sélectionner tout le texte dans Gedit et le copier (mais il ne fait rien à la place), ainsi que sa sortie (capturée en redirigeant à la fois stdout et stderr):

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

J'ai essayé avec Thunderbird, et le script envoie les clés, mais sans modificateurs (non Control, c'est-à-dire). Par ailleurs, dans le script, les clés sont entourées par ", comme "ctrl+a".

La différence entre Gedit et Thunderbird peut être que Gedit est une application GTK3, tandis que Thunderbird semble une application GTK2 (mais Firefox, qui semble être une application GTK3, se comporte comme Thunderbird).

xdotool version 3.20141006.1
Système d'exploitation: Debian GNU / Linux 8.1 (noyau Linux 3.16.0-4-amd64)
Desktop Manager: GNOME Shell 3.14.4


1
si vous utilisez, xbindkeysvous devez libérer les clés qui déclenchent votre script xdotool keyup ...pour un fonctionnement fiable
grabantot

Réponses:


7

Lorsqu'un événement clavier ou souris est généré par une application plutôt que par un périphérique d'entrée, cet événement est marqué comme «synthétique». De nombreuses applications rejettent les événements synthétiques.

En théorie, il y a une raison de sécurité à cela - vous pouvez exécuter une application sur votre écran X mais sous un compte différent ou sur une machine différente - mais X est si mauvais pour isoler les applications (il n'a jamais été conçu pour cela) que vous ne devriez pas ne permettez pas aux applications non fiables d'accéder à votre écran. Et si vous ne le faites pas, il n'y a aucune raison de rejeter les événements synthétiques.

Pour autant que je sache, Gtk n'offre pas de moyen générique pour décider d'autoriser ou non des événements synthétiques. Cela dépend des applications individuelles, et je ne sais pas quelle est la valeur par défaut si le programmeur s'en fiche.

Il existe une autre façon d'injecter des événements d'entrée, avec l'extension XTEST. Les événements ainsi injectés apparaissent exactement comme les événements d'un périphérique d'entrée: en effet, ils proviennent d'un périphérique d'entrée «test». L'inconvénient de cette approche est qu'ils sont acheminés vers une fenêtre de la même manière que tout autre événement, ils sont donc envoyés à la fenêtre qui a le focus (sauf s'ils sont interceptés par le gestionnaire de fenêtres). Vous pouvez envoyer des événements XTEST avec (des versions suffisamment récentes de) xdotool, c'est ce qu'il fait si vous ne transmettez pas d'ID de fenêtre.

xdotool windowactivate 29360262
xdotool key ctrl+a ctrl+c

Oui, c'est ennuyeux. Vous pouvez trouver une discussion de ce problème sur le wiki Selenium . Il semble qu'il existe un moyen d'envoyer de faux événements à une application GTK + via des signaux GTK ou des événements GDK, mais je ne sais pas comment cela fonctionne.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.