Initiation aux X-Ressources

Retour a la page principale


  1. Introduction
  2. A propos de la programmation orientee objet
    1. Les Widgets
    2. Classes et Instances
  3. Les Ressources
    1. Definition
    2. Utilisation
    3. Un exemple pratique




1. Introduction

Comme vous l'avez sans doute remarque, l'aspect graphique des applications sous X11 est plus que fortement personnalisable.Nous allons maintenant etudier le mecanisme des ressources, qui vous permettra de modeller votre interface comme vous le souhaitez. Toutefois, avant d'entrer dans le vif du sujet, nous ferons un peu de theorie pour rappeler la notion fondamentale de la programmarion orientee objet.

2. La programmation orientee objet

La programmation orientee objet repose sur une idee simple: un logiciel se compose d'elements independants, dont chacun mene sa propre existence independante des autres. Un objet peut etre un fichier, une fenetre, une application...Cette methode est utilisee de maniere intensive sous X-Window par le X Toolkit, la bibliotheque de gestion de Widgets.

A. Les Widgets

Le mot Widget est l'acronyme de Window Gadget et designe tout element gere par le X Toolkit. Chaque widget a un comportement propre et autonome et son role est principalement de reagir aux messages que le serveur X lui transmet. Des exemples classiques de Widgets sont les boutons qui appellent une fonction du programme lorsqu'on clique dessus, les champs de saisie de texte qui modifient une chaine de caracteres lorsqu'on les edite etc... Il existe egalement des Widgets plus evolues comme un widget navigateur HTML ou un widget MPEG-Player...
Il faut retenir deux choses a propos des Widgets. Premierement, les Widgets utilises par une application sont organises selon une arborescence. Exemple:



Il en resulte que tout comme un fichier, un Widget possede un chemin d'acces.
La deuxieme notion importante est qu'un Widget est un objet et en tant que tel, il est l'instance d'une classe. Si c'est du chinois poour vous, lisez la section suivante.

B. Classes et Instances

Une etude des fondements philosophiques de la programmation orientee objet est hors du cadre de cet article. La seule chose qu'il vous faut savoir ici est que chaque objet est cree d'apres une definition de ses proprietes: dans le vocabulaire de la POO, on appelle cette definition une classe. Lorsqu'un objet possede les caracteristiques specifiees dans la classe, on dit qu'il est une instance de cette classe. Par exemple on peut dire que le mot Windoze est instance de la classe "chaine de caracteres" et que Medor est une instance de la classe "chien".
Voila, c'est aussi bete que ca.Dans la figure ci-dessus, les quatre menus deroulants sont chacun une instance de la classe "menu deroulant" et les icones sont... bon, vous avez compris. Sachez que si cette maniere de voir la programmation vous seduit, vous avez sous Linux de quoi pratiquer le Smalltalk, l'Eiffel, le C++, l'Objective-C et le Java, qui representent differentes ecoles de la POO.

3. Les ressources

Nous y voila. Maintenant que vous savez tout ce qu'il faut savoir, vous etes pret(e) pour la Grande Revelation. Dans les applications proprement programmees, certains parametres des Widgets ne sont pas stockes "en dur" dans le programme, mais dans des champs accessibles de l'exterieur: les ressources.
Une ressource est donc un champ d'un Widget, defini par son chemin d'acces.

A. Definition

Une ressource est donne par le chemin d'acces d'un Widget et un champ de ce Widget. Les differentes parties sont separees par le caractere . comme par exemple dans
ghostview.form.fileButton.menu.background, qui correspond a la couleur de fond (champ background) du menu deroulant (Widget menu) du bouton File (Widget fileButton) dans le formulaire (Widget form) du programme ghostview (Widget ghostview).
Les ressources presentent une subtilite de la plus haute importance: a votre avis, quelle est la difference entre ghostview.form.fileButton.menu.background et Ghostview.form.fileButton.menu.background? Lorsqu'une partie du chemin commence par une majuscule, cela signifie qu'elle donne non pas un Widget, mais une classe et par consequent cette ressource accede a la couleur de fond du menu fichier dans toutes les applications de la classe Ghostview. Si vous renommez ghostview en toto, le premier exemple se transformerait en toto.form.fileButton.menu.background tandis que le second est toujours valable, car ghostview et toto sont de la meme classe.
D'accord, c'est un exemple tordu mais considerez ceci: les boutons qui deroulent les menus dans la bibliotheque XAW sont de classe MenuButton, aussi, avec ghostview.form.MenuButton.menu.background, on peut declarer d'un seul coup la couleur de fond de tous les menus deroulants du formulaire principal de ghostview. Ca commence a devenir puissant, non?
Afin de garantir une flexibilite maximale, le systeme nous autorise en plus a utiliser le caractere * comme separateur a la place de .. Lorsqu'on ecrit a*b au lieu de a.b, cela signifie qu'entre les Widgets a et b peut se trouver n'importe quelle chaine de widgets ou de classes. Ainsi, si on sait que les menus deroulants de XAW sont de classe SimpleMenu, on peut ecrire Ghostview*SimpleMenu.background pour acceder a la couleur de fond de tous les menus de tous les programmes de classe Ghostview. Et comme l'etoile peut apparaitre n'importe ou, on peut simplement ecrire *Scrollbar.shadowWidth pour designer l'epaisseur de l'ombrage de tous les ascenceurs de toutes les applications!

