Journal Jouons avec sawfish (et zsh)

Posté par  .
Étiquettes : aucune
0
22
août
2005
Histoire de pouvoir dire que j'ai fait quelque chose de mes vacances je me suis divertit en pondant un petit script pour sawfish qui marche en collaboration avec zsh.

Étant d'un naturel franchement bordelique je finis couramment mes sessions avec une bonne vingtaine de terminaux ouverts. d'où l'idée d'avoir une fonction qui m'active un terminal inutilisé plutôt que de m'en ouvrire un nouveau à chaque fois... voilà comment ça se passe (c'est la première fois que je fais mumuse avec sawfish, les commentaires sont les bienvenus):

À ajouter dans ~/.sawfishrc:
(define (set-xterm-ready win-id)
(window-put (get-window-by-id win-id) 'A_READY_XTERM 't))

(define (unset-xterm-ready win-id)
(window-put (get-window-by-id win-id) 'A_READY_XTERM nil))

;; Active le terminal libre ayant été privé du focus le plus longtemps, un appel
;; répété de la fonction aboutira donc à un parcours de tout les terminaux libres.
(define (get-next-xterm-ready)
(require 'sawfish.wm.util.window-order)
(let ((term (car (member-if (lambda (x)
(window-get x 'A_READY_XTERM))
(reverse (window-order))))))
(if term
(fetch-win term)
(system (getenv "MY-XTERM")))))

;; Activation "complète" de la fenêtre (déplacement vers le bureau courant si
;; nécessaire, activation du focus et mise au 1er plan).
(define (fetch-win w)
(unless (window-in-workspace-p w current-workspace)
(move-window-to-workspace
w
(car (window-workspaces w))
current-workspace
nil))
(activate-window w))

NB: Si aucun terminal inutilisé à été trouvé lors de l'appel de la fonction, un nouveau terminal est automatiquement lancé (ce dernier étant contenu dans la variable d'environnement "MY-XTERM", l'appel en dur peut se faire en remplaçant (system (getenv "MY-XTERM")) par (system "myterm")).

Et dans ~/.zshrc:
if [ "$TERM" = "xterm" -o "$TERM"="Eterm" -o "$TERM"="aterm" -o "$TERM"="rxvt" ] ; then
precmd (){
sawfish-client -q -c "(set-xterm-ready ${WINDOWID})" &> /dev/null
}
preexec () {
sawfish-client -q -c "(unset-xterm-ready ${WINDOWID})" &> /dev/null
}
fi

Voilà, ensuite il suffit de binder la fonction correspondante à une touche dans ~/.sawfishrc:
(bind-keys global-keymap "F12" '(get-next-xterm-ready))

Ou à un lanceur quelconque qui exécutera:
sawfish-client -q -c '(get-next-xterm-ready)'

Ça reste bien sûr à adapter suivant les besoins (garder un raccourcis ouvrant à tous les coups un terminal est bien évidemment plus qu'utile).
  • # astuces ?

    Posté par  . Évalué à 3.

    dans les astuces, ca serait 'achement plus mieux...
    • [^] # Re: astuces ?

      Posté par  . Évalué à 4.

      Yep, j'y pensais, mais j'aurais quand même bien aimé avoir un retour sur le code (les journaux sont quand même beaucoup + réactif pour ce genre de chose) que de proposer un truc cracra en astuces qui serait de toute façon refusé...
  • # Cool, mais...

    Posté par  (site web personnel) . Évalué à 3.

    ...je n'utilise ni xterm, ni sawfish. Cependant, ça m'a donné des idées :) J'utilise Konsole, et savoir en un clin d'oeil ce qui tourne dans les différents onglets me sera d'une grand utilité. Donc, voila ce que je viens de pondre, en espérant que ça profite à d'autres...
    if [ "$KONSOLE_DCOP_SESSION" != "" ]; then
    
        precmd() {
            if [ -n "$OLD_SESSION_NAME" ]
            then
                dcop $KONSOLE_DCOP_SESSION renameSession "$OLD_SESSION_NAME"
                unset OLD_SESSION_NAME
            fi
        }
    
        preexec() {
            NEWNAME=`print -P "%20>..>$1"`
            export OLD_SESSION_NAME="`dcop $KONSOLE_DCOP_SESSION sessionName`"
            dcop $KONSOLE_DCOP_SESSION renameSession "$NEWNAME"
        }
    fi
    
    Merci beaucoup pour l'idée !
    • [^] # Re: Cool, mais...

      Posté par  (site web personnel) . Évalué à 1.

      tiens, je me réponds à moi-même pour signaler qu'on peut remplacer le test de la première ligne par le même genre de « -n » que dans la fonction precmd().
      if [ -n "$KONSOLE_DCOP_SESSION" ]; then
      

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.