FVWM-Crystal sur une Ubuntu

Miguel Moquillon

Apparu sur la scène en juin 1993, FVWM est le premier gestionnaire de fenêtres évolué, avec son support de bureaux virtuels, pour le système graphique X. Depuis, il n'a cessé d'évoluer pour devenir le gestionnaire de fenêtres probablement encore le plus puissant mais surtout le plus configurable ; il peut prendre, à s'y méprendre, l'apparence mais aussi le comportement d'un Windows XP ou d'un MacOS X. Il est donc le gestionnaire de fenêtre idéal pour créer son propre environnement graphique ou de tester de nouvelles approches de l'interaction machine-utilisateur (IHM).

Parce que FVWM est hautement configurable, mais surtout parce qu'il n'existe pas d'outils aisés et simples permettant de couvrir l'étendue de ses paramètres de configuration, l'adaptation de FVWM à ses besoins et à ses goûts devient rapidement un véritable parcours du combattant. D'autant plus qu'à son installation, FVWM est par défaut ... très épuré et plus que sobre (je dirais même très moche et pauvre en interaction). Il est donc fortement recommandé de sauvegarder dans un coin sa propre configuration afin de pouvoir la restaurer ou la mettre en place sur une nouvelle machine.

C'est ici que FVWM-Crystal intervient. La magie de FVWM est qu'il est possible à partir de ce dernier de construire un véritable environnement graphique (desktop dans le jargon anglo-saxon). C'est ce qu'a fait Maciej Delmanowski en juin 2003 avec FVWM-Crystal ; il a construit un véritable ensemble de fichiers de configurations, de scripts et de thèmes à partir duquel il est possible de concevoir rapidement son propre environnement ou tout simplement réutiliser un de ceux prédéfinis et livrés avec. Cet article a pour but de décrire l'installation et la configuration de FVWM-Crystal sur une distribution GNU/Linux Ubuntu.

Mon environnement graphique

1. Historique de FVWM

FVWM a été développé initialement par Robert Nation courant 1993 afin d'une part pouvoir utiliser son portable PC sous GNU/Linux avec X (un 486 33 MHz avec 4 Mo de RAM !) et d'autre part pouvoir visualiser, dans le cadre de son travail professionnel, des spectrogrammes pouvant atteindre 4000x200 pixels. Jusqu'à présent il évoluait sous TWM, un des premiers gestionnaires de fenêtres, et ce dernier, pourtant relativement simple, consommait pas mal de ressources et était assez limité dans ses fonctionnalités.

Dans un premier temps, il développa le fameux terminal X rxvt à partir du code de xvt, puis s'attela à développer, à partir de TWM, un gestionnaire de fenêtres simple, avec une très faible empreinte mémoire et à l'époque peu flexible mais avec le support des bureaux virtuels. Il apparu sur internet le 1er juin 1993, livré avec le programme rxvt (la version 0.5). Fin 1993, la version 1.0 fit son apparition, cette fois-ci sans être empaquetée avec rxvt. Dès sa première apparition, ce fut un véritable succès et FVWM a été accepté et utilisé par un nombre croissant de personnes. A l'origine FVWM signifiait Feeble Virtual Window Manager, mais la signification du F fut abandonné, bien que la lettre fut gardée ; il devint F Virtual Window Manager. Courant 1995, par des impératifs familiaux et par une perte d'intérêt, Ron ne put correctement gérer son projet et laissa les rênes à Chuck Hines. Entre temps, FVWM s'étoffa en capacités sans pour autant augmenter son empreinte mémoire.

Chuck Hines reprit le projet d'août 1995 à mai 1998. Durant cette période, une nouvelle conception et un nouveau format dans les fichiers de configurations conduisit à l'aboutissement de la famille 2.x.y de FVWM. On l'appela dorénavant FVWM2 en opposition à la version initiale, celle de Rob ; FVWM est le gestionnaire de fenêtres de Rob tandis que FVWM2 devint le gestionnaire de fenêtres de la communauté. Brady Montz repris un temps le flambeau, puis Dominik Vogt s'attela, avec d'autre, à écrire la version 2.2 de FVWM qui apparut en février 1999. Actuellement, la dernière version stable est la 2.4.19 tandis que la version de développement, pourtant stable, est la 2.5.18.

Les quelques caractéristiques actuelles de FVWM sont :

Par les possibilités de FVWM, mais surtout par la qualité de son code, il servit de support dans l'écriture de nouveaux gestionnaires de fenêtres pour X, dont, pour les plus connus, AfterStep et Enlightenment.

2. Installation

FVWM-Crystal s'appuie sur le gestionnaire de fenêtres FVWM. Il est donc indispensable d'installer ce dernier :

$ apt-get install fvwm fvwm-icons wm-icons

Une collection d'icônes pour gestionnaires de fenêtres quelconques, wm-icons, est aussi installée.

Actuellement, la version disponible sous Ubuntu Dapper Drake est la version de développement 2.5.14 et celle sous Ubuntu Edgy Eft est la 2.5.16.

FVWM-Crystal n'est pas disponible sous forme de paquets dans les dépôts d'Ubuntu Dapper Drake, par contre, il est présent dans les dépôts testing et unstable de Debian et dans les dépôts universe d'Ubuntu Edgy Eft ; toutefois ces derniers fournissent l'avant dernière version de FVWM-Crystal. J'ai opté de télécharger directement les dernières sources sur le site officiel.

