Rendez-vous sur Arrakis

C'est lorsque nous croyons savoir quelque chose qu'il faut justement réfléchir un peu plus profondément. F. Herbert

Gestionnaire de fenêtres qui aide à se concentrer : cwm

Fervent utilisateur de dwm depuis longtemps, j'ai toujours eu du mal à passer à autre chose. Les habitudes sont ancrées, tout est à portée de main, c'est simple... C'est une retrouvaille avec un vieux copain du forum debian-fr sur obsd4a (coucou eol ;) ) qui m'a donné envie de consacrer un peu de temps à un gestionnaire inclus par défaut dans OpenBSD : calm window manager ou cwm.
Il me semble qu'il s'agit là d'une belle réussite très bien pensée. L'équilibre entre fonctionnalités, ergonomie et part de configuration laissée à l'utilisateur est trouvé. Pour ma part, ça m'aide à être efficace et plus concentré.

Par contre, on ne va pas se mentir, quand on vient de gnome, ça peut être déroutant au début. Cela dit, si ça vous tente, je vous propose de faire un petit tour de ce gestionnaire de fenêtre (disponible aussi sur les distributions GNU/Linux) pour découvrir sa façon d'être. On tentera d'utiliser autant que possible les composants livrés avec OpenBSD par défaut.

Découverte et configuration

Sous OpenBSD, pour lancer une session cwm, je n'ai qu'à mettre dans le fichier ~/.xsession la ligne suivante :

cwm

Une fois la session démarrée, vous avez devant vous un écran tout gris. Beurk. C'est normal cela dit, puisque ce n'est pas au gestionnaire de fenêtres de gérer le fond d'écran. On va y remédier, ne vous en faîtes pas.

Tout d'abord, on va ouvrir un terminal. Pour ça, deux choix s'offrent à vous :

Pour déplacer la fenêtre, un glisser-déposer avec la souris tout en appuyant sur Alt fera votre bonheur.
Pour redimensionner la fenêtre, là aussi plusieurs possibilités :

Pour fermer une fenêtre, appuyez sur Ctrl-Alt-x.

Pour changer de fenêtre, vous avez toujours Alt-Tab, ou bien vous cliquez sur le bureau pour avoir un menu de sélection de fenêtre. On ne s'encombre pas avec une barre d'état, on reste concentré sur son travail :) Vous pouvez aussi appuyer sur Ctrl-/ puis taper le nom de la fenêtre. Si vous ne vous souvenez plus de son nom, appuyez sur Ctrl-a.

Ça semble faire beaucoup de raccourcis, mais ils ont tous une certaine logique et on s'y retrouve vite. Si vous n'aimez pas les raccourcis clavier, sachez que :

Dans la suite, j'écrirai "C" pour "Ctrl", "M" pour "Alt", "S" pour "Shift" et "4" pour la touche "Super" ou "Windows" qui ne sert à rien habituellement. Ces lettres sont celles utilisées dans la configuration.

Une des particularités de cwm est de permettre de :

À partir de ce moment-là, vous voudrez certainement éditer le fichier de configuration ~/.cwmrc afin d'y régler 2-3 choses.
Si vous souhaitez savoir ce que vous pouvez configurer, les pages "man cwm" et "man cwmrc" vous en diront plus.

Via ce lien, vous trouverez mon fichier de configuration si vous voulez regarder ce qui est possible. Rien de très étonnant dans ce que j'ai mis hein.
J'attire juste votre attention sur les éléments de configuration suivants :

Menu clic-droit

command "   Web   " firefox
 command "   Mail  " 'xterm -class "mutt" -fa "Hack:size=10:antialias=true" mutt'
 command "  Files  " pcmanfm
 command " > next  " "mpc next"
 command " < prev  " "mpc prev"
 command "|> toggle" "mpc toggle"
 command "   top   " "xterm top"

Avec Alt-Tab, je passe d'un groupe à l'autre rapidement

bind-key M-Tab group-cycle
 bind-key MS-Tab group-rcycle

Tiling rapide
Pour un arrangement rapide en mode "tiling" des fenêtres, j'utilise Alt-t ou Alt-Return comme dans dwm. M-S-t permet un arrangement vertical. Et ça, ça claque des fesses ! :D

bind-key M-t window-vtile
 bind-key M-Return window-vtile
 bind-key MS-t window-htile
 

à la dwm
Puisque je parle de dwm, j'utilise les mêmes raccourcis pour passer d'un groupe à l'autre et assigner les fenêtres à des groupes facilement. Si vous cherchez les noms des touches, tapes "xev" dans un terminal puis appuyez sur la touche, vous verrez alors son petit nom.

