Dwm

De Le Wiki du Forum-Debian.fr
Aller à la navigation Aller à la recherche

Présentation :

Dwm est le tiling windows manager (Gestionnaire de fenêtres en tuile) développé par l'équipe de suckless.org. Fidèle à leur philosophie, il est écrit en C, permettant ainsi la contribution de chacun au projet, ce langage étant plus que répandu et éprouvé. De plus, cela oblige les codeurs à faire du code propre et léger.

Le but de ce window manager est avant tout de profiter d'une gestion dynamique des fenêtres, que vous pourrez gérer via des étiquettes (tags) par des raccourcis claviers principalement.

L'avantage pour le simple utilisateur, c'est que le C est très clair, et et que l'on a même pas besoin de tout comprendre pour le configurer. Eh oui, tout a été pensé, il suffit en fait d'éditer rien qu'un tout petit fichier : le config.h , qui a été construit de manière à rendre la configuration accessible même aux non-initiés. De plus, cela évite les multiples fichiers de configuration tiers, on configure dwm une fois, et une fois qu'il est insallé, on n'a plus rien à toucher, tout est dans le binaire! Ainsi, dwm n'a pas à chercher et lire ces fichiers de configuration pour faire son boulot, donc le temps d'éxécution est amélioré! Debian propose un paquet de démonstration. On expliquera ici comment reconstruire un paquet proprement, une fois que l'on a configuré dwm à notre sauce. Le code de dwm a été construit dans le but de pouvoir ajouter des fonctionnalités simplement, sous forme de patches. Vous pourrez alors composer votre gestionnaire de fenêtre, avec les fonctions que vous désirez. Avant de vous présenter ici les différentes configurations possible, astuces et autres, je ne peux continuer sans une traditionnelle capture d'écran :


un exemple d'utilisation de dwm

Tester sur debian :

Pour commencer, on va utiliser la version de test proposée dans les dépots Debian. Test? Eh oui, car la puissance de dwm se retrouve lorsque l'on édite le fichier config.h, et que l'on recompile. Mais rassurez-vous, cela tient du jeu d'enfant! Il est même prévu de reconstruire le paquet! Bien, installez donc le paquet dwm (aptitude install dwm), puis choisissez cette session dans gdm/kdm, ou bien ajoutez à votre .xinitrc :exec dwm Comme vous le voyez, la configuration par défaut n'est pas la plus belle. Mais on va y remédier!

Utilisation :