Une fois l'archive téléchargée, décompressez et désarchivez la. Un répertoire, fvwm-crystal-3.0.4/ avec tout son contenu y est extrait. Prenez soin de lire le fichier INSTALL dedans et installez les programmes qui vous intéressent et que s'attend à trouver FVWM-Crystal. Par exemple, dans mon cas, j'ai installé les programmes ImageMagick (pour créer des snapshots des applications en guide d'icônes par exemple), hsetroot pour mettre un fond d'écran, trayer comme zone de notification (utilisé, entre autre, par les appliquettes GNOME comme nm-applet pour la connexion WiFi ou mail-notification pour la notification de nouveaux courriels), urxvt comme terminal X avec support de l'UTF-8 et de la semi-transparence, mpd, mpc et gmpc pour le contrôleur de musique intégré de FVWM-Crystal, et ROX-Filer comme gestionnaire de fichiers. Les autres programmes, comme xscreensaver, sudo ou encore gdmflexiserver ont été déjà installés lors de l'installation de la Ubuntu Dapper Drake sur mon portable PC.

$ apt-get install imagemagick hsetroot mpd mpc gmpc trayer rox-filer

Une fois ceci fait, pour installer FVWM-Crystal, il suffit juste de saisir au prompt, dans le répertoire fvwm-crystal-3.0.4/ :

make prefix=/usr/local install

Par convention, FVWM-Crystal a été installé au noeud /usr/local. Ce dernier est dédié à recevoir toutes applications locales à la machine et qui ne soient pas livrées par le système de paquets de la distribution. Le répertoire racine d'installation de FVWM-Crystal est alors /usr/local/share/fvwm-crystal/ et des scripts ont été mis dans /usr/local/bin/ : fvwm-crystal pour lancer l'environnement graphique (FVWM configuré aux petits oignons par FVWM-Crystal), fvwm-crystal.apps pour générer le menu et le panneau éventuel avec quelques applications, fvwm-crystal.wallpaper pour l'affichage aléatoire de fond d'écrans. Ces deux derniers programmes sont appelés par le premier lors du lancement de l'environnement.

Maintenant, quelques explications sur le contenu du répertoire racine de FVWM-Crystal. Tout ce qui fait l'environnement est contenu dans le sous-répertoire fvwm/ :

Répertoire ou fichier Description
Applications/ La base de données des applications. Si une application que vous utilisez n'y est pas référencée, créez lui une entrée (voir section suivante).
colorsets/ Définitions de différents jeux de couleurs, dans des fichiers de configuration FVWM, et qui peuvent être utilisés par différents thèmes.
components/ Ensembles de configurations et de scripts FVWM, définissant le coeur de FVWM-Crystal. Ce dernier peut-être étendu par un utilisateur (voir section suivante)
config Fichier de configuration d'entrée de FVWM-Crystal. Y sont chargés des variables d'environnement et d'autres fichiers de configurations FVWM.
decorations/ Réparties dans des sous-répertoires, par thèmes ou par styles, les décorations des fenêtres.
icons/ Dépôts de toutes les icônes utilisées par FVWM-Crystal, que ce soit pour les applications, les boutons de fenêtres qu'autre chose. Les icônes sont classifiées par jeux d'icônes et par dimensions. A l'installation, un seul jeux d'icônes est disponible (Default) et pour les dimensions 16x16, 22x22, 32x32 et 48x48.
locale/ Répertoire où sont stockés la traduction des textes affichés par FVWM-Crystal dans différentes langues.
preferences/ C'est ici que sont définies les préférences globales de l'environnement graphique. Elles sont surchargées par les préférences de l'utilisateur (voir la section sur la configuration). Au premier démarrage de FVWM-Crystal, ce sont ces préférences qui seront chargées.
recipes/ Dépôts des différentes recettes d'élaboration d'un environnement graphique avec FVWM-Crystal. Chaque recette est caractérisée par un fichier dans lequel y sont explicitement chargés d'autres fichiers FVWM pour les raccourcis clavier, les composants à charger (pager, horloge, etc.), le comportement de la souris, le ou les menus, etc.
scripts/ Répertoire de scripts de FVWM-Crystal fournissant des applications tierces. Par exemple, une appliquette de lecture de musiques pour MPD.
wallpapers/ Ensemble de fonds d'écrans.

Avec l'archive de FVWM-Crystal sont fournis différents fichiers dans le répertoire addons/, chacun permettant de mieux intégrer FVWM-Crystal avec son système : fvwm.vim qui définit la syntaxe des fichiers de configuration de FVWM pour Vim, sudo pour permettre à des utilisateurs de pouvoir utiliser des commandes avec les droits de super utilisateur (comme shutdown pour éteindre sa machine), Xresources qui contient des définitions de ressources X comme les couleurs ou les fontes pour un ensemble d'applications comme urxvt, Xsession qui permet de lancer FVWM-Crystal lors de l'ouverture d'une session X via un gestionnaire de session comme xdm, et fvwm-crystal.desktop qui déclare une entrée de session X pour gdm. Seul les trois derniers ont été utilisés :

$ cp Xsession ~/.Xsession
$ cp Xresources ~/.Xresources
$ sudo cp fvwm-crystal.desktop /usr/share/xsessions/

Au lancement de FVWM-Crystal, s'ils n'existent pas déjà, les répertoires .fvwm/ et .fvwm-crystal/ sont crées. Ce sont ces répertoires qui contiendrons les paramètres de configurations permettant d'adapter FVWM-Crystal à ses besoins particuliers.

A côté des programmes recommandés par FVWM-Crystal, d'autres applications ont été aussi installées et dont j'ai l'habitude : apwal pour afficher, au click de la souris et sous son pointeur, des icônes de lancement d'applications (ceci évite à polluer son fond d'écran par des icônes ou à utiliser un panneau jusqu'auquel la souris doit se déplacer), conky pour l'affichage de données systèmes sur le PC, et gdeskcal pour avoir un calendrier avec lequel je puisse enregistrer mes rendez-vous par exemple.