bind-key M-ampersand        group-only-1
 bind-key M-eacute           group-only-2
 bind-key M-quotedbl         group-only-3
 bind-key M-apostrophe       group-only-4
 bind-key M-parenleft        group-only-5
 bind-key M-minus            group-only-6
 bind-key M-egrave           group-only-7
 bind-key M-underscore       group-only-8
 bind-key M-ccedilla         group-only-9
 bind-key M-agrave           group-toggle-all
 
 # Déplacer les fenêtres dans un groupe
 bind-key MS-ampersand        window-movetogroup-1
 bind-key MS-eacute           window-movetogroup-2
 bind-key MS-quotedbl         window-movetogroup-3
 bind-key MS-apostrophe       window-movetogroup-4
 bind-key MS-parenleft        window-movetogroup-5
 bind-key MS-minus            window-movetogroup-6
 bind-key MS-egrave           window-movetogroup-7
 bind-key MS-underscore       window-movetogroup-8
 bind-key MS-ccedilla         window-movetogroup-9
 

Et tout autour?
Si vous avez bien regardé la capture d'écran au début, vous avez peut-être remarqué une barre tout en haut et des couleurs "solarized". C'est la partie rigolote où je vous montre mes scripts :P

Le fond d'écran
Le fond d'écran est chargé avec qiv au démarrage. En fait, ça tourne entre plusieurs fonds d'écran.
Si vous voulez rester simple, vous pouvez mettre une couleur pleine avec xsetroot (pas besoin d'installer quoi que ce soit) :

xsetroot -solid steelblue

La barre
La barre est un simple conky, dont la configuration est là : conkyrc. Il m'affiche la chanson jouée dans mpd, le nombre de nouveaux mails dans mes boîtes et la date et l'heure.
Mais ce n'est pas tout, tout à gauche, j'ai aussi les numéros des groupes utilisés par des fenêtres. Ça m'évite de les chercher, bien que je pourrais m'en passer.
Pour ça, je fais appel au script suivant :

#!/bin/sh
 
 CURGROUP=$(xprop -root -notype _NET_CURRENT_DESKTOP | cut -d'=' -f2)
 
 USEDGROUPS=$(
 for ID in $(xprop -root -notype _NET_CLIENT_LIST | cut -d'#' -f 2); do
    #echo $(xprop -id "$ID" -notype _NET_WM_DESKTOP WM_NAME)
    echo $(xprop -id "$ID" -notype _NET_WM_DESKTOP |cut -d'=' -f 2)
 done | sort -u
 )
 
 for G in $USEDGROUPS; do
    if [ $G -lt 10 ]; then
        if [ $G -eq $CURGROUP ]; then
            echo -n "\${color3}$G\${color} "
        else
            echo -n "$G "
        fi
    fi
 done
 

Ce n'est plus très utile quand on tourne entre les groupes avec Alt-Tab comme configuré plus haut.

Le terminal
J'ai décidé d'utiliser les outils livrés par défaut avec OpenBSD. Donc xterm au lieu de st. Ici, vous trouverez le fichier de configuration pour les couleurs, faire du copier/coller dans le terminal...
Ce fichier doit être chargé au démarrage avec la commande

xrdb -load ~/.Xdefaults

Le démarrage de session
Pour prendre en compte tous ces petits ajouts à chaque démarrage, modifiez le script ~/.xsession ainsi :


 #!/bin/sh
 .  ~/.profile
 # Fond d'écran
 # ou qiv -z /chemin/vers/fond/decran
 xsetroot -solid steelblue &
 # Chargement des options pour xterm
 xrdb -load ~/.Xdefaults &
 # Verouillage automatique avec xlock
 xautolock -time 10 -locker xlock &
 conky &
 
 cwm
 

Les "&" à la fin sont importants. Ajoutez dans ce fichier tous les outils que vous souhaitez lancer au démarrage de session.

Trouver une fenêtre parmi des centaines
En général je n'ai pas plus de 5 ou 6 fenêtres ouvertes en même temps. Cela dit, si un jour de folie j'en ouvrais des tas, je pourrais facilement les retrouver avec le raccourci M-/. C'est pratique quand on se souvient à peu près de l'application que l'on veut ouvrir. Sauf que quand beaucoup de fenêtres sont ouvertes, on ne se souvient peut-être plus du nom de celle souhaitée. Après avoir appuyé sur M-/, vous pouvez toutes les afficher avec C-a.
C'est chiant.
À la place, j'ai fait un script à base de dmenu :

#!/bin/sh
 # script to choose a window from list
 # only use 'xprop' coming with X server and xdotool
 
 . ~/.dmenurc
 
 P="Fenêtre:"
 OPTION="$COLORS -l 10 -p $P "
 W=$(
 (for ID in $(xprop -root -notype _NET_CLIENT_LIST | cut -d'#' -f2); do
    echo $(xprop -id "$ID" -notype WM_NAME | cut -d'=' -f 2) "::"  $(xprop -id "$ID" -notype WM_CLASS | cut -d'"' -f2) "|"    $ID
 done) | dmenu $OPTION | awk 'END {print $NF}')
 
 if [ -n "$W" ]; then
    xdotool windowactivate $W
 fi
 exit 0

Et après ?
Les outils suckless sont très agréable à utiliser avec cwm si vous aimez la simplicité. Par exemple, je n'aime pas trop xlock que je remplace avec slock. Et sans dmenu, je serai perdu. Tous ces scripts sans doute pas très propres me rendent bien service ! :)
Sinon, j'utilise des outils simples : mutt/fdm/msmtp pour les mails, Firefox pour la navigation (eh oui, surf aurait bien besoin d'être mis à jour), pcmanfm, qiv...