Dwm a été pensé pour être entièrement piloté au clavier si besoin. Voici les raccourcis définis par défaut. On utilisera dans un premier temps la touche "alt" comme touche "Mod1". (voir la partie configuration pour plus d'informations)

  • Mod1-Shift-Return Lance un terminal
  • Mod1-b Affiche/cache la barre
  • Mod1-t Paser en mode "tiling"
  • Mod1-f Passer en mode flottant.
  • Mod1-m Maximise la zone principale
  • Mod1-space Passe du mode courant au mode précédent.
  • Mod1-j Passe le focus à la fenêtre suivante
  • Mod1-k passe le focus à la fenêtre précédente
  • Mod1-h Réduis la taille de la zone principale
  • Mod1-l Augmente la taille de la zone principale
  • Mod1-Return Échange les fenêtres séléctionnées depuis/vers la zone principale
  • Mod1-Shift-c Ferme la fenêtre sélectionnée
  • Mod1-Shift-space Passe la fenêtre sélectionnée entre le mode tiling et flottant
  • Mod1-Tab Sélectionne la vue précédente
  • Mod1-Shift-[1..n] Donne à la fenêtre l'étiquette 1...n
  • Mod1-Shift-0 Colle toutes les étiquettes à la fenêtre, de 1 à 9.
  • Mod1-Control-Shift-[1..n] Ajoute les fenêtres à l'étiquette 1...n
  • Mod1-[1..n] Afficher les fenêtres dont l'étiquette est 1...n
  • Mod1-0 Montre/cache toutes les étiquettes.
  • Mod1-Control-[1..n] Ajoute les étiquettes 1...n à la vue
  • Mod1-Shift-q Quitte dwm


Sur le bureau, on démarre par defaut en mode « divisé » : l'écran est divisé équitablement entre les fenêtres. Voici les modes disponibles par défaut :

  • Le mode « flottant » (Mod+f) : Vous pourrez alors déplacer la fenêtre en maintenant la touche Mod appuyée tout en déplacant la fenêtre à la souris, la redimensionner en maintenant Mod et en faisant clic-droit avec la souris.
  • Le mode « maximum » (Mod+m) : la fenêtre prend tout l'espace disponible, on ne voit pas les autres fenêtres
  • Le mode « divisé » (Mod+t) : Mode écran divisé ou tiling. Une partie maître à gauche, avec une fenêtre plus grande, et une partie à droite avec les fenêtres plus petites.

Obtenir dwm :

Dwm est téléchargeable sur le site officiel (prendre l'archive la plus récente et la décompresser), ou vous pouvez télécharger les sources debian : # apt-get source dwm . Pour les plus aventureux, vous pouver installer la toute dernière mouture de dwm ainsi (paquet mercurial nécéssaire) hg clone http://hg.suckless.org/dwm. Les deux dernières commandes téléchargent les sources dans le répertoire courant. On se déplace dans le répertoire des sources de dwm : cd dwm-numéro_de_version

Installer dwm :

Dans le répertoire contenant les sources, il suffit de taper : make. Dwm est alors compilé, et présent dans le répertoire actuel. Vous pouvez l'installer sur tout le système si vous voulez, en tapant ensuite : make install Les éxécutables seront dans ce cas le répertoire /usr/local/bin par défaut. Pour changer ce répertoire, il faut éditer le fichier config.mk, et changer la ligne : PREFIX = /chemin/du/répertoire/destination vers le chemin de votre choix (votre répertoire utilisateur ou autre). Notez toutefois que pour lancer votre session ensuite, il faudra préciser le bon chemin.

 
  1. Fichier ~/.xinitrc
  2. commande pour lancer dwm en tapant startx
  3. Lorsque dwm est dans /usr/bin ou /usr/local/bin :

exec dwm

  1. lorsque dwm est dans un répertoire quelconque, par exemple dans /home/user/
  2. exec /home/user/dwm

Les dépendances nécéssaires sont libX11-dev et éventuellement libxinerama-dev. Intéressons nous comment recréer un paquet debian à partir des sources debian : On récupère les sources, qui seront décompressées dans le répertoire courant : apt-get source dwm On se déplace dans le répertoire des sources. J'utilise le caractère "*" pour ne pas avoir à préciser la version de dwm : cd dwm* Maintenant, on retrouve les fichiers sources de dwm, les mêmes que dans l'archive officielle plus quelques autres relatifs à debian. On configure dwm de la même façon que pour les autres méthode, en éditant le config.def.h. Attention, ici c'est le fichier config.def.h qui sera pris en compte, et qu'il faut donc modifier. Une fois que vous êtes satisfaits, vous pouvez refabriquer le paquet avec cette commande (toujours dans le répertoire des sources) : dpkg-buildpackage -rfakeroot -uc -b Ce qui va créer un fichier dwm-version.deb dans le répertoire supérieur. Pour vous assurez d'avoir les dépendances nécéssaires, tapez ceci (Merci Knucky) : apt-get build-dep dwm Allons donc chercher le paquet récemment créé : cd .. Et installons ce paquet (il faut avoir les droits super-utilisateur) : dpkg -i dwm_*.deb Le paquet est maintenant installé!

Il se peut fichier dwm-5.7.2/debian/desktop/dwm soit mal fait. En effet pour être pris en compte par gdm il faut le renommer avec l'extension ".desktop".

4. Configurer dwm :

Documentation du site officiel à ce sujet On va maintenant se pencher sur les configurations possibles.

Le fichier config.h :

Depuis le temps que je vous parle de ce fichier! Il se trouve dans le répertoire des sources de dwm. Allons le chercher : cd dwm-numero_de_version Mais, que dis-tu, il n'y a pas de fichier config.h! bouh! Ahem... En effet, dis comme ça... Non, je ne me moque pas de vous. En fait, par défaut, le fichier s'appelle config.def.h. C'est en fait un config.h qui sert de modèle. Cependant, si un fichier config.h est présent, ce sera lui qui sera utilisé pour la configuration, sinon ce sera le config.def.h. Je vous invite à copier le fichier config.def.h en config.h, toujours dans le répertoire des sources : cp config.def.h config.h Ainsi, vous gardez un modèle d'origine en cas de besoin. Voici à quoi ressemble le fichier par défaut, j'y rajoute ici des commentaires pour l'expliquer en français. http://www.isalo.org/pnopaste/?14

Donner des règles pour les fenêtres

Voir aussi : http://dwm.suckless.org/customisation/tagmask Il est possible de définir des règles spécifique à certaines fenêtres. Par exemple, si je veux que transmission n'apparaisse que su le tag 9, il faudra mettre ceci : static const Rule rules[] = { /* class instance title tags mask isfloating monitor */ { "Transmission", NULL, NULL, 1 << 8, False, -1 }, }; Pour récupérer les informations sur une fenêtre, tapez xprop dans une console. Votre curseur va changer de forme. Cliquez alors sur la fenêtre voulue. Vous verrez apparaître dans la console les informations sur la classe, le titre de la fenêtre... Vous l'aurez compris, si vous voulez que la fenêtre flotte, il faudra mettre "True" dans la colonne "isfloating" Pour désigner le tag où l'on veut que la fenêtre apparaisse, c'est un peu plus complexe. Ainsi 1 << 8 définit le tag 9, 1 << 7 représente le tag 8, ~0 représente tous les tags, (1 << 8 ) – 1 définit tous les tags sauf le 9eme.

Définir vos raccourcis:

Bien sûr, on peut éxécuter la commande de notre choix via un raccourci clavier, ou même un raccourci souris si on le souhaite. La première étape sera de définir ce raccourci. Il s'agit en fait de faire nos propres fonctions. Repérer ces lignes dans le config.h : /* commands */ static const char *dmenucmd[] = { "dmenu_run", "-fn", font, "-nb", normbgcolor, "-nf", normfgcolor, "-sb", selbgcolor, "-sf", selfgcolor, NULL }; static const char *termcmd[] = { "uxterm", NULL }; La première ligne sert à lancer dmenu avec les couleurs de dwm. C'est en fait ce qui se passe lorsque vous tapez le raccourci Mod+P . dmenu est inclus dans le paquet dwm-tools ou suckless-tools, outéléchargeable sur le site officiel. La deuxième ligne lance un terminal, c'est ce qui se passe lorsque vous faîtes Mod+Shift+Entrée. Vous pouvez modifier la commande uxterm, par votre terminal favori (xterm, urxvt, xfce4-terminal, lxterminal...). Si vous n'êtes pas sûr, suivez le conseile de MisterFreez, indiquez "x-terminal-emulator" On va ajouter en dessous ces lignes nos propres fonctions! Par exemple, je voudrais ajouter deux raccourcis : l'un pour lancer gajim, l'autre pour couper/activer le son. Il faudra définir deux fonctions sur le même modèle que les précédentes. Donnez leur le nom que vous voulez, du moment que vous vous y retrouvez. Exemple : static const char *gajim[] = { "gajim", NULL }; static const char *muteson[] = { "amixer", "-q", "set", "Master", "toggle", NULL }; Note : Remarquez que lorsque une commande contient des espaces, chaque argument doit être entre guillemets suivi d'une virgule. Les commandes finissent toujours par NULL. Bien, maintenant que nos fonctions sont définies, on va les appeler. J'ai envie de lancer gajim lorsque j'appuie sur Mod4+Mod1+i, et couper le son lorsque j'appuie sur la touche multimédia de mon ordinateur associée. Voici ce que ça donnera, dans la section des raccourcis claviers : static Key keys[] = { /*il y a d'autres choses avant....*/ { MODKEY|Mod1, XK_i, spawn, {.v = gajim } }, { 0, 0x1008ff12, spawn, {.v = muteson } }, Ouhla, ça mérite des explications : - Pour définir plusieurs modifieurs, on les sépare par un "|". - XK_i correspond à la touche "i" - spawn est une fonction dans dwm, qui dit d'éxécuter la fonction désignée - On donne la fonction à éxécuter entre {.v = nom_de_fonction }. Le nom de la fonction est celui définit précédemment. - S'il n'y a pas de modificateur, on met un 0. - 0x1008ff12, c'est le code de ma touche multimédia, que j'ai récupéré en tapant xev en console, puis en faisant fn+"touche bleue" qui coupe le son" Notez qu'il est possible de le faire aussi pour la souris. Par exemple, je veux que lorsque je fais un clique droit sur le texte dans la barre de tâches, ça lance un script que j'ai fait maison. On procédera comme suit :

  • 1/On définit la commande du script. Je lui donne le petit nom "deloggue", car ça me sert à mettre fin à une session

static const char *deloggue[] = { "/home/xavier/Documents/Scripts/exit.sh", NULL };

  • 2/ J'appelle cette fonction ensuite avec le clic droit sur le texte.

Dans la partie "souris", on aura donc : static Button buttons[] = { /* click event mask button function argument */ { ClkStatusText, 0, Button3, spawn, {.v = deloggue } }, }; On peut aussi modifier les raccourcis déja existants. Je souhaitais que lorsque je fait un clic-milieu sur le titre d'une fenêtre, ça la ferme : static Button buttons[] = { /* click event mask button function argument */ { ClkWinTitle, 0, Button2, killclient, {0} }, }; Voila, rien de bien compliqué en définitive. On définit d'abord la commande à éxécuter, en lui donnant un nom de fonction au choix. Ensuite, on peut lancer cette commande avec spawn, suivi du nom de la fonction.

Modifier la configuration pour les claviers français :

Le problème des touches "chiffre":

Malheureusement, dwm est configuré par défaut pour les claviers anglais. Les chiffres au dessus des lettres de votre clavier ne seront pas lus comme tels, mais comme étant un "&" pour le "1", un "é" pour le 2, un " pour le "3"... On va donc remédier à tout ça. Le code de nos touches se récupère très facilement avec xev. Il faut lancer xev en console, taper sur une touche, et lire ce qui est retourné. On va donc remplacer cette portion : TAGKEYS( XK_1, 0) TAGKEYS( XK_2, 1) TAGKEYS( XK_3, 2) TAGKEYS( XK_4, 3) TAGKEYS( XK_5, 4) TAGKEYS( XK_6, 5) TAGKEYS( XK_7, 6) TAGKEYS( XK_8, 7) TAGKEYS( XK_9, 8) Par ceci : TAGKEYS( 0x26, 0) TAGKEYS( 0xe9, 1) TAGKEYS( 0x22, 2) TAGKEYS( 0x27, 3) TAGKEYS( 0x28, 4) TAGKEYS( 0x2d, 5) TAGKEYS( 0xe8, 6) TAGKEYS( 0x5f, 7) TAGKEYS( 0xe7, 8) Ainsi que ceci : { MODKEY, XK_0, view, {.ui = ~0 } }, { MODKEY|ShiftMask, XK_0, tag, {.ui = ~0 } }, par : { MODKEY, 0xe0, view, {.ui = ~0 } }, { MODKEY|ShiftMask, 0xe0, tag, {.ui = ~0 } },

Un patch automatisant le tout est disponible ici : azertykey

Pour changer d'écran:

Il faut françiser la touche "." pour nos claviers. Donc, remplacer dans le config.h "period" par "semicolon", car pour nous, c'est le point-virgule : { MODKEY, XK_comma, focusmon, {.i = -1 } }, { MODKEY, XK_semicolon, focusmon, {.i = +1 } }, { MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } }, { MODKEY|ShiftMask, XK_semicolon, tagmon, {.i = +1 } }, Un config.h françisé est maintenant disponible ici : http://thuban.toile-libre.org/index.php/dwm-en-francais/

Ajouter un patch:

Vous pouvez ajouter toutes sortes de fonctionnalités à dwm, en ajoutant des patches. Le site officiel regorge d'informations à ce sujet, et la configuration de chaque patch est expliqué. De façon générale, pour appliquer un patch, il faudra faire ceci dans le répertoire de dwm : patch -p1 < chemin/vers/le/patch.diff Pour la version tarball (paquet debian inclus) hg patch chemin/vers/le/patch.diff Pour la version mercurial (hg). Personnellement, j'affectionne le patch bottom stack afin d'avoir un agencement des fenetres vertical, et le patch nametag pour renommer les tags. Mais je pourrais en mettre plus c'est vrai.

Avoir un menu pour la souris:

Il est bien entendu possible d'avoir un menu utilisable à la souris. Je vous invite à lire cette page, indiquant plusieurs façons possibles d'obtenir un menu.

Personnaliser la barre d'état:

Il est possible d'afficher ce que l'on veut dans la barre d'état. Cela se définit juste avant le lancement de dwm, donc selon les cas dans votre ~/.xinitrc ou autre. Dwm lira ce qui est passé en argument à xsetroot. Cela donnera quelque chose comme ça : while true; do xsetroot -name "$( date +"%F %R" )" sleep 1m # Update time every minute done & exec dwm Qui affichera la date. Voici mon .xinitrc : /home/xavier/Documents/Scripts/dmenu/dstatus.sh & exec /usr/local/bin/dwm Vous remarquerez que le lance un script dstatus.sh à part, pour plus de commodité. Ce script récupère plusieurs informations, et les renvoient dans le xsetroot. Ainsi, il y a l'heure, le débit internet, la chaque processeur, le volume sonore, des infos sur la batterie, ce que mpd joue...n peut notamment avoir une barre de progression pour mpd/mplayer/wget... Je met le script à disposition ici, n'hésitez pas à vous en inspirer!

Conclusion:

Il y a un programme essentiel à utiliser dans dwm : j'ai nommé dmenu. Vous pourrez au fur et à mesure lire des exemples d'utilisation que je posterai ici. Cette page est à améliorer et il y a beaucoup de choses à préciser. Je vous invite donc à me faire part de vos remarques afin de l'améliorer. Je poste ici mon config.h si vous voulez voir ma configuration.

Liens externes