logo Debian Debian Debian-France Debian-Facile Debian-fr.org Forum-Debian.fr Debian ? Communautés logo inclusivité

Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

Vous n'êtes pas identifié(e).


L'icône rouge permet de télécharger chaque page du wiki visitée au format PDF et la grise au format ODT → ODT PDF Export

Ceci est une ancienne révision du document !


dwm, un gestionnaire de fenêtres dynamique

Introduction

Voici la très bonne et très officielle présentation de dwm, disponible sur son site: http://dwm.suckless.org dwm est un gestionnaire de fenêtres dynamique pour X. Il gère les fenêtres selon 3 agencements différents:

  • tuilage : les fenêtres sont réparties entre une zone principale et une zone d'empilement. La zone principale contient la fenêtre dans laquelle vous travaillez, la zone d'empilement contenant les autres;
  • monocle : les fenêtres sont toutes maximisées à la taille de l'écran (et se masquent donc l'une l'autre);
  • flottant : dans cet agencement les fenêtres peuvent être redimensionnées et déplacées librement, c'est le comportement que l'on retrouve dans la plupart des autres gestionnaires et environnements de bureaux (XFCE, LXDE, etc…).

Notes : les fenêtres de dialogues sont toujours en mode flottant. De plus, dwm est bien un gestionnaire de fenêtres, il ne leur apporte aucune décoration, ni bordure avec titres et boutons “Fermer”, “Maximiser” ou “Réduire”.