Ce gestionnaire de fenêtres porte bien son nom : avec, je me sens plus caaaaalme :)
Je suppose qu'un certain PengouinBSD va me tanner pour faire une page de wiki après cet article, et le pire, c'est qu'il a raison le bougre ;P

Si vous testez cwm, je serais ravi de voir vos astuces/idées/configurations en commentaies ;)

le 15/11/2017 à 16:37:42, karchnu a dit :

J'utilise depuis un paquet d'années Awesome, je n'ai jamais pris le temps de vraiment regarder sa configuration, ni ses raccourcis (j'en ai appris quelques-uns, histoire d'être efficace, fin). C'est vrai que le gestionnaire de fenêtres par défaut d'OpenBSD m'intrigue, ça me tente bien d'essayer. Je pense que je regarderai ça quand j'aurai un PC de libre. :)

le 15/11/2017 à 16:59:23, thuban a dit :

@karchnu : Ce n'est même pas le gestionnaire de fenêtres par défaut, c'est un des 3 mini-gestionnaires inclus entre twm, fvwm et cwm :) (Mais les 2 autres sont moins faciles à personnaliser).

le 15/11/2017 à 21:53:11, passionaqua a dit :

Dans le même genre de gestionnaire de fenêtres il y aussi i3wm que je trouve aussi puissant, surtout après l'avoir personnalisé/configuré comme je le voulais. :)

le 16/11/2017 à 06:18:33, skingrapher a dit :

J'avais utilisé cwm il y a très longtemps sur un ordinosaure. je dirais que c'est un excellent choix pour sa légèreté et sa simplicité. Il faut juste prendre l'habitude des raccourcis claviers pour ce qui est de l'ergonomie et oser mettre les mains dans le cambouis, autrement dit, prendre le temps de configurer. perso, je reste aujourd'hui sur ratpoison qui me suffit bien et fait le même boulot.
voui... voui... je fais de la pub pour le WM préféré des français à 0.4% :P

le 17/11/2017 à 13:31:54, sd a dit :

Merci de ton article, quel avantage comparé à DWM ?

le 17/11/2017 à 17:33:00, thuban a dit :

@sd : Il est présent par défaut :)
Ce n'est pas un tiling WM, mais peut arranger les fenêtres ainsi à la demande.

le 17/11/2017 à 23:21:28, PengouinPdt a dit :

C'est qui ce PengouinBSD ?
C'est qui se "bienautru" qui ose t'inspirer ce genre de pensées pour ladite page wiki ?
(d'ailleurs, elle n'est toujours pas faite ?... non, mais c'est quoi ça ? hein ? y'a du relâchement, je trouve)

Mon petit doigt me dit qu'il a bien raison, le bougre ;)
De toute façon, moi je reste sur Xfce.

Voili, voilou...
Non, mais ! :D

le 23/11/2017 à 19:00:10, eol a dit :

Ah, je l'attendais cet article !