B. Utilisation
La, vous vous dites "il commence a m'enerver avec ses exemples, je ne sais toujours pas comment mettre ca en pratique!" Du calme, on y arrive.
La localisation des specifications des ressources est un vaste probleme. Autrefois, elles etaient enregistrees dans des fichiers situes un peu partout et il fallait se souvenir ou et quand seront elles lues, avec bien sur un ordre de precedence sur les repertoires, bref c'etait l'horreur. Non seulement c'etait lourd, mais si vous travaillez sur divers terminaux, vous pouvez preferer une configuration differente pour chacun d'eux, et pour y arriver, il fallait jongler avec les liens, deplacer les fichiers et au bout du compte, il vallait mieux s'abstenir. Fort heureusement, tout ca a ete remplace par quelque chose de bien plus elegant: les ressources sont stockees dans une base de donnees integree directement au serveur X. Il est ainsi possible de les modifier avec souplesse et, comme chaque station execute un serveur X independant, vous pouvez avoir une configuration adaptee par terminal.
Grace a l'utilitaire xrdb, vous pouvez maintenant commencer a jouer avec les ressources. xrdb est assez riche (cf. son man) mais deux fontions vous suffiront, du moins au debut:
xrdb -query vous liste le contenu de la base des ressources (par defaut celle du serveur que vous etes en train d'utiliser) et xrdb -load fichier charge le fichier dans la base. Le fichier doit comporter des lignes de la forme ressource: valeur.
Vous avez certainement dans votre repertoire un fichier .Xdefaults ou .Xressources, qui contient des ressources par defaut (regarez-le, c'est instructif.) Le script d'initialisation de X11 contient la ligne xrdb -load $(HOME)/.Xdefaults, ainsi, les ressources dans ce fichier sont chargees automatiquement chaque fois que vous ouvrez une session X.

C. Un exemple, un exemple!
Pour illustrer tout ceci, nous allons faire ensemble une manip simple: personnaliser la petite fenetre de xman. Lorsque je le lance j'obtiens ceci: (j'utilise XAW3D)

Pas terrible, hein? Alors au travail. Sortez un editeur de texte et creez un fichier appele par exemple xman.res.J'espere que vous me croyez sur parole, cette petite boite de dialogue a pour chemin d'acces xman.topBox.form. La premiere chose a faire est de changer la couleur de fond, on va la passer en noir. tapez sur la premiere ligne:
xman.topBox.form*background: black
Remarquez le *: on met le fond de tous les Widgets de cette boite en noir, si bien que si vous faites xrdb -load xman.res maintenant et vous lancez xman, vous aurez une fenetre en noir su fond noir.
La chaine Manual Browser (Widget topLabel) ne m'enchante guere: je veux avoir SOS Help! a la place, dans une police plus jolie et en jaune:
xman.topBox.form.topLabel.font: -*-times-*-*-*-*-14-*-*-*-*-*-*-*
xman.topBox.form.topLabel.foreground: yellow
xman.topBox.form.topLabel.label: SOS Help!
xrdb utilise le preprocesseur C, on peut donc utiliser des macrocommandes predefinies, comme la couleur "yellow"
On contienu avec les boutons qui sont de la classe Command: nous allons les faire metalliques, rectangulaires et avec un pettit effet d'ombre:
xman.topBox.form.Command.shapeStyle: Rectangle
xman.topBox.form.Command.background: lightgrey
xman.topBox.form.Command.shadowWidth: 2
xman.topBox.form.Command*font: -*-helvetica-*-r-*-*-12-*-*-*-*-*-*-*
Enfin, je veux afficher Quit en rouge, pour ne pas le confondre:
xman.topBox.form.quitButton*foreground: red

Maintenant, sauvez le fichier et tapez xrdb -load xman.res puis lancez xman. Et vous pouvez admirer votre oeuvre:


Ce n'est peut etre pas du meilleur gout, mais au moins c'est pedagogique!

Voila, a vous de jouer. Si vous avez des problemes, n'hesitez pas a m'envoyer un mail!

Jak'Zimm'