De FVWM à awesome

Vincent Bernat

J’ai utilisé FVWM comme gestionnaire de fenêtres pendant plus de 10 ans. Cependant, le placement manuel des fenêtres et l’utilisation continuelle de la souris a fini par me lasser. Un gestionnaire de fenêtres fait partie de cette poignée de logiciels avec lesquels on interagit en permanence, ce qui explique leur grande diversité et l’investissement important en temps qu’ils peuvent représenter.

J’ai donc décidé d’utiliser un « tiling window manager ». Alors qu’i3 semblait particulièrement abouti et puissant (le screencast constitue une bonne démo), je cherchais un gestionnaire de fenêtres configurable et extensible à l’aide d’un langage de programmation quelconque. Parmi les choix les plus courants, on peut citer :

J’ai choisi awesome bien que StumpWM, avec l’utilisation de Common Lisp, me paraissait aussi intéressant. Il est cependant beaucoup plus minimaliste.

Voici ce que j’ai pu en tirer visuellement :

awesome dual screen setup
Dualhead setup with awesome

Configuration#

Sans fichier de configuration, awesome ne fait absolument rien. Il n’y a aucun comportement prédéfini: tout doit être programmé à travers un fichier de configuration en Lua. Bien sûr, un tel fichier est fourni comme base mais il est aussi possible de partir de zéro. Lorsqu’on désire un contrôle total sur son gestionnaire de fenêtres, c’est vraiment appréciable.

awesome est bien documenté. Le wiki fournit une FAQ, une bonne introduction et la référence de l’API est suffisamment concise pour pouvoir être lue du début à la fin. Savoir programmer en Lua n’est pas un prérequis, le langage étant assez simple de prise en main.

J’ai placé ma configuration sur GitHub. Elle n’est pas à utiliser directement : mieux vaut y piocher quelques éléments et l’adapter à vos goûts. Les sections suivantes mettent en lumière certains aspects.

Raccourcis#

Il y a dix ans, je faisais les poubelles pour récupérer des claviers « Modèle M ». Ils étaient particulièrement agréables à utiliser et le plus souvent dépourvus de touches Windows jugées nuisibles. Désormais, tous mes claviers ont des touches Windows. C’est finalement un changement majeur quand on veut configurer un gestionnaire de fenêtres car il devient possible d’y dédier une de ces touches, généralement celle la plus à gauche, appelée Mod4 et non utilisée par la plupart des applications.

Il devient alors possible de définir de nombreux raccourcis. Le souci est alors d’être capable de s’en souvenir. Pour m’aider, j’ai modifié le module awful.key pour pouvoir attacher une chaîne de documentation à chaque raccourci. J’ai documenté ce processus sur le wiki d’awesome.

aide en ligne pour awesome
Raccourcis disponibles dans le contexte actuel

Console à la Quake#

Une console à la Quake est un terminal escamotable en haut de l’écran. On l’affiche ou le cache à l’aide d’un raccourci. J’utilisais ce mécanisme très souvent avec FVWM. Bien que moins utile avec awesome, c’est un plus que je continue d’apprécier. Il existe plusieurs solutions documentées dans le wiki d’awesome. J’y ai ajouté la mienne1.

Quake console
Console à la Quake en haut de l'écran

XRandR#

XRandR est une extension qui permet de configurer à la volée les différents écrans : vous branchez un écran externe sur votre ordinateur portable et une commande permet d’y étendre le bureau :

$ xrandr --output VGA-1 --auto --left-of LVDS-1

awesome détecte ce changement et redémarre automatiquement. Sur les portables, il y a une touche dédiée à l’activation d’un écran externe. De nos jours, cette touche ne fait rien sans un peu de configuration. Elle correspond généralement au symbole XF86Display. J’ai associé celui-ci à une fonction qui fait tourner les différentes configurations possibles selon les écrans détectés. Par exemple, avec un écran externe branché sur un portable, je peux faire tourner les configurations suivantes :

  • écran interne uniquement,
  • écran externe uniquement,
  • écran interne à gauche, écran externe à droite,
  • écran externe à gauche, écran interne à droite,
  • aucun changement.

La configuration proposée est affichée via naughty, le système de notification intégré dans awesome.

Notification de configuration pour deux écrans
Notification indiquant une possible configuration de deux écrans via XRandR

Widgets#

J’utilisais jusqu’ici Conky pour afficher différentes informations relatives au système comme l’espace disponible, l’utilisation du CPU ou la bande passante réseau. awesome est livré avec des widgets qui peuvent remplir le même usage. J’utilise vicious, une surcouche pour gérer plus facilement les widgets: ce module permet d’attacher à chaque widget une fonction qui aura pour tâche de récupérer les valeurs nécessaires à l’affichage. Simple mais très puissant.

