Initiation aux X-Ressources 
Retour a la page principale
- Introduction
- A propos de la programmation orientee objet
- Les Widgets
- Classes et Instances
- Les Ressources
- Definition
- Utilisation
- 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'