LinuxPedia

Wiki libre et indépendant dédié à GNU-Linux et BSD.

Outils pour utilisateurs

Outils du site


dwm
no way to compare when less than two revisions

Différences

Ci-dessous, les différences entre deux révisions de la page.


dwm [2018/11/17 12:53] (Version actuelle) – créée - modification externe 127.0.0.1
Ligne 1: Ligne 1:
 +====== DWM : the Dynamic Window Manager ======
 +**dwm** est écrit en **C**... pas de rafraichissement automatique .. tu veux configurer ? alors tu dois compiler :)\\
 +**dwm** a su rester simple .. vierge je dirais: vierge de tout gadget et autre options qui alourdissent l'environnement et finissent par nuire aux performances de l'ordinateur et de l'utilisateur, alors que ce n'était pas l'idée de départ.
 +**dwm** est distribué par [[http://suckless.org/|suckless.org]] //Dedicated to software that sucks less//… et adopte la philosopie KISS .\\
 +**dwm** est entièrement pilotable depuis le clavier mais sait aussi faire bon usage de votre souris (déplacement des clients, redimensionnement à la volée..).\\
 +si vous désirez tester dwm en live, allez faire un tour du côté du [[http://arpinux.org/livarp|livarp]] avec une session dwm pré-configurée et documentée...
  
 +===== présentation =====
 +**DWM** est un tiling window manager, c'est à dire qu'il affiche vos fenêtres (clients) afin qu'elles occupent la totalité de la surface du bureau (tags). les tags occupés sont indiqués par un petit carré dans la barre de tags. les clients sont séparés en deux zones: le **Master**(client principal) et le **Stack**(clients empilés), organisés de différentes façons (layouts) pour optimiser la visibilité de vos applications ouvertes. la version de base dispose de trois layouts: Tile (Master à gauche et Stack à droite), Monocle (clients maximisés) ou NULL (no layout = clients libres), mais de nombreux patchs existent pour ajouter des layouts.
 +
 +===== obtenir dwm =====
 +**Note:** //si vous désirez utiliser directement dwm sans changements de configuration, vous pouvez installer la version proposée par Debian: passer à la [[:dwm#installation|section installation]]//.\\
 +\\
 +pour récupérer dwm, plusieurs options s'offrent à vous.
 +  * depuis le **site officiel** : [[http://dwm.suckless.org]]
 +  * depuis les **sources Debian** : <code>$ apt-get source dwm</code>
 +  * depuis le **dépot git** : <code>$ git clone http://git.suckless.org/dwm</code>
 +
 +===== configuration =====
 +la configuration avant l'installation ? et oui!\\
 +comme dwm s'installe sans fichier de configuration, tous les changements doivent s'effectuer avant la compilation. ces modifications peuvent intervenir de deux façons:
 +  * l'édition du fichier de configuration principal config.def.h et/ou
 +  * l'application de patches sur dwm.c et config.h.
 +\\
 +**Note:** //si vous désirez utiliser directement dwm sans changements de configuration, vous pouvez installer la version proposée par votre distribution. passer à la [[:dwm#installation|section installation]].//
 +
 +==== config.h ====
 +les modifications de base s'effectuent en copiant le fichier ./config.def.h en ./config.h et en l'éditant. je vous présente ici l'intégralité de ce fichier config.def.h commenté (notez que les raccourcis par défaut sont pour un clavier qwerty):
 +<code c>
 +/* See LICENSE file for copyright and license details. */
 +
 +/* appearance */
 +static const char font[]            = "-*-terminus-medium-r-*-*-16-*-*-*-*-*-*-*"; /* sélectionner votre police avec xfontsel*/
 +static const char normbordercolor[] = "#444444"; /* couleur du contour des clients */
 +static const char normbgcolor[]     = "#222222"; /* couleur de fond clients-statusbar */
 +static const char normfgcolor[]     = "#bbbbbb"; /* couleur du texte clients-statusbar */
 +static const char selbordercolor[]  = "#005577"; /* couleur de la bordure du client au premier plan */
 +static const char selbgcolor[]      = "#005577"; /* couleur du fond sélectionné clients-statusbar */
 +static const char selfgcolor[]      = "#eeeeee"; /* couleur du texte clients-statusbar au premier plan */
 +static const unsigned int borderpx  = 1;         /* taille de la bordure des clients en pixel(s) */
 +static const unsigned int snap      = 32;        /* distance d'adhérence en pixel(s) pour les clients libres */
 +static const Bool showbar           = True;      /* afficher la statusbar */
 +static const Bool topbar            = True;      /* statusbar en haut de l'écran */
 +
 +/* tagging - nom et nombre de tags */
 +static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" };
 +
 +/* Les règles (rules) spécifiques. utiliser xprop pour obtenir les infos. */
 +/* isfloating: True : client flottant, False : client en tiling */
 +/* tags mask: tag le client: 1 << 8 définit le tag 9, 1 << 7 définit le tag 8, ~0 définit tous les tags. */
 +/* sources: http://dwm.suckless.org/customisation/tagmask */
 +static const Rule rules[] = {
 + /* xprop(1):
 + * WM_CLASS(STRING) = instance, class
 + * WM_NAME(STRING) = title
 + */
 + /* class      instance    title       tags mask     isfloating   monitor */
 + { "Gimp",     NULL,       NULL,       0,            True,        -1 }, /* gimp s'ouvrira libre */
 + { "Firefox",  NULL,       NULL,       1 << 8,       False,       -1 }, /* firefox s'ouvrira 'tilé' sur le tag 9 */
 +};
 +
 +/* layout(s) */
 +static const float mfact      = 0.55; /* facteur de l'aire master [0.05..0.95] */
 +static const int nmaster      = 1;    /* nombre de clients dans le master */
 +static const Bool resizehints = True; /* respecte le redimensionnement automatique des applications */
 +
 +static const Layout layouts[] = {
 + /* symbol     arrange function */
 + { "[]=",      tile },    /* le première entrée sera le layout par défaut de dwm: ici, tiling */
 + { "><>",      NULL },    /* pas de layout = free layout */
 + { "[M]",      monocle }, /* monocle = clients maximisés */
 +};
 +
 +/* key definitions */
 +/* vous pouvez déféinir ici votre ou vos touches de modification. par défaut défini à Mod1Mask (Alt) */
 +/* mais peut aussi être Mod4Mask (Super). vous pouvez également définir 2 modkey */
 +/* ex: #define MODKEY2 Mod4Mask définit la touche super comme seconde touche de modification */
 +#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 */
 +#define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } }
 +
 +/* commandes - raccourcis clavier */
 +static const char *dmenucmd[] = { "dmenu_run", "-fn", font, "-nb", normbgcolor, "-nf", normfgcolor, "-sb", selbgcolor, "-sf", selfgcolor, NULL };
 +static const char *termcmd[]  = { "uxterm", 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_0,      view,           {.ui = ~0 } },
 + { MODKEY|ShiftMask,             XK_0,      tag,            {.ui = ~0 } },
 + { MODKEY,                       XK_comma,  focusmon,       {.i = -1 } },
 + { MODKEY,                       XK_period, focusmon,       {.i = +1 } },
 + { MODKEY|ShiftMask,             XK_comma,  tagmon,         {.i = -1 } },
 + { MODKEY|ShiftMask,             XK_period, tagmon,         {.i = +1 } },
 + 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)
 + { MODKEY|ShiftMask,             XK_q,      quit,           {0} },
 +};
 +
 +/* réactions à la souris */
 +/* 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} },
 +};
 +</code>
 +
 +==== francisation ====
 +les raccourcis clavier par défaut sont adaptés au clavier qwerty. pour adapter les raccourcis au clavier azerty, on modifie le fichier config.h:\\
 +remplacer:
 +<code c>
 +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)
 +</code>
 +par
 +<code c>
 +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)
 +</code>
 +et remplacer
 +<code c>
 +{ MODKEY,                       XK_0,      view,           {.ui = ~0 } },
 +{ MODKEY|ShiftMask,             XK_0,      tag,            {.ui = ~0 } },
 +</code>
 +par
 +<code c>
 +{ MODKEY,                       XK_agrave,      view,           {.ui = ~0 } },
 +{ MODKEY|ShiftMask,             XK_agrave,      tag,            {.ui = ~0 } },
 +</code>
 +
 +==== patches ====
 +les patches sont des modifications qui permettent d'ajouter des fonctionnalités à dwm. sur suckless.org, les patches sont réunis sur [[http://dwm.suckless.org/patches/|cette page]]. libre à vous de les adapter à vos besoins.\\
 +pour appliquer un patch:
 +  * utilisateur de git:<code>cd dwm-directory
 +git diff > dwm-X.Y-yourpatchname.diff</code>
 +  * utilisateur de l'archive:<code>cd dwm-directory
 +patch -p1 < path/to/patch.diff</code>
 +
 +===== installation =====
 +==== paquet officiel ====
 +pour les utilisateurs Debian et dérivées, si vous souhaitez utiliser la version de base de DWM sans configuration particulière, vous pouvez simplement utiliser la commande suivante qui installera dwm et quelques outils de chez suckless.org (dmenu, tabbed..): <code># apt-get install dwm suckless-tools</code>
 +dwm s'installera dans /usr/bin.
 +
 +==== depuis les sources git ====
 +si vous avez téléchargé les sources depuis les dépôts git, vous devez installer les dépendances:
 +<code># apt-get install libx11-dev libxinerama-dev</code>
 +la procédure d'installation est classique: une fois les modifications et les patches appliqués, il vous suffit de vous placer dans le répertoire de dwm puis de lancer:
 +<code>
 +$ make
 +# make install
 +</code>
 +dwm s'installera par défaut dans /usr/local/bin.
 +
 +==== depuis les sources Debian ====
 +**sources**: l'excellent [[http://yeuxdelibad.net/Logiciel-libre/Suckless/dwm/|post de thuban]].\\
 +On récupère les sources ainsi :
 +<code>$ apt-get source dwm</code>
 +On se déplace dans le dossier des sources. Avec le caractère "*", on n'a pas besoin de préciser la version de dwm :
 +<code>cd dwm*</code>
 +__Attention__: Si vous voulez configurer dwm, éditez ici le config.def.h, pas le config.h (c'est la petite exception debian).\\
 +Une fois satisfaits, reconstruisez le paquet :
 +<code># dpkg-buildpackage -rfakeroot -uc -b</code>
 +Un paquet est alors disponible dans le répertoire parent, sour la forme dwm- version.deb. Pour vous assurer d'avoir les dépendances nécéssaires, il suffit de lancer :
 +<code># apt-get build-dep dwm</code>
 +Pour installer le paquet créé :
 +<code># dpkg -i dwm*.deb</code>
 +**Note**: Afin d'éviter toute mise à jour non souhaitée de dwm, écrivez ceci dans le fichier /etc/apt/preferences :
 +<file>
 +Package: dwm
 +Pin: release a=now
 +Pin-Priority: 1001
 +</file>
 +Ou alors lancer :
 +<code># aptitude hold dwm</code>
 +
 +===== utilisation =====
 +==== lancement ====
 +dwm se lance comme une session classique: soit par gdm ou tout autre gestionnaire de session graphique, soit par startx. voici mon ~/.xinitrc pour l'exemple d'un lancement en startx:
 +<code bash xinitrc>
 +#!/bin/bash
 +##############################
 +# ~/.xinitrc by arpinux 2011 #
 +##############################
 +## D-Bus ##
 +if which dbus-launch >/dev/null && test -z "$DBUS_SESSION_BUS_ADDRESS"; then
 +        eval "$(dbus-launch --sh-syntax --exit-with-session)"
 +fi
 +## trackpad ## tapbutton off by default ##
 +synclient VertTwoFingerScroll=1
 +synclient HorizTwoFingerScroll=1
 +synclient TapButton1=0
 +## dualscreen ## edit if needed ##
 +xrandr --output LVDS --mode 1024x768 --pos 0x0 --rotate normal --output VGA-0 --mode 1024x768 --pos 1024x0 --rotate normal
 +## read ~.Xresources file
 +xrdb -merge ~/.Xresources
 +## set wallpaper / color the screen ##
 +#xsetroot -solid grey20 &
 +feh --no-xinerama --bg-scale ~/.arp_setups/bg.png ## uncomment to display default wallpaper ##
 +#nitrogen --restore & ## uncomment to run your personnal wallpaper ##
 +## launch terminal deamon ##
 +urxvtd -q- -f -o
 +## set session-killer
 +setxkbmap -option terminate:ctrl_alt_bksp
 +## launch session
 +exec ck-launch-session /usr/local/bin/dwm
 +</code>
 +
 +==== raccourcis clavier ====
 +souvenez-vous que **dwm s'organise autour de tags**, l'equivalent des //bureaux virtuels//, mais avec plus de possibilités:\\
 +on peut rendre un client visible sur tous les tags avec [Alt]+[Shift]+[0] (l'equivalent du "sticky" pour les bureaux virtuels), mais on peut aussi assigner 2 tags à un client, ce qui reviendrait à afficher une fenêtre sur 2 bureaux virtuels seulement.\\
 +la fonction "exposé" est présente dans dwm ... oO en effet, le raccourcis [Alt]+[0] affiche tous les clients sur le tag courant, il suffit d'afficher un autre tag pour rétablir l'afichage normal.\\
 +voici quelques commandes de bases pour commencer à utiliser dwm. :!: si vous avez modifié les raccourcis clavier dans config.h, il faudra adapter. la touche de modification //Mod1// par défaut est [Alt].\\
 +\\
 +**les raccourcis clavier**
 +^modifier    ^touche  ^description  ^
 +|Mod1+Shift  |return  |ouvre le terminal par défaut  |
 +|Mod1        |,       |va à l'écran précédent  |
 +|:::         |.       |va à l'écran suivant  |
 +|Mod1+Shift  |,       |deplace le client vres l'écran précédent  |
 +|:::         |.       |deplace le client vres l'écran suivant  |
 +|Mod1        |b       |affiche/masque la barre d'info  |
 +|:::         |t       |definir le layout en "tile" (mosaïque)  |
 +|:::         |f       |definir le layout en "floating" (libre)  |
 +|:::         |m       |definir le layout en "monocle" (maximisé)  |
 +|:::         |space   |échanger entre le layout actuel et le précédent  |
 +|:::         |j       |donne le focus au client suivant  |
 +|:::         |k       |donne le focus au client précédent  |
 +|:::         |h       |agrandi la taille du master  |
 +|:::         |l       |diminue la taille du master  |
 +|:::         |return  |échange le client ayant le focus avec celui dans le master  |
 +|Mod1+Shift  |c       |fermer le client ayant le focus  |
 +|:::         |space   |libérer/"tiler" le client ayant le focus  |
 +|:::         |0       |mettre le client qui a le focus sur tous les tags  |
 +|Mod1        |1,2..n  |afficher les clients du tag n  |
 +|:::         |0       |afficher les clients de tous les tags (fonction "exposé" |
 +|Mod1+Shift  |q       |quitter dwm  |
 +
 +**le comportement de la souris sur les clients**\\
 +//rappel: b1=clic gauche, b2=clic central, b3=clic droit//
 +^modifier  ^bouton  ^description  ^
 +|Mod1  |bouton1  |déplacer la fenêtre au glissé, fait passer la fenêtre en mode "libre"  |
 +|:::   |bouton2  |libérer/"tiler" le client  |
 +|:::   |bouton3  |redimensionne le client depuis le coin inférieur droit, fait passer la fenêtre en mode "libre"  |
 +
 +**le comportement de la souris sur les tags**
 +^modifier  ^bouton  ^description  ^
 +|      |bouton1  |affiche les clients du tag sélectionné (va au tag sélectionné)  |
 +|:::   |bouton3  |affiche/masque les clients du tag sélectionné sur le tag courant  |
 +|Mod1  |bouton1  |applique le tag sélectionné au client qui a le focus (deplace le client vers le tag sélectionné)  |
 +|:::   |bouton3  |ajoute/enlève le tag sélectionné au client qui a le focus  |
 +
 +**le comportement sur le bouton de layout**
 +^bouton  ^description  ^
 +|bouton1  |permute les layouts entre "tile"(mosaïque) et "floating"(libre)  |
 +|bouton3  |sélectionner le tag "floating" (libre)  |
 +
 +===== personnalisation =====
 +==== conky dans la statusbar ====
 +la statusbar de dwm indique les tags, le layout et la version de dwm utilisée. mais on peut lui faire afficher beaucoup plus. pour cela, plusieurs possibilités: conky, dzen2, un script bash, un executable en C...\\
 +pour tester, lancer dans une console: <code>xsetroot -name "`date`"</code>
 +Dans le cas de conky, il ne s'affiche pas réellement: il s'éxécute et est “lu” par la statusbar. Pour cela , vous aurez besoin d'un conkyrc particulier car il indiquera à conky de ne rien afficher !! ... En fait, les informations seront envoyé vers STDOUT et récupérés par dwm. Voici comment procéder:
 +<code>
 + ##############################################
 +#  Settings
 +##############################################
 +background no
 +out_to_console yes
 +out_to_x no
 +update_interval 1.0
 +total_run_times 0
 +uppercase no
 +short_units yes
 +use_spacer none
 +if_up_strictness address
 +##############################################
 +#  Output
 +##############################################
 +TEXT
 +¦${cpu}%-${acpitemp}°\
 +¦${memperc}%-$mem\
 +¦${fs_used_perc /}%-${diskio}/s-${ibm_temps 2}°\
 +¦${if_match "$ibm_volume" == "mute" }M${else}${ibm_volume}/14${endif}\
 +¦${time %d/%m %I:%M}¦
 +</code>
 +Vous constatez que les fonctions sont réduites lorsque conky ne s'affiche pas dans X. De plus, les informatons étant supposées s'afficher dans une barre de statut, conky doit tenir sur une ligne.
 +Il se lance depuis le ~/.xinitrc, juste avant le lancement de la session dwm:
 +<code bash>
 +## set statusbar ##
 +conky | while true; read line; do xsetroot -name "$line"; done &
 +</code>
 +
 +différents patches permettent de colorer la statusbar, de la rendre cliquable etc...
 +===== dwm_reloaded =====
 +j'utilise dwm au quotidien et dans [[http://arpinux.org/livarp|livarp]]. la version est patchée et propose toute une série de modifications et raccourcis clavier.\\
 +pour obtenir **dwm_reloaded**, utiliser les dépôts [[http://gitorious.org/livarp|gitorious]]:
 +<code>$ git clone git://gitorious.org/livarp/dwm_reloaded.git</code>
 +ce dépôt propose deux versions fr/gb et s'installe de [[:dwm#depuis_les_sources_git|façon classique]].\\
 +pour une présentation/documentation complète sur dwm_reloaded, visiter la page [[http://arpinux.org/livarp/help_center/fr/sessions/dwm.html|d'aide du livarp dédiée]].
 +===== conclusion =====
 +DWM est mon gestionnaire de fenêtres préféré! c'est aussi le gestionnaire de fenêtres par défaut du livarp.
 +depuis que j'ai commencé à l'utiliser/le modifier, il n'a planté qu'une fois. dwm est léger, efficace, gère les écrans multiples, est simple à configurer.
 +dwm conviendra parfaitement aux pro soucieux d'optimiser leur espace de travail comme aux g33ks voulant mettre les doigts dans la console ;) .
dwm.txt · Dernière modification : 2018/11/17 12:53 de 127.0.0.1