web-dev-qa-db-fra.com

Tapez gedit en utilisant xdotool dans un script

Je veux taper un caractère dans un shell et que xdotool envoie le signal de ce personnage à gedit, de sorte que ce caractère soit saisi dans gedit.

J'ai écrit ce script:

#!/bin/bash
gedit -s &
GEDPID=$!
sleep 2s
GEDWINID=`xdotool search --pid $GEDPID | tail -1`
echo "press any keys"
read i
xdotool windowactivate --sync $GEDWINID key --clearmodifiers --delay 100 "$i" && wmctrl -a Terminal

Tout fonctionne bien sauf que le script attend enter envoyer un signal clavier à gedit.

J'ai donc changé read i en read -n1 i, pour que le script fasse son travail sans entrer.

#!/bin/bash
gedit -s &
GEDPID=$!
sleep 2s
GEDWINID=`xdotool search --pid $GEDPID | tail -1`
echo "press any keys"
read -n1 i
xdotool windowactivate --sync $GEDWINID key --clearmodifiers --delay 100 "$i" && wmctrl -a Terminal

Mais il ne tape aucun caractère dans gedit!

Et voici la question, quel est le problème du second script? Quelle est la différence entre read i et read -n1 i qui cause ce problème?

3
Ali Razmdideh

J'ai pu recréer ce problème. Bien que je ne sache pas pourquoi il y a une différence entre read et read -n1, l'ajout d'un simple délai avant que la touche ne le rende opérationnelle. Mon hypothèse est qu'il n'y a pas assez de temps après que la fenêtre a basculé pour enregistrer la frappe.

#!/bin/bash
gedit -s &
GEDPID=$!
sleep 2s
GEDWINID=`xdotool search --pid $GEDPID | tail -1`
echo "press any keys"
read -n1 i
xdotool sleep 0.1 windowactivate --sync $GEDWINID key --clearmodifiers --delay 100 "$i" && wmctrl -a Terminal
1
Evan Chen

J'ai modifié votre script d'origine pour qu'il identifie correctement la fenêtre de votre terminal actuel et permute entre les fenêtres Terminal et Gedit. Ce script utilise une boucle infinie, ainsi toutes les frappes imprimées dans la fenêtre Terminal sont transférées dans Gedit. Annuler avec Ctrl+C.

#!/bin/bash

WIDGTERM=$(xdotool getactivewindow)
gedit -s 2> /dev/null &
sleep 2s
WIDGEDIT=$(xdotool getactivewindow)
xdotool windowactivate $WIDGTERM
echo "Press any keys"
while true
do
  read -n1 i
  xdotool windowactivate --sync $WIDGEDIT key --clearmodifiers "$i"
  sleep .5
  xdotool windowactivate --sync $WIDGTERM
done
0
whtyger