Si tu trouves chiant le ^a pour afficher tous les éléments du menu,
essaie le patch[0] (seulement une ligne d'ajoutée) qui inverse
le comportement du menu.

Sinon, ton script pour trouver une fenêtre ressemble pas mal au mien
dans ce qu'il fait, on a juste pas choisi les mêmes outils :)


 IFS='
 '
 
 set -A wlist $(lsw)
 
 [ ${#wlist[@]} -ne 0 ] && \
    {
        wnum=$(
            for i in 0 $(seq $((${#wlist[@]} - 1)))
                do printf '%2s   %s
' $i ${wlist[$i]#* }
            done |dmenu -b -i -l 19 |awk '{print $1}'
        )
    }
 
 [ $wnum ] && \
    xdotool windowactivate ${wlist[$wnum]%% *}
 

Si je n'arrive pas à trouver une solution pour que lsw
liste aussi les fenêtres cachées (au sens minimisées pas juste
recouvertes par d'autres) je te piquerai l'idée de xprop
pour faire la liste des fenêtres.

Merci pour l'article !

[0]https://marc.info/?l=openbsd-misc&m=151000642801711&w=2

le 24/11/2017 à 17:39:34, eol a dit :

J'avais oublié que seq n'est pas de base dans le système.

jot

fait la même chose (et bien plus) et
est installé de base.

le 24/11/2017 à 17:59:56, thuban a dit :

@eol : merci pour le partage.
J'ai vu que tu faisais mumuse en patchant lsw ;)

le 25/11/2017 à 14:31:50, eol a dit :

Attention en utilisant jot au lieu de seq (disponible dans 9base), j'ai découvert accidentellement que quand il n'y a qu'une fenêtre, avec jot mon script part méchamment en sucette …

Normalement personne n'appele ce genre de script quand il n'y a qu'une fenêtre mais un doigt a si vite glissé sur un clavier…

Je vais le réécrire différemment.

Pour ce qui est de patcher lsw, j'en ai un autre sous le coude qui affiche aussi les fenêtres minimisées ;)
Tu as eu l'occasion d'essayer le patch sur misc@ dont j'avais mis le lien ?

le 25/11/2017 à 14:36:34, thuban a dit :

@eol : Non je n'ai pas testé pour l'instant, les geekeries sont en pause :)

le 29/11/2017 à 00:51:55, kobol a dit :

@thuban :

Est-ce que tu l'intention de faire un menu déroulant pour les applis, genre windows ou xfce ?.

Ce serait pratique !, comme ça plus besoin de XFCE, Gnome, ETC....

le 29/11/2017 à 11:36:14, fredg a dit :

Salut,

Ceci m'intrigue et me donne envie d'essayer :P

Une question cependant.
Si une fenêtre requiert notre attention, y'a t il une alerte visuelle comme c'est le cas avec dwm (fin de tâche dans un term, message hexchat, ...) ?

++

le 29/11/2017 à 12:17:21, thuban a dit :

@fredg : Non, pas de notifications. Cependant, tu as une petite étoile dans le menu des fenêtres.

le 29/11/2017 à 13:42:44, fredg a dit :

OK, bien pensé pour ne pas t'embéter en pleine concentration.
Je vais l'essayer ;)

Merci.

++

le 29/11/2017 à 16:31:07, kobol a dit :

Thuban, tu as compris mon idée ou pas ?.

le 29/11/2017 à 16:54:23, thuban a dit :

@kobol : oui j'ai compris. Et non j'ai pas envie, dmenu me suffit et cwm permet d'avoir un menu clic droit.
Mais n'hésite pas à coder si t'as envie 😆

le 01/12/2017 à 00:31:36, eol a dit :

@fredg : Quand une fenêtre est "urgente", sa bordure prends la couleur que tu as définie dans ~/.cwmrc avec par exemple :

color urgencyborder green

Pour que ça arrive en fin de tâche dans un xterm, tu peux insérer '' quelque part dans ton prompt. Si tu veux le provoquer artificiellement quand tu veux, il y a https://github.com/hiltjo/seturgent

le 02/12/2017 à 13:08:20, fredg a dit :

Très bien.

Merci @eol

++

le 02/12/2017 à 17:43:23, thuban a dit :

Si tu veux, j'utilise ce script pour focaliser rapidement une fenêtre "urgente".
Tu peux remplacer la ligne avec xdotool par n'importe quoi (notification...) :

#!/bin/sh
 # script to focus urgent window
 # only use 'xprop' coming with X server and xdotool
 
 for ID in $(xprop -root -notype _NET_CLIENT_LIST | cut -d'#' -f2); do
    if [ -n "$(xprop -id "$ID" -notype WM_HINTS |grep 'The urgency hint bit is set')" ]
    then
        xdotool windowactivate $ID
    fi
 done
 
 exit 0
 
 

le 03/12/2017 à 21:01:49, eol a dit :

@fredg : De rien.
Rétrospectivement je me suis aperçu ne t'avoir donné que la moitié de la réponse.

Si tu utilises xterm et que tu acceptes qu'une fenêtre "urgente"
te fasse savoir sans ambiguïté qu'elle l'est, tu peux ajouter

XTerm*popOnBell: true

à ~/.Xdefaults.

le 04/12/2017 à 19:30:28, fredg a dit :

Que d'info, merci :)

Je vais utiliser le forum pour les autres questions :P

++