2 votes

Compiz "screen edge bindings actions" comme mais sans Compiz

Je souhaite utiliser un outil pour exécuter command (o script ) lorsque la souris touche le bord de l'écran, mais sans Compiz. A quoi ressemble l'outil "actions sur les bords" de Compiz ? Compiz n'est pas supporté sur mon ordinateur portable, donc je cherche une autre solution.

Je souhaite exécuter des commandes lorsqu'on touche le bord de l'écran associé aux boutons de la souris +, comme la fonction de Compiz mais sans Compiz. J'ai essayé Brightside mais il ne supporte pas le bord pour exécuter des commandes, seulement les coins.

2voto

dessert Points 36815

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à.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X