Debian Debian-France Debian-Facile Debian-fr.org Debian-fr.xyz Debian ? Communautés

Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

Vous n'êtes pas identifié(e).

#1 14-01-2022 23:30:16

Tawal
Membre
Distrib. : Debian 11 Bullseye
Noyau : Linux 5.10.0-10-amd64
(G)UI : Xfce
Inscription : 25-02-2021

Alternative à xdotool mouse-click

Hello,

Je reposte ici un souci de bug concernant xdotool et sa commande behave . mouse-click.
Il est vieux et encore d'actualité : https://github.com/jordansissel/xdotool/issues/163

J'avais posté ce problème dans un autre sujet (qui a été résolu par contournement pour mon cas précis) :
https://debian-facile.org/viewtopic.php?id=30478
Mais bon, cette solution n'était pas si invisible que ça dans certains cas.

Bref, j'ai trouvé un sorte d'alternative à ce bug.
Elle passe par evtest qui a besoin des droits root pour lire /dev/input/eventX.
Déjà 2 choses : installer evtest et modifier le /etc/sudoers pour que l'utilisateur ait accès à la commande evtest /dev/input/eventX sans demande de mot de passe.
Ensuite, il faut identifier quel event se rapporte à la souris.
Pour ce faire :

ls -l /dev/input/by-id
ls -l /dev/input/by-path


devrait donner une bonne idée de l'event concernant la souris.
Par exemple chez moi :

ls -l /dev/input/by-id


total 0
lrwxrwxrwx 1 root root 10 15 janv. 08:28 usb-Foxlink_FE03FF-99-1-event-if00 -> ../event15
lrwxrwxrwx 1 root root  9 15 janv. 08:28 usb-Logitech_USB_Receiver-if01-event-mouse -> ../event9
lrwxrwxrwx 1 root root  9 15 janv. 08:28 usb-Logitech_USB_Receiver-if01-mouse -> ../mouse1
lrwxrwxrwx 1 root root  9 15 janv. 08:28 usb-Microsoft_Comfort_Curve_Keyboard_2000-event-kbd -> ../event6
lrwxrwxrwx 1 root root  9 15 janv. 08:28 usb-Microsoft_Comfort_Curve_Keyboard_2000-if01-event-kbd -> ../event7


On voit bien que c'est l'event 9 qui concerne ma souris.
Donc le fichier /etc/sudoers devrait comporter une ligne du genre :

Nom_Utilisateur ALL = NOPASSWD: /usr/bin/evtest /dev/input/event9


Voilà pour la partie "préparation" du terrain.

Vient maintenant le script (appelé xdo2) reproduisant le comportement de xdotool .... beahve . mouse-click ....
Son aide :

xdo2 --help


Usage :    xdo2   CMD_XDO_1   [+N CMD_XDO_2  |  +@ CMD_XDO_2]
           xdo2   -h

Subsitut de 'xdotool'.
Palie au bug de 'xdotool ... behave . mouse-click ...'.
L'argument +N ou +@ remplace le 'behave %x mouse-click'

  CMD_XDO_1 est la ligne de commande xdotool remplissant
    le WINDOW STACK sur laquelle la recherche de clic se fera ou
    une ligne de commande xdotool n'utilisant pas 'mouse-click'.
  +N indique le numéro dans la pile WINDOW STACK
    sur lequel la recherche de clic se fera.
  +@ indique que la recherche de clic se fera sur toute
    la pile WINDOW STACK.
  CMD_XDO_2 est une ligne de commande xdotool appliquée
    après la réussite du 'behave mouse-click'.
  L'argument $ utilisé dans CMD_XDO_2 se refère à l'ID de la fenêtre cliquée.
  Il est possible d'utiliser %N dans CMD_XDO_2 pour rappeler
    une fenêtre particulière de la pile WINDOW STACK crée par CMD_XDO_1.

Options :
    -h, --help    Afficher cette aide et quitter.