dwm (et l'ensemble des outils du projet suckless.org) adhère à une philosophie minimaliste (voir http://suckless.org/philosophy). Il est écrit en C et sa configuration se fait dans un fichier écrit en C avant compilation. Cela peut paraître contraignant mais apporte une grande stabilité et la garantie que des options incompatibles ou erronées n'ont pas été indiquées (sans quoi une erreur empêcherait la compilation).

Installation

Prérequis

L'idée de compiler soi-même un logiciel aussi important que son gestionnaire de fenêtre peut en effrayer certains mais nous verrons pas-à-pas comment procéder et il n'y a pas réellement de difficulté technique majeure.
Il suffit de savoir utiliser un terminal et de saisir les lignes de commandes indiquées ci-après. En effet, toute la configuration et l'installation seront faites via le terminal.

En revanche, vous aurez besoin d'un certain nombre d'outils pour compiler et des bibliothèques de développement X11.
Voici comment les installer:

apt-get install make gcc libx11-dev libxinerama-dev

Si vous souhaitez, au moment de l'installer, avoir la possibilité de créer un paquet .deb de votre configuration et vous assurer que votre installation sera prise en compte par le système de gestion des paquets de Debian, il peut être utile d'installer le paquet suivant:

apt-get install checkinstall

Récupération du code source

Bien que vous puissiez récupérer les sources sur le dépôt git du projet:

git clone git://git.suckless.org/dwm

dans ce tuto, nous allons préférer prendre les sources dans les dépôts Debian de manière à avoir les fichiers de contrôle et autre qui vont bien:

apt-get source dwm

Vous allez obtenir un dossier dwm-6.0 contenant les sources, nous allons y entrer:

cd dwm-6.0
ls
config.def.h  config.mk  debian  dwm.1  dwm.c  LICENSE  Makefile  README

Parmi ces fichiers, 2 seulement nous seront utiles, le config.mk et le config.def.h.

Fichier config.mk

C'est dans ce fichier que nous pouvons modifier les options de compilation. Celle qui va nous intéresser principalement concerne le répertoire dans lequel nous allons installer dwm:

# Customize below to fit your system
# paths
PREFIX = /usr/local
MANPREFIX = ${PREFIX}/share/man
## La variable PREFIX par défaut va installer le binaire dwm dans /usr/local/bin. Bien que je ne le recommande pas, si vous souhaitez l'installer dans /usr/bin, il faut la modifier comme suit:
##PREFIX = /usr

Fichier config.def.h

Voici donc notre fichier de configuration, dans lequel nous allons modifier ou ajouter les options pour personnaliser notre dwm bien à nous.
Mais avant cela, il est nécessaire d'appliquer un patch modifiant les séquences de touches et les adaptant au clavier azerty. Le patch est récupérable à l'adresse suivante : http://dwm.suckless.org/patches/azertykey . Il s'applique comme suit (pour rappel, notre répertoire est toujours dwm-6.0) :

patch -p1 < ../dwm-azertykey.diff

Ce qui devrait vous renvoyer une confirmation de succès:

patching file config.def.h
Hunk #1 succeeded at 68 (offset 3 lines).
Hunk #2 succeeded at 102 (offset 3 lines).

Nous allons pouvoir passer à la configuration, voici une version commentée en français du config.def.h :

/* See LICENSE file for copyright and license details. */
 
/* appearance */
/* police de caractères à utiliser */
static const char font[]            = "-*-terminus-medium-r-*-*-16-*-*-*-*-*-*-*";
/* couleur des bordures de fenêtres inactives : */
static const char normbordercolor[] = "#515151";
/* couleur d'arrière plan barre / tags inactifs / dwmstatus: */
static const char normbgcolor[]     = "#191919";
/* couleur de police des tags inactifs et de police de dwmstatus: */
static const char normfgcolor[]     = "#FFE400";
/* couleur des fenêtres actives: */
static const char selbordercolor[]  = "#D70751";
/* couleur d'arrière plan des tags actifs: */
static const char selbgcolor[]      = "#515151";
/* couleur de police des tags actifs: */
static const char selfgcolor[]      = "#33FF00";
 
static const unsigned int borderpx  = 1;        /* épaisseur en pixel des bordures de fenêtres */
static const unsigned int snap      = 32;       /* snap pixel */
static const Bool showbar           = True;     /* afficher (True) ou pas (False) la barre des tags */
static const Bool topbar            = True;     /* la barre des tags doit être en haut (True) ou en bas (False) */
 
/* tagging */
/* édition des tags, vous mettez ce que vous voulez, chiffres, symbole ou nom (très court de préférence) du tag */
static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" };
 
/* définition des régles: vous pouvez ici appliquer un agencement par défaut à un logiciel particulier */
static const Rule rules[] = {
	/* class      instance    title       tags mask     isfloating   monitor */
	{ "Gimp",     NULL,       NULL,       0,            True,        -1 },
	{ "Firefox",  NULL,       NULL,       1 << 8,       False,       -1 },
};
 
/* layout(s) */
static const float mfact      = 0.55; /* facteur de taille de la zone principale [0.05..0.95] */
static const int nmaster      = 1;    /* nombre de fenêtres dans la zone principale */
static const Bool resizehints = True; /* True = respecter les indications de taille lors du redimmensionnement */
 
static const Layout layouts[] = {
	/* symbol     arrange function */
	{ "[]=",      tile },    /* la première entrée sera celle par défaut */
	{ "><>",      NULL },    /* NULL = aucune fonction d'agencement = mode flottant */
	{ "[M]",      monocle },
};
 
/* key definitions */
/* définition du modificateur: Mod1Mask = touche Alt ; Mod4Mask = touche Super (ou windows) */
#define MODKEY Mod1Mask
#define TAGKEYS(KEY,TAG) \
	{ MODKEY,                       KEY,      view,           {.ui = 1 << TAG} }, \
	{ MODKEY|ControlMask,           KEY,      toggleview,     {.ui = 1 << TAG} }, \
	{ MODKEY|ShiftMask,             KEY,      tag,            {.ui = 1 << TAG} }, \
	{ MODKEY|ControlMask|ShiftMask, KEY,      toggletag,      {.ui = 1 << TAG} },
 
/* helper for spawning shell commands in the pre dwm-5.0 fashion */
/* cette fonction permet le lancement de commande shell pour démarrer un programme */
/* comme vous le feriez dans un terminal */
#define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } }
 
/* commands */
/* commande permettant le lancement de dmenu */
static const char *dmenucmd[] = { "dmenu_run", "-fn", font, "-nb", normbgcolor, "-nf", normfgcolor, "-sb", selbgcolor, "-sf", selfgcolor, NULL };
/* commande d'exécution de l'émulateur de terminal par défaut du système */
static const char *termcmd[]  = { "x-terminal-emulator", NULL };
 
static Key keys[] = {
	/* modifier                     key        function        argument */
	{ MODKEY,                       XK_p,      spawn,          {.v = dmenucmd } },
	{ MODKEY|ShiftMask,             XK_Return, spawn,          {.v = termcmd } },
	{ MODKEY,                       XK_b,      togglebar,      {0} },
	{ MODKEY,                       XK_j,      focusstack,     {.i = +1 } },
	{ MODKEY,                       XK_k,      focusstack,     {.i = -1 } },
	{ MODKEY,                       XK_i,      incnmaster,     {.i = +1 } },
	{ MODKEY,                       XK_d,      incnmaster,     {.i = -1 } },
	{ MODKEY,                       XK_h,      setmfact,       {.f = -0.05} },
	{ MODKEY,                       XK_l,      setmfact,       {.f = +0.05} },
	{ MODKEY,                       XK_Return, zoom,           {0} },
	{ MODKEY,                       XK_Tab,    view,           {0} },
	{ MODKEY|ShiftMask,             XK_c,      killclient,     {0} },
	{ MODKEY,                       XK_t,      setlayout,      {.v = &layouts[0]} },
	{ MODKEY,                       XK_f,      setlayout,      {.v = &layouts[1]} },
	{ MODKEY,                       XK_m,      setlayout,      {.v = &layouts[2]} },
	{ MODKEY,                       XK_space,  setlayout,      {0} },
	{ MODKEY|ShiftMask,             XK_space,  togglefloating, {0} },
	{ MODKEY,                       XK_agrave,      view,           {.ui = ~0 } },
	{ MODKEY|ShiftMask,             XK_agrave,      tag,            {.ui = ~0 } },
	{ 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 } },
	TAGKEYS(                        XK_ampersand,                     0)
	TAGKEYS(                        XK_eacute,                        1)
	TAGKEYS(                        XK_quotedbl,                      2)
	TAGKEYS(                        XK_apostrophe,                    3)
	TAGKEYS(                        XK_parenleft,                     4)
	TAGKEYS(                        XK_minus,                         5)
	TAGKEYS(                        XK_egrave,                        6)
	TAGKEYS(                        XK_underscore,                    7)
	TAGKEYS(                        XK_ccedilla,                      8)
	{ MODKEY|ShiftMask,             XK_q,      quit,           {0} },
};
 
