Configuration de wmdrawer

par DENIS Kevin kevin (at) alinto (dot) com



Version 0.4.2 -- 04 Août 2005


wmdrawer est un petit outil proposant des menus sous l'environnement windowmaker.
Ce document indique comment améliorer facilement l'outil wmdrawer. Les exemples proposeront le changement de l'icône par défaut, et comment modifier au vol les boutons des menus et les menus contextuels associés. Ceci à l'aide de méthodes que nous pourrons appeler sales et rapides. Pour l'instant, ce document est placé sous la demerdenzisich licence, si tant est que je l'écris correctement, et tant que j'ignore comment placer un document en GPL. L'auteur (c'est moi, si si :) ), tient particulièrement a remercier ses index gauches et droits sans lesquels rien de ceci n'aurait été possible.

  1. Récupération des sources, recompilation

  2. Mise en forme du .wmdrawerrc

  3. Les scripts a la cool



Les sources de wmdrawer se trouvent là: http://people.easter-eggs.org/~valos/wmdrawer/. La version est la 0.10.5 (au jour d'aujourd'hui). Récuperez donc le tgz, et détargezedez-le[1] quelque part, comme /usr/src vous devez obtenir un truc dans le genre:

kevin@zipslack:/usr/src/WMAPPS/wmdrawer-0.10.5$ ls
AUTHORS    config.h    images.o                wmdrawer-redhat.spec
COPYING    config.o    pixmaps/                wmdrawer-slackware.spec
ChangeLog  doc/        types_defs.h            wmdrawer.c
INSTALL    graphics.c  utils.c                 wmdrawer.o
Makefile   graphics.h  utils.h                 wmdrawerrc.example
README     graphics.o  utils.o
TODO       images.c    wmdrawer*
config.c   images.h    wmdrawer-gentoo.ebuild
kevin@zipslack:/usr/src/WMAPPS/wmdrawer-0.10.5$ 
Vous pouvez remarquer deux choses: la première, c'est que dans mon cas, le source est dans /usr/src/WMAPPS/ et non dans /usr/src/ comme conseillé quelques lignes plus haut. C'est comme ça. La deuxième, c'est un répertoire qui s'appelle pixmaps/.
Alors si vous voulez compiler le soft, il suffit d'avoir sur sa distro: Et après modification éventuelle du Makefile, vous pourriez simplement taper
kevin@zipslack:/usr/src/WMAPPS/wmdrawer-0.10.5$ make
pour compiler le machin. Mais non. Par défaut, le logo utilisé est un pingouin, l'image est pixmaps/defaultDockIcon.xpm, un pingouin vu de trois-quart, et je préfere le logo du pingouin linux. Alors modifions ce qu'il faut pour avoir le pingouin linux (ou n'importe quel autre logo). J'ai récupéré un xpm du logo, appelé linux.xpm, dispo ici(faire enregistrer sous, le clic simple affiche du texte, je ne sais pas pourquoi). Mettez le fichier linux.xpm dans le répertoire pixmaps/. Ensuite, dans le fichier wmdrawer.c, à la ligne 41, vous avez:
#include "pixmaps/defaultDockIcon.xpm"
Modifiez le en:
#include "pixmaps/linux.xpm"
Deuxième chose. Le fichier .xpm contient (entre autre) le nom de la fonction définissant son image. Il faut modifier une deuxième fois le fichier à la ligne 256:
  if (useDefaultDockIcon == 1 || res == 0)
    createPixmapFromData ((const char **)defaultDockIcon_xpm, &dockIconPix,
                          &dockIconMask, &dockIconW, &dockIconH,
                          config.dockW, config.dockH, RESIZE_SMALLER);
vous voyez le defaultDockIcon_xpm ? Eh bien, on va mettre à la place la fonction de notre fichier xpm à nous qui s'appelle penguin_xpm, cela donnera:
  if (useDefaultDockIcon == 1 || res == 0)
    createPixmapFromData ((const char **)penguin_xpm, &dockIconPix,
                          &dockIconMask, &dockIconW, &dockIconH,
                          config.dockW, config.dockH, RESIZE_SMALLER);
Ok. Tout va bien, un nouveau fichier image pour le dock est présent, il est bien défini. On peut lancer la compilation:
kevin@zipslack:/usr/src/WMAPPS/wmdrawer-0.10.5$ make
gcc -O3 -Wall `gdk-pixbuf-config --cflags` -DLINUX -DUSE_GDKPIXBUF -c utils.c
gcc -O3 -Wall `gdk-pixbuf-config --cflags` -DLINUX -DUSE_GDKPIXBUF -c config.c
gcc -O3 -Wall `gdk-pixbuf-config --cflags` -DLINUX -DUSE_GDKPIXBUF -c graphics.c
gcc -O3 -Wall `gdk-pixbuf-config --cflags` -DLINUX -DUSE_GDKPIXBUF -c images.c
gcc -O3 -Wall `gdk-pixbuf-config --cflags` -DLINUX -DUSE_GDKPIXBUF -c wmdrawer.c
gcc `gdk-pixbuf-config --libs` -lgdk_pixbuf_xlib -o wmdrawer utils.o
 config.o graphics.o images.o wmdrawer.o
strip wmdrawer
kevin@zipslack:/usr/src/WMAPPS/wmdrawer-0.10.5$
Et voilà. La compilation s'est bien passée. Le binaire est là, prêt à servir. L'installation se fait en root avec un make install. Vous pouvez aussi le laisser là où il est et le lancer avec son chemin complet.

Pour les interessés qui veulent utiliser un autre pixmaps, je leur conseille de prendre une image de 48x48. De plus, pour trouver le nom de la fonction, il faut regarder le début du xpm comme indiqué:
kevin@zipslack:/usr/src/WMAPPS/wmdrawer-0.10.5$ head -2 pixmaps/linux.xpm 
/* XPM */
static char * penguin_xpm[] = {
kevin@zipslack:/usr/src/WMAPPS/wmdrawer-0.10.5$ 
La fonction est bien penguin_xpm. Faites de même pour votre fichier xpm perso.

--UPDATE!!--
Je viens de tomber sur le paramètre dock_icon du fichier de configuration. Il permet de définir un icone. Forcément c'est plus simple en donnant le chemin

# Dock's icon [optional]
#dock_icon        /usr/share/pixmaps/Brain.xpm
comme ça. Bon, bah si vous voulez une autre icone, ne vous prenez pas la tête à modifier le source de wmdrawer.c, et utilisez ce paramètre. -hem-. Bon, je suis passé à côté de ça, c'est pas grave, ça arrive à tout le monde, hein, et je vais me reconvertir en planteur de concombre au paraguay, ou en gratteur ici au grattez-moi-la, ou en nain dans un jardin. Bref.

Vous disposez d'un exemple de fichier de conf dans le répertoire des sources:

kevin@zipslack:/usr/src/WMAPPS/wmdrawer-0.10.5$ ls -l wmdrawerrc.example 
-rw-r--r--    1 kevin    users        2862 jun 26  2004 wmdrawerrc.example
Lisez le, c'est instructif. Vous pouvez choisir de le copier dans votre home directory puis de le modifier ou bien de créer ex nihilo un fichier .wmdrawerrc . Je vous donne le mien, commenté.
[general]
#dock_icon     /chemin/vers/icone/image.xpm
#pour qu'il s'ouvre de la droite vers la gauche.
direction      1                      
#le fond transparent
transparency    1
#Rapidité d'ouverture du menu
animation_speed 2
#Fermeture automatique du menu, timeout en millisecondes
hide_on_out     1
hide_timeout    2500
#chemin de recherche des images. Curieusement, chez moi, l'ajout de
#chemin ne modifie pas la recherche. Donc j'ai copié mes images
#dans l'un de ces deux répertoires
[images_paths]
/usr/share/pixmaps
/usr/share/icons

#Premiere ligne de menu. (oui, c'est bien une ligne et pas une column :)
# syntaxe: (indice contextuel) (image) (programme a executer)
# Reperage pour la premiere colonne: 1234567890
[column]
(X Terminal)            (Shell.png)             (xterm -ls)
(Config Reseau)         (Antennae.xpm)          (sudo /usr/local/sbin/IP)
(Montage cle USB)       (usbNB.png)             (~/bin/mount_usb)
(Demontage cle USB)     (gnome-error.png)       (~/bin/umount_usb)

#Et la deuxieme ligne de menus
[column]
(Xmms)                  (wmxmms.xpm)            (xmms)
(gmplayer)              (mplayer.xpm)           (gmplayer)
(Musiques)              (streamtuner.png)       (streamtuner)
(Xcalc)                 (HP-16C-48.xpm)         (xcalc)
Pensez à adapter à vos programmes/icones/etc.. Bon, c'est quand même relativement clair. Maintenant, dans un xterm, je tapes:
kevin@zipslack:~$ wmdrawer &
kevin@zipslack:~$
Et le petit pingouin apparaît en bas de mon écran. Avec la souris, je le prends et je le colle du côté droit de l'écran, dans le dock. (Hint: pour le conserver après un redémarrage, il faut quitter windowmaker par un "quitter session"). Ok, vous pouvez cliquer sur les boutons, les actions indiquées se réalisent.

wmdrawer est pas mal, mais je voulais lui ajouter un petit quelque chose en plus. Par exemple, si vous avez lu le .wmdrawerrc donné en exemple, vous voyez que j'ai un mount_usb. J'aurais aimé que je puisse cliquer sur "mount_usb", que ma clé usb se monte, puis que l'icône dans wmdrawerrc change de couleur afin que lors de la prochaine ouvertuure du wmdrawerrc, je puisse d'un coup d'oeil vérifier le montage ou pas de ma clé.
C'est également valide pour n'importe quoi, la connection au réseau, des mails en attente ou ce que vous souhaitez.
L'idée de base, c'est de modifier en temps réel le fichier .wmdrawerrc car le programme le relis à chaque ouverture. Si je reprends l'exemple de l'USB, je dois:

J'ai utilisé un script sed qui fait le boulot. La ligne à repérer est donc la quatrième après le repérage 1234567890. Voici le script (simplifié) mount_usb
  #! /bin/bash
  mount /mnt/cle-usb
  sed '
  /1234567890/,$!b
  n
  n
  n
  n
  s/.*/(Cle USB Montee)  (usb.png)        (~\/bin\/mount_usb)/
  :1
  n
  b1' < ~/.wmdrawerrc > ~/.wmdrawerrc.new
  mv -f ~/.wmdrawerrc.new ~/.wmdrawerrc 
Et voilà, lors du prochain clic sur wmdrawer, le fichier affichera l'icone usb.png, non plus en noir et blanc (usbNB.png) mais en couleur, et le texte m'indique bien que la clé est montée. Le script sed est basique: repérage de la ligne, puis 4 'n' pour quatre lignes suivantes, puis un remplacement de la ligne (attention aux / qui doivent être échappés, et puis c'est tout.
Le script umount_usb fait la même chose en remettant l'icone en noir et blanc.

Vous pouvez maintenant imaginer de faire de même avec n'importe quelle ligne du fichier de conf de wmdrawerrc. L'utilisation de wmdrawerrc conjointe à Xdialog et/ou (g)xmessage permet d'écrire très vite (qui a dit "alakrade"?) des scripts fonctionnels.
Ok, that's all folks, comments to -> kevin(at)alinto(point)com, flames -> /dev/null, et le reste a l'avenant!
Le verbe detargezeder n'est pas dans le dictionnaire? C'est un tort, vous pouvez mettre en place une petition en ligne, je viendrais la signer avec empressement :) .