Exemples :
   xdo2 search --name ".*" +@  getwindowname $ exec mon_script
Recherche de clic souris sur toutes les fenêtres, si clic, afficher
le nom de la fenêtre cliquée et exécuter mon_script.
   xdo2 search --name conky +1  getwindowname %2 exec mon_script
Recherche de clic sur la 1ère fenêtre trouvée contenant conky dans le titre,
si clic, affiche le nom de la 2ième fenêtre de la pile WINDOW STACK
et exécute mon_script.



Et le script :

#!/bin/bash

### Fonction usage
usage() {
    echo -e "Usage :    \E[1m${0##*/}   CMD_XDO_1   [+N CMD_XDO_2  |  +@ CMD_XDO_2]\E[0m"
    echo -e "           \E[1m${0##*/}   -h\E[0m"
    echo
    echo -e "Subsitut de '\E[1mxdotool\E[0m'."
    echo -e "Palie au bug de '\E[3mxdotool ... behave . mouse-click ...\E[0m'."
    echo -e "L'argument \E[1m+N\E[1m ou \E[1m+@\E[0m remplace le '\E[3mbehave %x mouse-click\E[0m'"
    echo
    echo -e "  \E[1mCMD_XDO_1\E[0m est la ligne de commande \E[1mxdotool\E[0m remplissant"
    echo -e "    le \E[1mWINDOW STACK\E[0m sur laquelle la recherche de clic se fera ou"
    echo -e "    une ligne de commande \E[1mxdotool\E[0m n'utilisant pas '\E[3mmouse-click\E[0m'."
    echo -e "  \E[1m+N\E[0m indique le numéro dans la pile \E[1mWINDOW STACK\E[0m"
    echo -e "    sur lequel la recherche de clic se fera."
    echo -e "  \E[1m+@\E[0m indique que la recherche de clic se fera sur toute"
    echo -e "    la pile \E[1mWINDOW STACK\E[0m."
    echo -e "  \E[1mCMD_XDO_2\E[0m est une ligne de commande \E[1mxdotool\E[0m appliquée"
    echo -e "    après la réussite du '\E[3mbehave mouse-click\E[0m'."
    echo -e "  L'argument \E[1m$\E[0m utilisé dans \E[1mCMD_XDO_2\E[0m se refère à l'ID de la fenêtre cliquée."
    echo -e "  Il est possible d'utiliser \E[1m%N\E[0m dans \E[1mCMD_XDO_2\E[0m pour rappeler"
    echo -e "    une fenêtre particulière de la pile \E[1mWINDOW STACK\E[0m crée par \E[1mCMD_XDO_1\E[0m."
    echo
    echo    "Options :"
    echo    "    -h, --help    Afficher cette aide et quitter."
    echo
    echo    "Exemples :"
    echo -e "   \E[3m${0##*/} search --name \".*\" +@  getwindowname $ exec mon_script\E[0m"
    echo    "Recherche de clic souris sur toutes les fenêtres, si clic, afficher"
    echo -e "le nom de la fenêtre cliquée et exécuter \E[3mmon_script\E[0m."
    echo -e "   \E[3m${0##*/} search --name conky +1  getwindowname %2 exec mon_script\E[0m"
    echo -e "Recherche de clic sur la 1ère fenêtre trouvée contenant \E[3mconky\E[0m dans le titre,"
    echo -e "si clic, affiche le nom de la 2ième fenêtre de la pile \E[1mWINDOW STACK\E[0m"
    echo -e "et exécute \E[3mmon_script\E[0m."
    exit 0
}

### Gestion option
while getopts :h-: _XDO_MC_opt
do
    case $_XDO_MC_opt in
        h) usage
           ;;
        -) case $OPTARG in
               help) usage
                     ;;
                  *) echo "Erreur d'option !" >&2 && exit 1
                     ;;
           esac
           ;;
        *) echo "Erreur d'option !" >&2 && exit 1
           ;;
    esac
done