/* button definitions */
/* click can be ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, or ClkRootWin */
static Button buttons[] = {
	/* click                event mask      button          function        argument */
	{ ClkLtSymbol,          0,              Button1,        setlayout,      {0} },
	{ ClkLtSymbol,          0,              Button3,        setlayout,      {.v = &layouts[2]} },
	{ ClkWinTitle,          0,              Button2,        zoom,           {0} },
	{ ClkStatusText,        0,              Button2,        spawn,          {.v = termcmd } },
	{ ClkClientWin,         MODKEY,         Button1,        movemouse,      {0} },
	{ ClkClientWin,         MODKEY,         Button2,        togglefloating, {0} },
	{ ClkClientWin,         MODKEY,         Button3,        resizemouse,    {0} },
	{ ClkTagBar,            0,              Button1,        view,           {0} },
	{ ClkTagBar,            0,              Button3,        toggleview,     {0} },
	{ ClkTagBar,            MODKEY,         Button1,        tag,            {0} },
	{ ClkTagBar,            MODKEY,         Button3,        toggletag,      {0} },
};

Une fois notre configuration faite, nous pouvons compiler et installer dwm avec la commande:

make clean install

Toutefois, comme mentionné plus haut,je recommande l'utilisation de checkinstall:

checkinstall -D

Ceci permet une utilisation interactive, vous autorisant notamment à changer le numéro de version pour un code de version personnel et permet de créer un paquet .deb de votre version personnalisé de dwm.

Une fois installé, vous pouvez le tester en sélectionnant la session adéquate dans votre gestionnaire de session (gdm3, kdm, slim…) ou en ajoutant la ligne:

exec /usr/local/bin/dwm

à votre fichier ~/.xinitrc.

Utilisation

- fonctionnement des tags - raccourcis clavier - utilisation souris

Astuces

- attribution d'un tag à un programme - ajout commande shell et de son raccourci clavier - ajout commande static pour st tabbed - modification du volume avec molette souris - présentation dwmstatus

Conclusion

1)
N'hésitez pas à y faire part de vos remarques, succès, améliorations ou échecs !
doc/environnements/x11/dwm.1421598306.txt.gz · Dernière modification: 18/01/2015 17:25 par sogalpunx

Pied de page des forums

Propulsé par FluxBB