Vous avez vu dans les précedents articles sur les ressources du système X-Window qu'on pouvait très facilement paramètrer la plupart des applications prévues pour ce système. Mais si nous savons comment spécifier des ressources dans un fichier texte ou via editres, nous ne savons pas encore comment associer automatiquement des ressources à tel ou tel programme.
Par exemple, en changeant avec editres la couleur du fond de Xman du blanc vers le bleu, si on éteint l'ordinateur et qu'on relance Xman, il redeviendra blanc et il faudra renouveler l'opération, ce qui n'est pas vraiment souhaitable.
X prévoit tout un système (quelque peu complexe) de répertoires par défaut ou définissables via des variables d'environnement pour aller chercher des fichiers de spécification de ressources associées à a des programmes ou à tout l'environnement.
Un programme utilisant des ressources X va tenter de récupérer les ressources associées à sa classe (voir les précédents articles) dans cinq fichiers différents :
Si les memes ressources sont spécifiées dans tous ces fichiers, c'est la dernière définition qui est utilisée. Ainsi, le fichier de spécification par défaut de l'application est le moins prioritaire et la ligne de commande permet de passer outre toutes les autres définitions (priorité maximale).
Note : tout ce qui suit est valide à partir de X11R5.
Pour localiser les différents fichiers de spécifications de ressources, le X Resource Manager utilise un algorithme de substitution assez complexe.
Voici un exemple de chemin de recherche d'un fichier de ressource :
/usr/lib/X11/%L/%T/%N%S:/usr/lib/X11/%l/%T/%N%S:/usr/lib/X11/%T/%N%S
Les deux-points séparent les différents chemins (ou paths) possibles. La définition de chaque chemin est proche de la définition habituelle d'un chemin à une exception près : les lettres précédées d'un symbole % comme %L. Ces expressions sont des variables de substitutions qui peuvent etre remplacées par un ensemble de chaines de caractères. La lettre qui suit le % donne la catégorie de substitution. Lorsque le resource manager tente de récuperer un fichier, il remplace les variables de substitutions par les chaines de caractères associées (selon un ordre précis). Si un fichier est trouvé dans un path donné, il est chargé et on passe à la catégorie suivante de fichier.
Voici les différents types de substitutions possibles :
|
Variable de substitution |
Type de substitution |
Chaines substituées successivement |
|
%T |
Type de fichier |
|
|
%L |
Langage utilisé |
|
|
%N |
Nom du fichier |
|
|
%S |
Suffixe du fichier |
|
|
%C |
Type d'affichage (monochrome, couleur) |
|
|
%t, %l, %c |
Idem mais en utilisant la ressource xnlLanguage |
|
Les deux premières catégories utilisent ces substitutions, elles permettent d'associer un fichier de ressource à une application donnée pour chaque utilisateur (c'est très intéressant dans un environement multi-utilisateurs). Ces substitutions ont l'air complexes mais vous allez voir qu'en général, on utilise les paths par défaut et que c'est amplement suffisant, sauf dans le cas d'un système multi-utilisateur sur lequel des utilisateurs de pays et de langues différents travaillent sur des écrans soit monochromes soit couleurs.
Pour la substitution %C, d'autres valeurs sont désormais possibles avec X11R6 et X11R6.1, en particulier, il doit etre possible de spécifier des fichiers pour les affichages en 256, 65536 ou 16,7 millions de couleurs mais cette information reste à confirmer. Ceci ne concerne que les spécifications par défaut pour les utilisateurs.
Ce fichier est le plus utilisé lorsqu'il s'agit d'associer des ressources à une application donnée. Pour récupérer ce fichier, le système commence par récupérer la valeur de la variable d'environnement XFILESEARCHPATH. Si cette variable n'est pas définie, la valeur utilisée par défaut est :
/usr/lib/X11/%L/%T/%N%S:/usr/lib/X11/%l/%T/%N%S:/usr/lib/X11/%T/%N%S
La première recherche se fait dans les répertoire associés à une langue donnée (correspondant à la variable d'environnement LANG), puis dans des répertoires associés au langage spécifié dans xnlLanguage puis dans les répertoires correspondants aux types de fichiers. Chaque nom de fichier est associé à un suffixe pour le type d'affichage.
Exemple :Supposons que vous lanciez le programme xman sur un système multi-utilisateur avec affichage couleur. La variable LANG a pour valeur french pour vous, c'est un fichier .dat. Le nom de classe de xman est Xman. Les substitutions qui seront faites seront donc : %L -> FRENCH %T -> app-default %N -> Xman %S -> .dat et votre fichier sera dans : /usr/lib/X11/FRENCH/app-default/Xman.dat |
Ceci peut sembler un peu complexe mais sachez que sur la plupart des systèmes, la variable LANG n'est pas définie, la ressource xnlLanguage non plus et le suffixe est vide donc les fichiers se trouveront en général tous dans :
/usr/lib/X11/app-default/
Et auront pour nom le nom de la classe de l'application.
Exemple :Le fichier de ressources par défaut de xman se trouve dans : /usr/lib/X11/app-default/Xman Chaque définition de ressource dans ce fichier est associé à la classe Xman qui représente tous les processus xman que vous lancerez. Si vous spécifiez : *bacground : Blue Tous les fonds des fenetres des processus xman seront bleus. |

Pour modifier ce type de fichier, il faut etre root et faire bien attention car certaines ressources peuvent modifier le comportement du programme.
Dans la pratique, chaque programme X est fourni avec un fichier de ressource par defaut qui est installé dans /usr/lib/X11/app-default et l'utilisateur ne modifie jamais ce fichier. Il vaut mieux, en effet, rajouter des spécifications de ressources dans les autres catégories de fichier.
Nous avons vu que le fichier de configuration par défaut était rarement modifié par l'utilisateur. Pour spécifier de nouvelles ressources, on peut créer un fichier de configuration de ressources utilisateur.
Le chemin d'accès à ce type de fichier est défini dans la variable d'environnement XUSERFILESEARCHPATH. Son role est le meme que XFILESEARCHPATH mais pour les fichiers utilisateurs. Si cette ressource n'est pas définie, voici les chemins d'accès par défaut (accrochez-vous bien !) :
$XAPPLRESDIR/%L/%N%C:
$XAPPLRESDIR/%l/%N%C:
$XAPPLRESDIR/%N%C:
$HOME/%N%C:
$XAPPLRESDIR/$L/%N:
$XAPPLRESDIR/$l/%N:
$XAPPLRESDIR/%N:
$HOME/%N
Cette définition est complexe avec l'introduction de la substitution %C sur le type d'affichage.
La variable XAPPLRESDIR doit contenir un chemin d'accès à vos fichiers de ressources utiisateurs comme $HOME/XRessources. Si cette variable n'est pas définie, le chemin d'accès démarre depuis $HOME, c'est à drire votre répertoire par défaut.
Exemple :Supposons que votre variable XAPPLRESDIR vale $HOME/XRessources. Votre répertoire par défaut est /home/toto (donc $HOME vaut /home/toto). Il n'y a pas d'information de language, de type d'affichage, ou de ressource xnlLanguage. Vous voulez spécifier des ressources supplémentaires pour le programme xcalc mais qui ne s'appliqueront qu'aux processus xcalc que vous lancerez en tant que simple utilisateur avec votre compte habituel. La ressource que vous voulez ajouter est *Command.justify : Right pour que les textes des boutons soient justifiés à droite (centre par défaut) Note : chaque bouton de xcalc porte le nom de classe "Command" Le nom de classe de xcalc est XCalc, vous devrez donc créer le fichier : /home/toto/XRessources/XCalc qui contiendra : *Command.justify : Rightle tour est joué ;-) |

En fait, on utilise ce type de spécification pour spécifier des ressources utilisateurs qui pourront varier suivant le type d'affichage ou le language mais qui ne devront s'appliquer qu'à un utilisateur.
Le plus pratique concerne le type d'affichage suivant le nombre de couleurs mais dans la plupart des cas, on utilisera la méthode qui suit pour spécifier des ressources utilisateurs.
Il existe un fichier dans votre répertoire par défaut $HOME qui permet de spécifier des ressources pour vos programmes X. Ce fichier se nomme en général .Xdefaults (on trouve parfois .Xsession) et contient des ressources globales.
On peut donc spécifier des ressources concernant toutes les applications, comme :
*background : Blue
pour mettre par défaut tous les fonds des applications en bleu (décidément, j'aime bien cette couleur).
Pour spécifier une ressource associée à une application donnée, on utilise encore une fois le nom de classe.
Exemple :Vous voulez spécifier encore une fois que xman aura un fond bleu et xcalc des textes en rouge, vous ajouterez dans votre .Xdefault : Xman*background : Blue XCalc*Foreground : Red |
Les ressources spécifiées dans le .Xdefaults sont placées dans une zone mémoire appelée la propriété RESOURCE_MANAGER et cette propriété est associée à la fenetre racine de votre système X (root window).
Le fichier .Xdefault est chargé au lancement de X, il faut donc relancer le serveur X pour prendre en compte les modifications, ce n'est pas pratique.
Heureusement, on peut changer manuellement la propriété RESOURCE_MANAGER en utilisant le programme xrdb (déjà vu).
On peut utiliser :
xrdb ~/.Xdefaults
pour prendre en compte les modifications mais on peut aussi créer un fichier supplémentaire et ajouter les ressources placées dans ce fichier sans écraser les ressources déjà présentes avec :
xrdb -merge nom_du_fichier
Ceci place les nouvelles ressources à la suite de la dernière ressource présente (et c'est la dernière ressource présente qui est utilisée).
L'option -override permet de remplacer les ressources redéfinies avec les nouvelles valeurs (on gagne de la place mémoire mais le comportement est parfois étrange).
Cette méthode pour rajouter des ressources utilisateur est pratique et simple mais il faut prendre en compte deux remarques :
Mais n'oublions pas que le fichier .Xdefaults est le seul à pouvoir contenir des ressources qui seront appliquées à tous les programmes sans distinction de classe.
On peut aussi spécifier un nom de fichier pour la machine qui fait tourner le système (host) avec la variable d'environnement XENVIRONMENT. Si cette variable n'est pas définie, le système cherche un fichier .Xdefaults-host ou host représente le nom du serveur. En général, ce fichier n'existe pas, XENVIRONMENT n'est pas définie et on utilise le fichier .Xdefaults.
La dernière méthode pour spécifier des ressources est la plus prioritaire. On peut (si l'application X est bien programmée) passer des ressources directement sur la ligne de commande du programme. Il y a des paramètres par défaut comme -background, -foreground, -name, etc. Mais on peut aussi utiliser la notation traditionnelle des ressources avec l'option -xrm. Après cette option, on indique une chaine de caractère correspondant à la ressource que l'on veut préciser.
Exemple :On veut lancer xedit avec la couleur bleu foncé en fond, le texte jaune (vive les amstrad CPC !) et utiliser une taille de 400 en largeur. Une des nombreuses méthodes possibles est la suivante : xedit -xrm "*background : Dark Blue" -xrm "*foreground : Yellow" |

Les options principales de la ligne de commande sont :
| Option | Effet | Exemple |
| -background | change les couleur de fond (*background) | -background Blue |
| -foreground | couleurs d'avant plan (texte) | -foreground Yellow |
| -bordercolor | couelurs de bord | -bordercolor Red |
| -borderwidth | largeur du bord en pixel (par défaut) | -borderwith 4 |
| -display | display pour l'affichage | -display :0.0 |
| -font | police pour les textes (*font) | -font 6x13 |
| -geometry | géometrie du programme | -geometry =80x50 |
| -iconic | démarrer sous forme d'icone | -iconic |
| -title | titre du programme | -title "Fred Botton est bete" |
| -reverse | Inverse Video | -reverse pour "ON"
+reverse pour "OFF" |
| -xrm | Spécification d'une ressource quelconque | -xrm "*background : Blue" |
Vous devez vous demander comment trouver le nom de classe d'une application et vous avez raison car ce n'est pas si simple. Il faut savoir que ce nom est donné pour le programmeur lorsqu'il crée l'application et il serait un peu ennuyeux de devoir aller regarder dans les sources des programmes pour trouver ce nom (surtout si c'est un logiciel commercial !). Vous pouvez dans un premier temps aller dans /usr/lib/X11/app-defaults et regarder les différents fichiers présents, vous trouverez surement le fichier qui correspond à l'application que vous voulez personnaliser. Le nom de classe est en effet très proche du nom du programme (Xedit pour xedit, XCalc pour xcalc) mais il peut y avoir des exceptions.
Une autre méthode est d'utiliser editres, mais il faut que l'application soit compatible avec le protocole d'editres (c'est en général le cas pour les applications qui permettent la spécification de ressources). Vous devez d'abord lancer votre application, puis editres, sélectionner le widget racine, en sélectionnant l'option "Show Class Names" ou en cliquant sur le bouton droite, on récupère le nom de classe de l'application.
Exemple :Récupérons le nom de classe de l'application xedit. Il faut tout d'abord lancer xedit puis editres. On sélectionne ensuite Get Tree dans editres puis on clique dans la fenetre de xedit et on voit apparaitre l'arborescence des widges de xedit. Le widget racine (racine de l'arbre donc à gauche dans la fenetre) porte le nom du widget, soit "xedit". Sélectionez ce widget en cliquant dessus avec le bouton de gauche de la souris. En cliquant sur le bouton de droite de la souris ou en sélectionnant l'option "Show Class Names" du menu "Tree", vous verrez le mot "Xedit", c'est le nom de classe de l'application xedit. |

La gestion des ressources X est assez complexe lorsque l'on veut exploiter toutes les possibilités offertes mais si on se contente de quelques caractéristiques, on peut rapidement et facilement personnaliser son système.
Le seul problème réside dans les programmes qui ne s'intègrent pas efficacement dans le système X-Window et qui proposent des fichiers de configuration propriétaires ou qui ne sont pas configurables du tout. Toutes les applications basées sur le X-Toolkit sont configurables via les ressources (sauf si le programmeur ne connait pas les quelques instructions à utiliser), ce sont les outils les plus nombreux donc vous avez du pain sur la planche pour réaliser le système de vos reves ;-)