$ apt-get install apwal gdeskcal conky

3. Extension

La force de FVWM-Crystal est qu'il est possible de l'étendre en profitant de son architecture, de ses scripts et en s'appuyant sur ses différentes recettes de configuration.

Dans ce qui suit, toute indication de chemin est relative au répertoire /usr/local/share/fvwm-crystal/fvwm/.

3.1. Ajouter une application

La base de données des applications, dans FVWM-Crystal, est représentée par le répertoire Applications/. Dans celui-ci, chaque arborescence correspond à des catégories et sous-catérogies dans lesquelles sont classées les applications. La présence des catégories ne signifie pas pour autant que leur nom apparaitra dans le menu. Il n'apparait que si au moins une sous-catégorie y est présente. Dans le cas contraire, les applications de catégories différentes apparaissent ensemble, séparées dans le menu par des séparateurs. Pour rajouter des entrées dans la base de données, il suffit alors de placer un script shell qui lancera l'application dans la catégorie adéquat. Le nom de ce script doit suivre une certaine convention :

[PRIORITE]~[NOM_EXECUTABLE]~ENTREE_MENU

PRIORITE, qui est optionnel, donne l'ordre d'apparition dans le menu de l'entrée par rapport aux autres. Par défaut la priorité est 0, c'est à dire pas de préférence d'apparition. NOM_EXECUTABLE, optionnel, est le nom de l'exécutable et il permet à FVWM-Crystal de vérifier son existance. Si l'exécutable n'est pas présent sur la machine, l'entrée n'apparaitra pas dans le menu. ENTREE_MENU est le nom de l'application qui s'affichera dans le menu. Les catégories suivent aussi ce format :

[PRIORITE~]NOM_CATEGORIE

les scripts et les catégories doivent avoir leur droit eXecutable d'activé pour apparaitre dans le menu.

Par exemple, pour rajouter comme entrée le programme GCompris, j'ai créé une nouvelle entrée dans la catégorie des jeux :

$ cd Applications/20~Games
$ sudo mkdir Education

Puis, dedans j'y ai inséré l'entrée GCompris sous le nom~gcompris~GCompris et contenant :

#!/usr/bin/env sh exec gcompris

Il ne reste plus qu'à associer une icône au nouveau élement de menu. FVWM-Crystal cherche d'abord une icône dans icons/ dont le nom est celui de l'élement, et s'il ne le trouve pas, cherche une icône dont le nom est celui de l'exécutable. La dimension de l'icône recherchée dépend de la recette courante qui construit le menu.

Evidemment, les noms des catégories sont internationalisés. Il suffit juste alors de rajouter une entrée dans le fichier fvwm-crystal.po avec sa traduction dans la langue correspondante, puis, à partir de celui-ci, de générer le binaire fvwm-crystal.mo.

Il est possible aussi de définir ses applications ou de raffiner celles existantes par une configuration utilisateur (voir la section correspondante).

3.2. Localisation/Internationalisation

Tous les textes de FVWM-Crystal sont internationalisés. Les différentes traductions sont situées dans le répertoire locale/. Chaque traduction ou locale est représentée par un répertoire dont le nom correspond à la norme en vigueur, c'est-à -dire à

LANGUE_PAYS[.MULTI_OCTETS]

LANGUE étant le symbole international sur deux caractères en minuscules de la langue (voir la norme ISO 639), et PAYS le symbole international sur deux caractères et en majuscules du pays en question (voir la norme ISO 3166-1). En option le type de l'encodage est précisé en cas où les traductions sont faites avec un jeux de caractères multi-octets : c'est la cas par exemple de l'UTF-8. Pour plus d'informations sur l'internationalisation ou l'i18n, vous pouvez consulter ce document d'introduction sur le sujet sur le site de Debian. Chaque locale contient, selon le standard Unix, le sous-répertoire LC_MESSAGES. C'est dans ce dernier que sont placées les traductions des textes de FVWM-Crystal.

FVWM-Crystal est internationalisé ... excepté pour le français et ceci quelque soit le pays francophone en question ! De plus, une partie des textes de FVWM-Crystal ne sont pas traduites. Heureusement pour nous, chaque traduction est accompagnée de son source, fvwm-crystal.po. Il suffit alors de récupérer un de ces fichiers pour une langue et un pays quelconque, puis de changer, pour chaque entrée, chaque valeur de l'attribut msgstr par celle en français. Une fois ceci fait, il suffit alors de créer la locale pour le français et la France dans le répertoire locale/ :

$ cd locale
$ mkdir -p fr_FR.UTF-8/LC_MESSAGES

puis d'y générer le binaire des traductions que l'on a réalisé dans le source :

$ msgfmt -o fvwm-crystal.mo fvwm-crystal.po
$ sudo mv fvwm-crystal.po /usr/local/share/fvwm-crystam/fvwm/locale/fr_FR.UTF-8/LC_MESSAGES/
$ sudo mv fvwm-crystal.mo /usr/local/share/fvwm-crystam/fvwm/locale/fr_FR.UTF-8/LC_MESSAGES/

Afin de vous éviter ce travail, vous pouvez récupérer par les liens ci-après non seulement le source, mais aussi le binaire : fvwm-crystal.po, fvwm-crystal.mo. Non seulement, les textes usuels de FVWM-Crystal sont traduits, mais ceux aussi (une bonne partie) qui ne le sont pas par défaut.

