Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 03/01/2015, à 22:20

LapiGNU

[Tuto] frenchKISS : Openbox et aerosnap à la souris.

Salut à tous,

pour bien attaquer l'année, je vous propose d'ajouter simplement à Openbox une fonction "AeroSnap". C'est quelque chose qui se fait habituellement au clavier, mais je trouve ça vraiment ballot de ne pas le faire aussi avec la souris. J'ai donc trouvé un truc tout bête, dans la plus pure philosophie KISS encore chère à une poignée de linuxiens, avec juste un peu de Bash, XDoTool et une petite conf qui va bien dans Openbox.

Une démonstration en vidéo : Openbox et Aerosnap à la souris sur Youtube

Comment on procède ...

1 - Configuration d'Openbox, en général par le biais de ~/.config/openbox/rc.xml ; on modifie les "keybindings" ainsi que les "mousebindings" pour accéder aux fonctions avec le clavier aussi bien qu'avec la souris. Il faut donc ajouter, aux emplacements idoines :

<keybind key="C-A-S-Left">
      <action name="execute">
        <command>fkSnap --left</command>
      </action>
</keybind>
<keybind key="C-A-S-Right">
      <action name="execute">
        <command>fkSnap --right</command>
      </action>
</keybind>
<keybind key="C-A-S-Down">
      <action name="execute">
        <command>fkSnap --restore</command>
</keybind>

Vous noterez que les combinaisons de touches sont Control+Alt+Shift+ flèche vers la gauche / flèche vers la droite / flèche vers le bas.

<mousebind button="Left" action="Drag">
        <action name="Execute">
          <command>fkSnap</command>
        </action>
        <action name="Move"/>
</mousebind>

Vous noterez que la ruse consiste donc à lancer le script fkSnap avant d'attaquer le déplacement de la fenêtre, lorsque l'on "drague" la barre de titre.

2 - Création du script /usr/bin/fkSnap : il faut avoir les droits d'administration pour créer ce script, et penser à le rendre exécutable.

#!/bin/bash

# fkSnap gère un éventuel snapping de la fenêtre active à l'issue
# de son déplacement à la souris, ou un snapping demandé via un
# raccourci clavier.

# publié sous licence WTFPL 2.0 par Lapinou, août 2014.


# On mesure la largeur de l'écran en pixels.
# NB : le script ne fonctionne pour l'instant qu'avec
# UN SEUL ECRAN !!!

screenWidth=$(xrandr | grep current | cut -d ',' -f 2 | cut -d ' ' -f 3)


# On enregistre l'id, la position et les dimensions de la fenêtre active
# dans un fichier caché.

xdotool getactivewindow getwindowgeometry --shell > .zonkTMP
eval $(cat .zonkTMP)


# On a besoin de connaître la liste des souris, touchpads etc pouvant
# être utilisés pour déplacer une fenêtre :

pointerIdList=$(xinput --list | grep -v XTEST | grep slave | grep pointer | grep -oP '.*id=\K[0-9]*')


# Si l'on réagit à un Drag And Drop alors il y a a priori un bouton enfoncé :
# (assertion pourrie, mais ça donne une excuse pour entrer dans la boucle).

itIsDown="Yes"


# S'il existe déjà un fichier caché nommé selon l'id de la fenêtre,
# alors cette fenêtre a déjà été snappée et l'on doit la restaurer
# dans son état précédent (dimensions, le placement est fait à la souris).

if [ -e .$WINDOW ]; then

  transset -a 0.5

  # On attend que le bouton de la souris -ou équivalent- soit relaché,
  # dans le cas d'un Drag And Drop.

  while [ "$itIsDown" != "" ]; do 
    
    for pointerId in $pointerIdList; do
      listOfDowns=$listOfDowns$(xinput --query-state $pointerId | grep down)
    done
    itIsDown=$listOfDowns
    listOfDowns=""

  done

  transset -a 1

  eval $(cat .$WINDOW)
  xdotool windowsize $WINDOW $WIDTH $HEIGHT

  if [ "$1" = "--restore" ]; then
    xdotool windowmove $WINDOW $X $(($Y-44))
  fi

  rm .$WINDOW


# sinon, on crée ce fichier et l'on passe au snapping.

else

  mv -f .zonkTMP .$WINDOW

  transset -a 0.5

  # On attend que le bouton de la souris -ou équivalent- soit relaché,
  # dans le cas d'un Drag And Drop.

  while [ "$itIsDown" != "" ]; do
 
    for pointerId in $pointerIdList; do
      listOfDowns=$listOfDowns$(xinput --query-state $pointerId | grep down)
    done
    itIsDown=$listOfDowns
    listOfDowns=""

  done

  transset -a 1

  # On stocke les nouvelles caractéristiques de la fenêtre dans
  # les variables X, Y, WIDTH et HEIGHT.
  # NB: si l'on réagit à un raccourci clavier, les nouvelles données
  # sont celles que l'on vient d'écrire dans un fichier, et la vie est belle.

  eval $(xdotool getactivewindow getwindowgeometry --shell)

  if [ "$X" -lt "0" ] || [ "$1" = "--left" ]; then
    xdotool windowsize $WINDOW 50% 100%
    xdotool windowmove $WINDOW 0 0
  elif [ "$((X+WIDTH))" -gt "$screenWidth" ] || [ "$1" = "--right" ]; then
    xdotool windowsize $WINDOW 50% 100%
    xdotool windowmove $WINDOW $(($screenWidth/2)) 0
  else
    rm .$WINDOW
  fi

fi

rm .zonkTMP

Vous constaterez à la lecture de ce code plusieurs choses : il est plutôt rustique, voire moche, mais il fonctionne, jusqu'à preuve du contraire. Il est publié sous licence WTFPL 2.0, et il a besoin qu'xdotool soit installé.

3 - Installation d'xdotool : apt-get install xdotool.

Une fois ces trois étapes réalisées, et après -au minimum- un petit

openbox --reconfigure

vous devriez pouvoir utiliser AeroSnap à la sauce frenchKISS, hoplà !


frenchKISS sur www.tchitcha.info, Ubuntu clé en main pour les réseaux de postes de travail.
et surtout : Sauvez les arbres, mangez des castors. Sauvez les castors, ne mangez pas d'arbres !

Hors ligne