Voici un exemple pour afficher le volume :

local volwidget = widget({ type = "textbox" })
vicious.register(volwidget, vicious.widgets.volume,
         '<span font="Terminus 8">$2 $1%</span>',
        2, "Master")
volwidget:buttons(awful.util.table.join(
             awful.button({ }, 1, volume.mixer),
             awful.button({ }, 3, volume.toggle),
             awful.button({ }, 4, volume.increase),
             awful.button({ }, 5, volume.decrease)))

Il est également possible de fournir une fonction qui laissera toute latitude au formatage du texte. Par exemple, il est possible d’afficher une valeur en rouge sous un certain seuil. Voir par exemple mon widget pour batterie.

Divers widgets
Divers widgets: usage disque, usage CPU et mémoire, tags et agencement, utilisation du réseau, date et barre de notification, volume et date

Divers#

J’ai également apporté quelques modifications à divers autres points de ma configuration.

Configuration du clavier#

Je configure mes claviers en QWERTY. Pour les lettres accentuées et autres symboles, j’utilise une touche compose. J’ai également inversé Caps Lock et Control. La touche Pause est de plus redéfinie pour déclencher l’économiseur d’écran.

Grâce à un excellent article expliquant comment enrichir la configuration du clavier avec xkb, j’ai découvert qu’il existait dans X un mécanisme pour changer à la volée la configuration des touches2. Ainsi, ma configuration finale est :

$ setxkbmap us,fr '' compose:rwin ctrl:nocaps grp:rctrl_rshift_toggle
$ xmodmap -e 'keysym Pause = XF86ScreenSaver'

Il est possible de switcher entre AZERTY et QWERTY en pressant à la fois les touches Control et Maj situées à droite du clavier.

Ménage du côté GNOME#

Il y a à peine un an, j’ai voulu entrer de plain-pied dans la modernité et utiliser de nombreux composants GNOME tels que le GNOME Display Manager, le GNOME Power Manager, le GNOME Screen Saver, gnome-session, gnome-settings-daemon et gnome-four-à-pizza. Bien mal m’en a pris puisque même après la configuration initiale, j’ai continué à rencontrer régulièrement de nombreux problèmes avec notamment un économiseur d’écran qui fait grève après chaque mise à jour de GNOME jusqu’au prochain redémarrage de la session.

J’ai donc décidé de revenir vers des classiques et de troquer tous ces composants capricieux par des outils éprouvés comme sleepd et les outils du paquet pm-utils pour la gestion de l’énergie, xautolock et i3lock pour l’économiseur d’écran. SLiM a remplacé GDM et supporte désormais ConsoleKit3. J’utilise les fichiers ~/.gtkrc-2.0 et ~/.config/gtk-3.0/settings.ini pour configurer GTK+.

La modernité attendra.

Couleurs du terminal#

J’utilise rxvt-unicode comme terminal avec un fond noir (et un peu de transparence). Les seize couleurs par défaut sont parfois difficiles à lire. Il existe cependant de nombreux endroits pour trouver des palettes alternatives. J’ai opté pour une palette « derp » aux couleurs pastels et très lisibles.

Comparison des palettes pour terminaux
Comparaison de la palette de couleurs par défaut (en bas) avec la nouvelle (en haut)

J’ai également opté pour la fonte DejaVu Sans Mono au lieu de la vénérable fixed en ajoutant ceci dans ~/.Xresources:

Xft.antialias: true
Xft.hinting: true
Xft.hintstyle: hintlight
Xft.rgba: rgb
URxvt.font: xft:DejaVu Sans Mono-8
URxvt.letterSpace: -1

Le résultat est un peu moins net mais me semble toutefois plus lisible. Je changerai peut-être d’avis par la suite.

Comparaison des fontes pour terminaux
Comparison entre la fonte fixed (à gauche) et DejaVu Sans Mono (à droite)

Prochaine étape#

J’utilise désormais beaucoup moins la souris. Il reste toutefois le problème du navigateur. Je regarde activement du côté de luakit, un navigateur basé sur WebKit et extensible en Lua.


  1. La console utilise un nom qui lui est propre. Cela permet à awesome de la détecter de manière fiable quand elle apparaît, notamment lors des redémarrages. Je me suis inspiré de la façon de faire dans le mod de FVWM que j’utilisais. ↩︎

  2. L’agencement est commun à toutes les fenêtres. Pour obtenir un agencement propre à chaque fenêtre, jetez un œil sur kbdd↩︎

  3. Il est quasiment impossible de survivre sans ConsoleKit. La plupart des politiques de sécurité mises en place par PolicyKit n’utilisent plus de groupes pour gérer les permissions. Donc à moins de réécrire toutes ces politiques… ↩︎