Avant de pouvoir profiter de l'internationalisation française avec FVWM-Crystal, il est nécessaire de vérifier que des variables d'environnement soient bien valorisées. Or, sous Ubuntu, toutes les variables d'environnement i18n ne sont pas valorisées, simplement parce que GNOME semble surcharger ou définir celles-ci. Pour ce faire, il suffit d'éditer le fichier /etc/environment et de valoriser ces variables. Le fait de les déclarer dans ce fichier de configuration permet de profiter de celles-ci aussi bien en console texte qu'en console X. Voici le contenu du fichier /etc/environment modifié :

PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/bin/X11:/usr/games"
LANG="fr_FR.UTF-8"
LANGUAGE="fr_FR.UTF-8:fr_FR:fr:en_GB:en"
LINGUAS="fr_FR.UTF8:fr_FR:fr"
LC_ALL="fr_FR.UTF-8"

(Note : LINGUAS est l'anciènne variable d'environnement d'internationalisation sous X. Normalement, plus aucun programme X actuel ne devrait la supporter, toutefois, je la valorise tout de même en cas où ...)

3.3. Créer une recette

Un environnement graphique, avec son aspect et son comportement (ou look&feel en anglais), est décrit au travers de ce que FVWM-Crystal appelle une recette. Les recettes sont découplées du jeux de couleurs et du style de décoration des fenêtres, permettant ainsi une grande combinaison dans l'apparence finale de l'environnement. Les recettes sont définies dans le répertoire recipes/ sous forme d'un fichier FVWM chacune. Si vous éditez un de ces fichiers, vous remarquerez deux choses : d'abord il charge un ensemble de fichiers de configuration et de scripts FVWM, ensuite il paramètre l'environnement graphique en décrivant les composants constitutifs de ce dernier (comme une zone de notification par exemple), mais aussi le comportement des fenêtres et bien d'autres choses. L'ensemble des fichiers chargés sont en fait répartis dans les différents sous-répertoires de FVWM-Crystal et ils définissent :

La paramétrage de l'environnement graphique définit le comportement des bureaux virtuels, la création du ou des menus, l'affichage ou non d'un panneau, d'une horloge, d'une zone de notification, d'une barre des tâches, etc. Elle peut aussi surcharger certains paramètres de configurations définis dans les fichiers précédemment chargés.

Certains paramètres de configuration, comme le comportement des fenêtres ou des espaces virtuels par exemple, peuvent être surchargés dans la configuration utilisateur (voir la section correspondante).

Pour en savoir plus sur la syntaxe des fichiers de configuration FVWM et sur son paramétrage, voir l'excellent document FVWM Beginners Guide.

Dans cette section, nous allons illustrer la création d'une recette à l'aide d'un exemple simple. Notre nouvelle recette doit répondre aux besoins suivants :

Notre recette s'appellera «Patagonie» et son jeu de couleur par défaut sera dans les tons blancs. Elle s'appuiera sur la recette «Clean» car elle répond déjà à un bon nombre de nos besoins ci-dessus :

$ cd /usr/local/share/fvwm-crystal/fvwm/recipes
$ sudo cp Clean Patagonie

Reste maintenant à adapter les configurations dans notre nouveau fichier Patagonie.

La recette, comme toutes les autres, inclue un certain nombre de scripts permettant d'initialiser l'environnement. Parmi celles-ci, le fichier FVWM-Crystal_Preferences qui charge les préférences globales de l'environnement. Ces préférences sont celles par défaut au premier démarrage de FVWM-Crystal. Dans notre cas, le jeu de couleurs et la décoration des fenêtres qui sont chargés par celles-ci ne conviennent pas à notre thème. Pour y remédier, nous chargeons explicitement dans la recette ceux qui nous conviennent, ou plus exactement nous modifions les préférences de l'utilisateur en utilisant la fonction de bas niveau SavePreference définie dans le fichier components/functions/Preferences :

# Now we override some default decoration and colorsets setting
# provided by the components/desktop/FVWM-Crystal_Preferences file
SavePreferences LastChoosenColorset "Colorsets-Set $[FVWM_SYSTEMDIR]/colorsets/WhiteDesktop.cs"
SavePreferences LastChoosenWindowDecoration "Window-Decorations-Set $[FVWM_SYSTEMDIR]/decorations/Patagonie/Default"

Afin que les nouvelles préférences soient correctement chargées, lors du changement de recette à Patagonie, choisir de ne pas redémarrer FVWM-Crystal. Quitter plutôt la session X pour s'y connecter à nouveau.

Pour poursuivre, nous allons maintenant remplacer l'ouverture d'un terminal X au clic droit de la souris sur le bureau par celle du programme Apwal. Celui-ci affiche sous le pointeur de la souris, durant un laps de temps, un ensemble d'icônes permettant, par un clic gauche dessus, de lancer l'application associée :

# Desktop & window bindings {{{2
Include components/bindings/Desktop-RMB-OpenApwal

Reste à créer le fichier FVWM :

$ cd ../components/bindings
$ sudo vi Desktop-RMB-OpenApwal

avec le contenu :

# Default desktop bindings

# Launch apwal on RMB
Mouse 3 RI $[Mod] X apwal

# vim:ft=fvwm

Les raccourcis des commandes utilisées dans FVWM-Crystal (A, AA, X, etc.) sont définis dans le fichier components/functions/Exec-Accelerator. Les raccourcis des touches de modification du clavier (Mod, Mod0, Mod1, etc.) sont définis dans le fichier components/functions/Keyboard-Modifiers. Ainsi, ici, le programme Apwal sera exécuté (raccourcis X) lors d'un clic droit de la souris (Mouse 3) sur le bureau (R pour root window) ou sur une application icônifiée (I pour icône) et quelque soit le modificateur utilisé ou non (la variable $[Mod] est valorisée avec A qui signifie Any).

Ne souhaitans pas se déplacer d'une page à une autre d'un bureau virtuel en passant le pointeur de la souris sur les bords de la page courante, le contrôle de la force du déplacement avec la souris est inutile. L'inclusion du fichier components/bindings/Desktop-MMB-EdgeScroll est alors supprimée de la recette. Par contre, nous souhaitons passer d'une page à l'autre d'un bureau virtuel avec la roulette de la souris sur le bureau. Or, il existe déjà une configuration FVWM pour cela : components/bindings/Desktop-PageSwitch-Horizontal. Il reste donc à l'inclure dans notre recette :

Include components/bindings/Desktop-PageSwitch-Horizontal

Il peut-être intéressant d'afficher ou non le panneau virtuel, zone de bordure de l'écran dans laquelle seront affichés le pager, la zone de notification, l'horloge et éventuellement des appliquettes que pourrait lancer l'utilisateur au démarrage de l'environnement graphique. Aussi, l'inclusion de components/bindings/Desktop-MMB-TogglePanels est gardée.

Actuellement, le contrôle avec la souris d'une fenêtre est déjà prédéfini et ceci dans components/bindings/Window-Basic. Or ces contrôles ne répondent pas tous aux besoins. Par exemple, un des contrôles définit le pliage ou dépliage d'une fenêtre par un clic milieu de la souris. Un nouveau fichier components/bindings/Window-Extended est alors créé pour pour définir nos propres contrôles :

# Extended window bindings

# Move with mouse motion and raise with mouse left-click and left-motion
Mouse 1 T $[Mod] Window-Raise-RaiseMove

# Shade the window with the mouse wheel
Mouse 4 T $[Mod] Window-Shade True
Mouse 5 T $[Mod] Window-Shade False

# Resize the window with a mouse right-motion and
# put the window in fullscrean with a mouse right-click
Mouse 3 T $[Mod] Window-Resize-Fullscreen

# Idem that above but with meta keys and also on the window space
Mouse 1 WT $[Mod1] Window-Raise-RaiseMove
Mouse 1 WT $[Mod1]2 Window-Raise-RaiseMove
Mouse 3 WT $[Mod1] Window-Resize-Maximize
Mouse 3 WT $[Mod1]2 Window-Resize-Maximize

# vim:ft=fvwm

Reste à définir les nouvelles fonctions Window-Resize-Maximize et Window-Resize-Fullscreen dans components/functions/Window-Basic :

DestroyFunc Window-Resize-Maximize
AddToFunc Window-Resize-Maximize
+ C Maximize $0 $1
+ M Resize Direction SE

DestroyFunc Window-Resize-Fullscreen
AddToFunc Window-Resize-Fullscreen
+ C Fullscreen $0 $1
+ M Resize Direction SE

Puis à remplacer, dans notre recette, l'inclusion des contrôles définis par components/bindings/Window-Basic par les notres :

Include components/bindings/Window-Extended

Par défaut, les fenêtres dans FVWM-Crystal, quelque soit la recette utilisée, sont bordées d'un cadre de 1 pixel. Ce qui fait peu pour pouvoir redimensionner à la souris la fenêtre via son cadre ! Le style des fenêtres sont définis dans le fichier components/styles/FVWM qui est appelé par le fichier components/desktop/FVWM-Crystal_Styles qui lui est inclut par la recette. Soit ce fichier est adapté au besoin et donc s'appliquera à toutes les recettes, soit un nouveau fichier est créé avec notre propre style. Dans ce dernier cas, le fichier FVWM est dupiqué en FVWM-2 :

$ cd /usr/local/share/fvwm-crystal/fvwm/components/styles
$ sudo cp FVWM FVWM-2

puis le contenu est adapté, et plus précisément la ligne correspondant au style des fenêtres :

Style FvwmForm Sticky, WindowListSkip, \
FixedSize, StaysOnTop, NoHandles, BorderWidth 2, HandleWidth 2, \
NoTitle, NoIcon, Colorset $[cs-panel-border], \
BorderColorset $[cs-panel-border], HilightColorset $[cs-panel-border], \
HilightBorderColorset $[cs-panel-border]

Reste ensuite à créer un nouveau fichier à partir de components/desktop :

$ sudo cp FVWM-Crystal_Styles FVWM-Another_Styles

avec le contenu :

# Mes styles Append components/styles/Application-Icons-22-32
Append components/styles/Applications
Include components/styles/QuakeConsole
Include components/styles/Menu
Include components/styles/FVWM-2
Include components/styles/CursorStyle
Include components/styles/FocusPolicy-FVWM-Crystal-Raise
# vim:ft=fvwm

Par la même occasion, le choix du focus des fenêtres par un clic gauche de la souris soit sur la fenêtre elle-même, soit sur la barre des titres est chargé. Reste maintenant à l'inclure dans la recette à la place de FVWM-Crystal_Styles :

# Various styles {{{2
Include components/desktop/FVWM-Another_Styles

Par défaut, la politique de placement des fenêtres dans FVWM-Crystal est de les centrer dans l'espace de travail. Elle est réalisée par la fonction Window-SetPlacementPolicy qui est définie dans le fichier components/functions/Window-SetPlacementPolicy. Cette politique ne convient pas aux exigences énoncées, aussi, la fonction est redéfinie dans la recette :

# Override the FVWM-Crystal default window placement policy
DestroyFunc Window-SetPlacementPolicy
AddToFunc Window-SetPlacementPolicy
+ I MinOverlapPlacement
+ I Any (CurrentPage, !Fvwm*, !Gkrellm, !trayer, !gdeskcal, !gdesklets, !Iconic) Style * MinOverlapPercentPlacement

La bordure de 3 pixels autour du bureau, contrôlé par la fonction EWMH-Desktop, est gardée. Par contre, la largeur du panneau inférieur dans lequel seront placés pager, zone de notification, et autres objets, est agrandi jusqu'à 90 pixels afin que l'horloge et une partie de la zone de notification ne soient pas cachées lors de l'agrandissement maximale d'une fenêtre :

EWMH-Desktop 3 3 3 3
EWMH-Panel-Bottom 90

Le menu principal est affiché non seulement au clic gauche de la souris sur le bureau mais aussi avec la combinaison de touches Alt+Menu au clavier. Ce dernier est remplacé par la touche simple Menu. Ce contrôle est soit rajouté dans le fichier components/bindings/Misc-Keybindings avec les autres raccourcis, soit il est simplement rajouté dans notre recette :

Key Menu A $[Mod0] Menu /FVWM-Crystal root c c

Le pager et la zone de notification sont déjà définis dans la recette : le pager est placé horizontalement au coin inférieur droit tandis que la zone de notification est placée verticalement au coin inférieur droit, juste au-dessus du pager. Reste à ajouter l'horloge et à le placer à gauche de la zone de notification, au-dessus du pager. Pour ce faire, le code est repris d'une recette existante, Default par exemple, et adapté :

# Clock {{{1
All (FvwmButtons-Clock) Close
DestroyModuleConfig FvwmButtons-Clock: *
*FvwmButtons-Clock: Geometry -40-40
*FvwmButtons-Clock: BoxSize smart
*FvwmButtons-Clock: ActiveColorset $[cs-panel-active]
*FvwmButtons-Clock: Colorset $[cs-panel-inactive]
*FvwmButtons-Clock: Columns 2
*FvwmButtons-Clock: Padding 2 2
*FvwmButtons-Clock: Frame 0
*FvwmButtons-Clock: (2x1, Size 60 24, \
Swallow (Close, Respawn, FvwmModule) "FvwmScript-Clock" 'Script components/scripts/FvwmScript-Clock', \
Action (Mouse 3) SendToModule *FvwmScript-Clock SendString 1 1 str)

Module FvwmButtons FvwmButtons-Clock

Par la même occasion, comme le PC est un portable, j'inclus aussi le contrôleur de batterie qui fait partie des scripts fournis par FVWM-Crystal :

# AcpiBatt {{{1
All (FvwmButtons-AcpiBatt) Close
DestroyModuleConfig FvwmButtons-AcpiBatt: *
*FvwmButtons-AcpiBatt: Geometry -100-40
*FvwmButtons-AcpiBatt: BoxSize smart
*FvwmButtons-AcpiBatt: ActiveColorset $[cs-panel-active]
*FvwmButtons-AcpiBatt: Colorset $[cs-panel-inactive]
*FvwmButtons-AcpiBatt: Columns 2
*FvwmButtons-AcpiBatt: Padding 2 2
*FvwmButtons-AcpiBatt: Frame 0

*FvwmButtons-AcpiBatt: (2x1, Size 60 24, Swallow (Close, Respawn) "FvwmScript-A$

Module FvwmButtons FvwmButtons-AcpiBatt
Script components/scripts/FvwmScript-AcpiBatt

Le code est récupéré de la recette Default with ACPI et adapté à nos besoins.

Notre recette est maintenant finie, il ne reste plus qu'à définir la décoration de la barre des titres des fenêtres. Or cette dernière n'est pas définie par une recette, mais est laissée à la discrétion de l'utilisateur, quelque soit la recette chargée. La section qui suit présente la façon de créer un nouveau style de décoration des fenêtres.

Vous trouverez la recette et le nouveau style de décorations décrit ci-dessous dans l'archive patagonie.tgz

3.4. Créer un style de décoration

Un style de décoration dans FVWM-Crystal définit l'aspect de la barre des titres avec ses boutons. Le choix de l'apparence et les actions possibles sur les boutons de la barre des titres sont laissés à la discrétion de l'utilisateur. Ceci est considéré dans FVWM-Crystal comme une préférence. Par défaut, le style de décoration chargé au premier démarrage de FVWM-Crystal est celui indiqué dans preferences/LastChoosenWindowDecoration, c'est-à-dire decorations/Crystal/DarkDesktop. Ce dernier est en fait un répertoire contenant différents thèmes possible pour le style. Le thème utilisé par défaut est déclaré par preferences/LastChoosenButtonModel qui se trouve être Theme.fvwm-crystal.

Les styles de décoraction sont tous définis dans le répertoire decorations/. Chaque style est défini par un répertoire qui doit contenir un ou plusieurs sous-répertoires représentant un raffinement du style. Par exemple, le style de décoration «Aqua» possède deux raffinements possibles, chacun représenté par un sous-répertoire du nom du raffinement : «Blank buttons» et «Buttons with icons». Si un style n'a pas de raffinements, sa définition est contenu dans le sous-répertoire Default/. C'est une convention de FVWM-Crystal.

Pour définir l'apparence et le comportement de la barre des titres selon nos besoins, différentes solutions existent :

La dernière solution est plus intéressante et elle peut être réalisée à partir des raffinement «DarkDesktop» du style «Crystal» et «Buttons with icons» du style «Aqua», et de la décoration «Winter» :

$ sudo mkdir decorations/Patagonie/Default
$ sudo cp decorations/Crystal/DarkDesktop/* decorations/Patagonie/Default/
$ sudo cp decorations/Aqua/Buttons\ with\ icons/button-violet-icon.png decorations/Patagonie/Default/window-active-sticky.png
$ sudo cp decorations/Aqua/Buttons\ with\ icons/button-gray-violet.png decorations/Patagonie/Default/window-inactive-sticky.png
$ sudo cp decorations/Aqua/Buttons\ with\ icons/button-green-icon.png decorations/Patagonie/Default/window-active-maximizepng
$ sudo cp decorations/Aqua/Buttons\ with\ icons/button-gray-green.png decorations/Patagonie/Default/window-inactive-maximize.png
$ sudo cp decorations/Aqua/Buttons\ with\ icons/button-red-icon.png decorations/Patagonie/Default/window-active-close.png
$ sudo cp decorations/Aqua/Buttons\ with\ icons/button-gray-red.png decorations/Patagonie/Default/window-inactive-close.png

puis à adapter le contenu du fichier Theme.fvwm-crystal :

# FVWM-Crystal version

# Setup colorsets
Read $./Colorsets

DestroyDecor recreate WindowDecoration
AddToDecor WindowDecoration

+ TitleStyle InActive Colorset $[cs-window-inactive]
+ TitleStyle Active Colorset $[cs-window-active]
+ TitleStyle LeftJustified
+ TitleStyle -- flat
+ TitleStyle Height 20

+ BorderStyle -- HiddenHandles
+ BorderStyle -- Flat

+ ButtonStyle 1 MiniIcon

+ ButtonStyle 2 Active Pixmap $./window-active-close.png
+ ButtonStyle 2 Inactive Pixmap $./window-inactive-close.png

+ ButtonStyle 4 Active Pixmap $./window-active-stiky.png
+ ButtonStyle 4 Inactive Pixmap $./window-inactive-stiky.png

+ ButtonStyle All -- UseTitleStyle
+ ButtonStyle All -- flat

Style * HandleWidth 1, BorderWidth 1
Style * Colorset $[cs-window-inactive], \
BorderColorset $[cs-window-inactive], \
HilightColorset $[cs-window-active], \
HilightBorderColorset $[cs-window-active]

Style * Font "xft:Verdana:pixelsize=12:Bold"

Style * UseDecor WindowDecoration

# Setup button functions
Include components/decorations/Buttons-Patagonie-fvwm-crystal

ainsi que les autres thèmes que nous ne verrons pas ici. Reste à définir le comportement des boutons lors du clic de la souris avec le fichier components/decorations/Buttons-Patagonie-fvwm-crystal :

# FVWM-Crystal Button Setup for the Patagonie theme
# Written by Miguel Moquillon <miguel.moquillon@free.fr>
#
# This is a FVWM-Crystal window button setup with a sticky, a maximize and
# an iconification buttons without menu displaying with the mouse hold.


# MiniIcon as the First button - iconify
Mouse 1 1 $[Mod] Window-Iconify
Mouse 2 1 $[Mod] Window-Iconify
Mouse 3 1 $[Mod] Window-Iconify
Style * Button 1

# Second button - close
Mouse 1 2 $[Mod] Close
Mouse 2 2 $[Mod] Window-Button-Function Button2 /Window-Menu-Close Close
Mouse 3 2 $[Mod] Window-Button-Function Button2 /Window-Menu-Close Close
Style * Button 2

# No third button
Style * NoButton 3

# 4th button - Maximize
Mouse 1 4 $[Mod] Maximize
Mouse 2 4 $[Mod] Window-Button-Function Button4 /Window-Menu-Maximize Maximize
Mouse 3 4 $[Mod] Window-Button-Function Button4 /Window-Menu-Maximize Maximize
Style * Button 4

# No fifth buttons
Style * NoButton 5

# 6th button - Sticky
Mouse 1 6 $[Mod] Stick
Mouse 2 6 $[Mod] Window-Button-Function Button6 /Window-Menu-Layer Stick
Mouse 3 6 $[Mod] Window-Button-Function Button6 /Window-Menu-Layer Stick
Style * Button 6

# No more buttons
Style * NoButton 7
Style * NoButton 8
Style * NoButton 9
Style * NoButton 0

# vim:ft=fvwm

Notre style de décoration est maintenant fini, il ne reste plus qu'à le choisir, avec notre précédente recette, pour l'apprécier et, avec l'évolution des besoins, l'adapter. Bien sûr, nous aurions pu aussi adapter la recette existante et surcharger ou rajouter des paramètres dans la configuration utilisateur.

Vous trouverez la recette et le nouveau style de décorations dans l'archive patagonie.tgz

4. Configuration

La configuration de FVWM au niveau utilisateur est située dans le répertoire ${HOME}/.fvwm/. En générale, sa configuration est centralisée dans un unique fichier, .fvwm2rc. La configuration de FVWM-Crystal est quant à lui placé dans ${HOME}/.fvwm-crystal/. Toute surcharge des paramètres de configuration de l'environnement graphique est réalisée dans des fichiers de configuration dont le nom et l'emplacement doivent respecter les conventions de FVWM-Crystal. Ainsi, par exemple, les préférences par défaut sont définies dans des fichiers FVWM dans /usr/local/share/fvwm-crystal/fvwm/preferences/. Pour les surcharger, les préférences de l'utilisateur seront définies dans des fichiers de même nom dans ${HOME}/.fvwm-crystal/preferences/.

Les préférences de l'utilisateur (choix de la recette, des décorations des fenêtres, du jeu de couleurs, du papier peint, etc.) sont définies dans le répertoire ${HOME}/.fvwm-crystal/preferences/ et sa sélection se fait au travers du menu principal de FVWM-Crystal. L'utilisateur n'a donc pas à modifier à la main ses fichiers de préférences.

Par contre, pour raffiner et rajouter les applications à apparaître dans le menu «Applications», surcharger certains paramètres de configuration, rajouter des papiers peint, ou démarrer des applications au démarrage de l'environnement graphique, l'utilisateur doit le faire manuellement.

4.1. La base des applications

La base globale des applications est définies dans /usr/local/share/fvwm-crystal/fvwm/Applications/ (voir 3.1. Ajouter une application). FVWM-Crystal construit en fait sa base à partir de la fusion de /usr/local/share/fvwm-crystal/fvwm/Applications/ avec ${HOME}/.fvwm-crystal/Applications/, avec prédominance de ce dernier : si une même entrée est définie dans les deux bases, c'est celle déclarée dans la base de l'utilisateur qui est prise en compte. Ainsi, si dans la base globale, l'application GCompris est définie avec une priorité 20 (20~gcompris~GCompris), et que dans la base de l'utilisateur la même entrée existe avec une priorité 10 (10~gcompris~GCompris), c'est cette dernière qui sera prise en compte.

Pour rajouter une application dans sa base locale, il suffit juste de suivre les mêmes conventions que celles relatives à la base globale (voir la la section correspondante).

4.2. Les paramètres utilisateurs

Les paramètres de l'utilisateur sont déclarés dans le fichier ${HOME}/.fvwm-crystal/userconfig. Dedans peuvent être surchargés certaines configurations comme par exemple la politique de positionnement d'une nouvelle fenêtre, l'application à lancer au clic droit de la souris, etc.

Par exemple, pour personnaliser certains paramètres d'un environnement graphique sans avoir à écrire une nouvelle recette, ils peuvent être directement définis dans ce fichier. FVWM-Crystal, au démarrage, charge les paramètres globaux, puis ceux référencés par les préférences de l'utilisateur dans ${HOME}/.fvwm-crystal/preferences/, puis enfin charge les paramètres dans ${HOME}/.fvwm-crystal/userconfig. Les paramètres définis donc dans ce fichier ont prédominance sur tout le reste.

Par exemple, avec la recette «Clean», l'horloge, le lancement d'Apwal au clic droit de la souris, et l'affichage du menu avec la touche Menu du clavier peuvent être déclarés dans le fichier userconfig :

# Clock FVWM module
All (FvwmButtons-Clock) Close
DestroyModuleConfig FvwmButtons-Clock: *
*FvwmButtons-Clock: Geometry -40-40
*FvwmButtons-Clock: BoxSize smart
*FvwmButtons-Clock: ActiveColorset $[cs-panel-active]
*FvwmButtons-Clock: Colorset $[cs-panel-inactive]
*FvwmButtons-Clock: Columns 2
*FvwmButtons-Clock: Padding 2 2
*FvwmButtons-Clock: Frame 0
*FvwmButtons-Clock: (2x1, Size 60 24, \
Swallow (Close, Respawn, FvwmModule) "FvwmScript-Clock" 'Script components/scripts/FvwmScript-Clock', \
Action (Mouse 3) SendToModule *FvwmScript-Clock SendString 1 1 str)

Module FvwmButtons FvwmButtons-Clock

# Launch apwal on RMB
DestroyFunc FvwmApwal
AddToFunc FvwmApwal
+ I Exec exec apwal

Mouse 3 RI $[Mod] FvwmApwal

# Display the menu
Key Menu A $[Mod0] Menu /FVWM-Crystal root c c

Ainsi, avec le fichier de configuration userconfig, l'utilisateur a une grande latitude dans l'adaptation des paramètres d'un environnement graphique à ses souhaits.

4.3. Ajouter des papiers peints

Il peut être intéressant d'afficher d'autres papiers peints ou fond d'écrans dans son environnement graphique. Le choix d'un papier peint se fait via le menu. Par défaut, FVWM-Crystal charge le contenu des répertoires /usr/local/share/fvwm-crystal/fvwm/wallpapers/, /usr/share/wallpapers/, et ${HOME}/.fvwm-crystal/wallpapers/. Il suffit donc juste de rajouter nos papiers peints dans ce dernier répertoire, puis de les choisir via le menu, et ceci quelque soit la recette.

4.4. Lancer des applications au démarrage

Chaque utilisateur peuvent spécifier quelles applications doivent être lancées au démarrage de FVWM-Crystal. Ceci s'effectue via le fichier FVWM ${HOME}/.fvwm-crystal/preferences/Startup. Par exemple, pour exécuter au démarrage les programmes Conky et GDeskCal, ainsi que le démon gnome-settings pour les applications GNOME, il suffit de rajouter les lignes suivantes :

#Launch conky
+ I Test (x conky) Exec pidof conky || exec conky

# Launch gnome-settings-daemon
+ I Test (x gnome-settings-daemon) exec gnome-settings-daemon

# A calendar on the desktop
+ I Test (x gdeskcal) X gdeskcal

Dans ce fichier, «I» signifie que ce qui suit doit s'exécuter immédiatement (I pour immédiat), «Test» permet de tester que l'exécutable existe (il est indiqué entre parenthèses) avec «x» pour préciser que c'est un programme X. Ensuite, le programme est lancé s'il ne l'est pas déjà. (C'est la partie avec Exec pidof qui vérifie si le programme est ou non déjà lancé.)

Pour avoir plus d'information sur ce fichier, vous pouvez regarder son correspondant dans /usr/local/share/fvwm-crystal/fvwm/preferences/Startup.


Valid XHTML 1.0! Valid CSS!
Me contacter