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

Vous qui avez déja utilisé openbox, fluxbox ou tout autre gestionnaire de fenêtres, vous aimeriez retrouver un menu accessible via un clic droit ou tout autre raccourci clavier. Nous allons parler ici des différentes possibilités pour dwm.

Méthode facile avec fbpanel

Bon, on ne va pas s’embêter, on va installer ce petit programme : fbpanel. Nous allons toutefois ne garder que ce qui nous intéresse de ce programme.

Pour avoir fbpanel dans le coin supérieur droit de l’écran, qui se cache lorsque la souris ne passe pas dessus, on peut le configurer facilement en lançant: fbpanel --configure.

Maintenant, je ne veux pas des plugins indiquant l’heure, la mémoire… Mais uniquement garder le menu est éventuellement le systray. Il faut simplement éditer le fichier /home/user/.config/fbpanel/default, et enlever tous les plugins que nous ne voulons pas.

Méthode propre avec 9menu

9menu est un paquet que vous pouvez installer aussi. Je le préfère car il s’intègre très bien à dwm, et peut être configuré à souhait. Ci-dessous ce à quoi le résultat peut ressembler :

Voici ce qui va se passer : on va définir dans le config.h de dwm le comportement souhaité, c’est à dire que le menu s’affichera lors d’un clic- droit sur la barre de status ou d’un clic droit sur le fond d’écran. Vous pouvez aussi défnir un raccourci à ce menu. Lorsque ces évènements surviendront, dwm lancera le menu. Je vais vous présenter ici un menu assez élaboré dont voici la structure :

#!/bin/sh
#Requiert 9menu
#Un menu tout simple

#Apparence
NB="#000000"
NF="#848484"
FN="-*-fixed-medium-r-semicondensed-*-13-*-*-*-*-*-iso10646-*"

# Le dossier du menu
DIR=~/.dmenu/dwm_menu/
# Le fichier du menu
FILE=$DIR/menu

9menu -label "dwm_menu" -popup -bg "$NB" -fg "$NF" -font "$FN" -teleport -file $FILE

Ce script lit le fichier menu, placé dans le même dossier que voici :

Fermer    :exit
\*-------------*
Internet   >:9menu -label "internet" -popup -bg "#000000" -fg "#848484"\
           -font "-*-fixed-medium-r-semicondensed-*-13-*-*-*-*-*-iso10646-*" -teleport -file ~/.dmenu/dwm_menu/internet
Creation   >:9menu -label "creation" -popup -bg "#000000" -fg "#848484"\
           -font "-*-fixed-medium-r-semicondensed-*-13-*-*-*-*-*-iso10646-*" -teleport -file ~/.dmenu/dwm_menu/creation
Bureautique >:9menu -label "bureautique" -popup -bg "#000000" -fg "#848484"\
            -font "-*-fixed-medium-r-semicondensed-*-13-*-*-*-*-*-iso10646-*" -teleport -file ~/.dmenu/dwm_menu/bureautique
Multimedia  >:9menu -label "multimedia" -popup -bg "#000000" -fg "#848484"\
            -font "-*-fixed-medium-r-semicondensed-*-13-*-*-*-*-*-iso10646-*" -teleport -file ~/.dmenu/dwm_menu/multimedia
Fichiers    :rox
Musique     :gmpc
Terminal    :x-terminal-emulator
Texte       :gvim
Musique    >:9menu -label "musique" -popup -bg "#000000" -fg "#848484"\
           -font "-*-fixed-medium-r-semicondensed-*-13-*-*-*-*-*-iso10646-*" -teleport -file ~/.dmenu/Scripts/dwm_menu/musique
\*-------------*
Redemarrer  :sudo /sbin/shutdown -r now
Eteindre    :sudo /sbin/shutdown -h now

La structure d’un fichier menu pour 9menu n’est pas compliquée, et se présente comme suit :

Entrée affichée :commande à lancer au clic
Autre entrée :commande à lancer au clic

J’ai donc définit des sous-menus, comme par exemple « Internet ». Cette entrée lance la commande suivante :

9menu -label " internet " -popup -bg "#08090A" -fg "#4B555E" -font "-*-fixed-medium-r-semicondensed-*-13-*-*-*-*-*-iso10646-*" -teleport -file internet

Cette commande lance 9menu, qui lit le fichier nommé « internet », que voici :

Internet :iceweasel
E-mail :claws-mail
Transmission:transmission
Gajim :gajim
Wicd :wicd-client -n
Tucan :tucan
Gftp :gftp
\*———-*
*Fermer* :exit

L’option -label n’est pas très importante, c'est juste le nom du menu. -popup permet que le menu s’efface une fois le choix effectué, remplacez par -popdown si vous voulez le garder. -bg et -fg définissent les couleurs d’arrière plan et premier plan. -font définit la police, que vous pouvez choisir avec xfontsel. -teleport envoie le menu sous la souris, -file permet de choisir le fichier de menu. Voilà, à vous de faire votre menu!

(03/07/13) : Comme me l'ai gentiment fait remarquer Yamakaky par courriel, la méthode proposée ci-dessous est très rustique. Elle impose de réécrire à chaque fois la commande de lancement de 9menu pour chaque sous menu. Afin d'obtenir quelque chose de plus facilement modifiable et plus clair, voici le script qu'il m'a proposé, que je diffuse ici avec son accord :

menu.sh:

#!/bin/sh
# $1 : fichier de sous-dossier.
# $2 : label de la fenêtre.
# Les deux paramètres sont optionnels. Si $1 est absent, le menu
# racine sera affiché.

BG='#000000'
FG='#848484'
FONT='-*-fixed-medium-r-semicondensed-*-13-*-*-*-*-*-iso10646-*'

# Ces variables sont utilisables dans les fichiers de menu.
export DIR_9MENU="$HOME/.9menu"
export ROOT_9MENU="$DIR_9MENU/root"
export PROG_9MENU="$0"

exec 9menu -label "${2:-dwm_menu}" -popup -bg "$BG" -fg "$FG" -font "$FONT" -teleport -file "${1:-$ROOT_9MENU}"

Exemples de fichiers :

${DIR_9MENU}/root:
exit
sub   >:$PROG_9MENU ${DIR_9MENU}/sub

${DIR_9MENU}/sub:
    Test     :sleep 20
    exit

Merci Yamakaky!

Configurer dwm

Comme d’habitude, on va configurer dwm via le config.h. D’abord, on définit la fonction permettant de lancer le menu :

/* commands */
static const char *dmenucmd[] = { "dmenu_run", "-fn", font, "-nb", normbgcolor, "-nf", normfgcolor,\
    "-sb", selbgcolor, "-sf", selfgcolor, NULL };
static const char *termcmd[]  = { "urxvtc", NULL };
static const char *menu[]  = { "/home/xavier/Documents/Scripts/dwm_menu/dwm_menu.sh", NULL };

La dernière ligne est à adapter par le chemin vers votre lanceur de menu, ou directement par la commande 9menu -file fichier_de_menu. Enfin, on appelle cette fonction lorsque l’on fait un clic droit sur la barre de status, ou sur le fond d’écran :

/* button definitions */
/* click can be ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, or ClkRootWin */
static Button buttons[] = {
/* click                event mask      button          function        argument */
/* Il y a déja des raccourcis ici, on met les nôtres à la suite */
{ ClkStatusText,        0,              Button3,        spawn,          {.v = menu } },
{ ClkRootWin,           0,         Button3,        spawn,      {.v = menu} },
};

Maintenant, il suffit de recompiler! profitez bien!

Voir aussi