### Test des variables
if set | grep "^XDO_MC_.*=.*$" >/dev/null 2>&1
then
    exit 127
fi

### Lecture et Construction ligne commande de recherche
XDO_MC_Comm=( "$@" )

for XDO_MC_i in ${!XDO_MC_Comm[@]}
do
   if [ "${XDO_MC_Comm[$XDO_MC_i]:0:1}" != "+" ]
   then
      XDO_MC_Comm_deb[$XDO_MC_i]=${XDO_MC_Comm[$XDO_MC_i]}
      continue
   elif [ "${XDO_MC_Comm[$XDO_MC_i]:0:1}" = "+" ]
   then
      XDO_MC_rais=${XDO_MC_Comm[$XDO_MC_i]#+}
   fi
   shift $((XDO_MC_i+1))
   break
done
XDO_MC_Comm_fin=( "$@" )

if [ ! "$XDO_MC_rais" ]
then
    xdotool "${XDO_MC_Comm[@]}"
    exit
fi


### Tableau des fenêtres trouvées
XDO_MC_Fen_Sel=( $(xdotool "${XDO_MC_Comm_deb[@]}") )

### Raison de recherche du clic souris
if [ "$XDO_MC_rais" = "@" ]
then
    XDO_MC_id_window="${XDO_MC_Fen_Sel[*]}"
else
    XDO_MC_id_window=${XDO_MC_Fen_Sel[$((--XDO_MC_rais))]}
fi

### Écoute des évenements souris
coproc clic (sudo evtest /dev/input/event9)

### Test en continu du clic souris et exécution de la commande
while read XDO_MC_l <&${clic[0]}
do
    if [[ $XDO_MC_l =~ BTN_LEFT.*value.*0$ ]]
    then
        XDO_MC_wc=$(xdotool getmouselocation | awk -F: '{printf $NF}')
        if [[ $XDO_MC_id_window =~ $XDO_MC_wc ]]
        then
            if [ "${XDO_MC_Comm_fin[*]}" ]
            then
                for XDO_MC_i in ${!XDO_MC_Comm_fin[@]}
                do
                    if [ "${XDO_MC_Comm_fin[$XDO_MC_i]:0:1}" = "%" ]
                    then
                        XDO_MC_Comm_fin[$XDO_MC_i]="${XDO_MC_Fen_Sel[$((${XDO_MC_Comm_fin[$XDO_MC_i]:1}-1))]}"
                    elif [ "${XDO_MC_Comm_fin[$XDO_MC_i]}" = "$" ] || [ "${XDO_MC_Comm_fin[$XDO_MC_i]:0:1}" = "+" ]
                    then
                        XDO_MC_Comm_fin[$XDO_MC_i]="+$XDO_MC_wc"
                    fi
                done
                xdotool "${XDO_MC_Comm_fin[@]#+}"
            fi
        fi
    fi
done



Retour d'un exemple de l'aide :

xdo2 search --name ".*" +@  getwindowname $ exec echo "OK"


xfce4-panel
OK
conky_total
OK
Bureau
OK
Tawal $ ~/Term/Progs-Test
OK
^C


Bon, on comprend sur quoi j'ai cliqué smile

Dernière modification par Tawal (15-01-2022 11:25:47)


Comme la science n'est pas infuse, elle se diffuse.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !

Hors ligne

#2 15-01-2022 11:20:07

Tawal
Membre
Distrib. : Debian 11 Bullseye
Noyau : Linux 5.10.0-10-amd64
(G)UI : Xfce
Inscription : 25-02-2021

Re : Alternative à xdotool mouse-click

Up,

Désolé pour hier soir, avec ce message plus que tronqué zen.gif
Mais j'ai fait d'abord une mauvaise manipulation entre "Prévisualisation" et "Valider".
Puis, est survenu une coupure de courant, en pleine édition de mon message !
Le voilà donc à jour.

Comme la science n'est pas infuse, elle se diffuse.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !

Hors ligne

Pied de page des forums