Vous pouvez utiliser xinput --query-state $XID
ou xdotool getmouselocation
pour obtenir la position de la souris. La caractéristique la plus cool de xdotool getmouselocation
est son --shell
avec cette option et eval
vous pouvez affecter les valeurs aux variables sans avoir besoin de découper une sortie en morceaux, par exemple :
$ eval $(xdotool getmouselocation --shell)
$ echo $X, $Y
604, 778
Avec cela, nous pouvons construire un while
boucle qui teste constamment la valeur souhaitée, par exemple :
while :;
do
eval $(xdotool getmouselocation --shell)
(( $X <= 20 )) && break
sleep .1
done
Cela fonctionnera jusqu'à ce que $X
est égal ou inférieur à 20 et testé toutes les 100 millisecondes. Je recommande de construire un script pour votre situation exacte à partir de cela, quelque chose comme ceci :
#!/bin/bash
id=9 # device XID, run xinput without any option to get a list of devices and their IDs
interval=.01 # sleep interval between tests in seconds
# edge areas
# to display the current mouse coordinates run xdotool getmouselocation
# syntax: x_min x_max y_min y_max
e1=(200 1079 0 20)
e2=(1259 1279 200 823)
e3=(200 1079 1003 1023)
e4=(0 20 200 823)
while :; do
eval $(xdotool getmouselocation --shell)
if ( [ ${#e1[@]} -ne 0 ] && (( $X >= ${e1[0]} && $X <= ${e1[1]} && $Y >= ${e1[2]} && $Y <= ${e1[3]} )) ); then
# your commands for edge area e1
echo "Your mouse was detected inside the monitored area no. 1 at $X, $Y."
sleep 2
fi
if ( [ ${#e2[@]} -ne 0 ] && (( $X >= ${e2[0]} && $X <= ${e2[1]} && $Y >= ${e2[2]} && $Y <= ${e2[3]} )) ); then
# your commands for edge area e2
echo "Your mouse was detected inside the monitored area no. 2 at $X, $Y."
sleep 2
fi
if ( [ ${#e3[@]} -ne 0 ] && (( $X >= ${e3[0]} && $X <= ${e3[1]} && $Y >= ${e3[2]} && $Y <= ${e3[3]} )) ); then
# your commands for edge area e3
echo "Your mouse was detected inside the monitored area no. 3 at $X, $Y."
sleep 2
fi
if ( [ ${#e4[@]} -ne 0 ] && (( $X >= ${e4[0]} && $X <= ${e4[1]} && $Y >= ${e4[2]} && $Y <= ${e4[3]} )) ); then
# your commands for edge area e4
echo "Your mouse was detected inside the monitored area no. 4 at $X, $Y."
sleep 2
fi
sleep $interval
done
J'ai créé des zones de bord à titre d'exemple, qui commencent et finissent à 200px des coins et couvrent la zone située à 20px du bord pour mon écran de 1279x1023px - vous devrez les adapter à vos besoins. Si vous avez besoin de moins de zones, il suffit de supprimer ou de commenter les autres. Les commandes que vous voulez exécuter vont dans le répertoire if
à l'intérieur de la fonction while. Pour éviter les appels multiples lorsque vous laissez la souris à l'intérieur de la zone de bordure, vous pouvez utiliser la fonction sleep
, break
ou simplement tester si la commande en question s'exécute déjà.