I. X Window - une introduction▲
I-A. X11 : Concept et architecture▲
Le package logiciel X-Window (appelé couramment X) est un système permettant aux programmeurs de développer des applications graphiques portables et distribuées. Cette section introduit le concept de X ainsi que ses principaux avantages et inconvénients.
I-A-1. Qu'est-ce que X ?▲
X a été défini pour répondre à ces caractéristiques :
- indépendant vis-à-vis du matériel ;
- le système est transparent à travers le réseau ;
- plusieurs applications doivent pouvoir tourner en même temps ;
- « Policy-less » : on peut implémenter tout style d'interaction ;
- hiérarchie de fenêtres retaillables ;
- fenêtres recouvrables, gestion des parties cachées ;
- une application peut ouvrir N fenêtres, pas forcément sur la même machine ;
- haute performance pour le texte, le graphique et les images ;
- extensibilité.
Le système X-Window permet de distribuer les informations graphiques. Les résultats graphiques calculés par une machine distante peuvent être visualisés sur une machine locale. Un programme peut ainsi envoyer ses résultats graphiques sur une autre station et récupérer les événements des périphériques d'interface tels que le clavier et la souris de la station distante.
La machine locale est par exemple une station de travail (SGI, HP, Sun…), un Macintosh, un PC ou un terminal X.
La machine distante est le plus souvent une machine plus puissante sur laquelle le programme est exécuté (VAX, CRAY, machine parallèle) :
Il existe donc un moyen pour coder toutes les opérations graphiques ainsi que l'interactivité avec des périphériques, pour pouvoir les échanger entre les machines. Ces informations passent par un protocole et ensuite par un médium tel que le réseau.
I-A-2. Commandes graphiques▲
Le concept le plus fondamental de X est celui des commandes graphiques qui sont diffusées selon le modèle client-serveur.
Tout ceci prend un sens dans le contexte du réseau. On veut pouvoir bénéficier de l'interface graphique d'un programme s'exécutant à distance.
À l'époque des terminaux « textes » (VT100), le rafraîchissement d'un écran coûtait peu : 24 lignes par 80 colonnes avec un caractère codé sur un octet, soit à peu près 2000 octets par écran. Si l'on veut passer en mode graphique, la définition doit être supérieure. Pour un terminal graphique disposant d'une résolution 640 par 480 pixels, un octet codant ici la couleur du pixel, on obtient 307 200 octets. Plutôt que d'envoyer toutes les informations graphiques de l'écran, X propose d'envoyer uniquement la commande graphique (trace de ligne, affichage de texte…) et de le faire effectuer par la machine distante (console).
L'accès à la carte graphique sur la console est complètement encapsulé par X11. On ne peut pas aller modifier le frame-buffer du display sans passer par X11 (il y a des exceptions, nous y reviendrons).
On distingue donc deux notions essentielles : le CPU, qui exécute le code du programme et ce que l'on appelle un « display ».
Un display (voir Fig.2) est composé d'un processeur capable d'effectuer les commandes graphiques (ce processeur peut être dédié - c'est le cas d'un terminal - ou générique - celui de la station de travail), d'un clavier, d'une souris et un ou plusieurs couples carte graphique/moniteur.
La modification du frame-buffer du display est effectuée en local sur ordre de la machine distante.
I-A-3. Pourquoi pas X ?▲
Bien que X soit implémenté de manière efficace, le concept même de l'encodage des commandes graphiques dans un protocole est assez lourd. Le deuxième inconvénient consiste en sa généricité. Les commandes graphiques ne doivent pas intégrer des optimisations spécifiques au matériel pour pouvoir être portées sur toutes les machines (certaines optimisations existent, nous y reviendrons).
Ces deux inconvénients entraînent pour les machines un surcoût en temps machine et en mémoire. X n'était donc pas destiné en priorité aux micros. Mais il était en fait seulement en avance. Les micros d'aujourd'hui le supportent facilement. Une configuration minimale se situe vers 8 mégas de RAM et 20-100 mégas d'espace disque.
I-A-4. Historique de X▲
En 1984, le Massachusetts Institute of Technology (MIT) démarre le projet Athena. Le but était de prendre tout l'assortiment des kits graphiques de plusieurs constructeurs (évidemment incompatibles) et de développer un réseau de stations pouvant servir au téléenseignement. Le MIT voulait créer un environnement graphique totalement indépendant du matériel.
En 1986, les constructeurs ont commencé à contribuer au développement de X. En 1988, le MIT officialise la version 11 release 2. La plus récente des versions est la version 6 (les versions 4 et 5 sont les plus répandues).
Les constructeurs BULL,DEC, HP, IBM et SUN sont réunis en consortium pour soutenir le MIT. Le consortium gère l'évolution de X et garantit sa pérennité.
Des informations sur le consortium X sont disponibles sur le site : http://www.x.org/ftp/pub/DOCS/XConsortium.
Actuellement, X a confirmé son succès : de nombreuses stations de travail Unix le proposent en standard et il est disponible sur les micros tels que Mac, PC, Amiga…
I-A-5. Culture générale▲
Le succès de X est dû à UN homme : Robert Scheifler du MIT. Il a su définir clairement les objectifs de X et les maintenir. Il a créé une philosophie de distribution (gratuité, source fournie).
La politique d'ouverture d'X11, grandement favorisée par le succès d'Internet, a créé un énorme précédent : le choix unanime de toute la profession sur une technologie « domaine public ». Le paysage informatique en a été entièrement bouleversé, créant la mode des systèmes ouverts.
I-A-5-a. Distribution▲
X11 est un package logiciel totalement gratuit, mais copyrighté. Il est disponible à ftp://lcs.export.mit.edu [ftp://lcs.export.mit.edu/]. Les sources de toutes les couches (voir ci-après) sont fournis. Une nouvelle version du système est produite environ tous les deux ans (actuellement la révision 6). Mais des versions corrigées apparaissent sous la forme de patches à installer.
Il y a une très forte dynamique autour de X dans le monde universitaire et de nombreux programmes d'application sont distribués gratuitement par les auteurs. Ces programmes sont connus sous la forme de contribs. La distribution X11 du MIT intègre en standard un grand nombre de contribs, ce qui rend son exploration très intéressante.
Un autre site propose des archives complètes des logiciels X11 :ftp://ftp.x.org [ftp://ftp.x.org/].
I-A-5-b. Bibliographie▲
Des bibliographies et des recueils d'informations techniques électroniques sont disponibles sur les serveurs :
- ftp.x.org:/contrib/docs/Xbibliography.ps ;
- gatekeeper.dec.com:/pub/X11/R5-contrib/Xbibliography ;
- landru.unx.com:/pub/X11.
Quelques livres de référence pour X :
- Jones, Oliver, Introduction to the X Window System, Prentice-Hall, 1988, 1989 ;
- Scheifler, Robert, and James Gettys, with Jim Flowers and David Rosenthal, "X Window System : The Complete Reference to Xlib, X Protocol, ICCCM, XLFD, X Version 11, Release 5, Third Edition," Digital Press, 1992 ;
- Nye, Adrian, "Xlib Programming Manual, Volume 1" and "Xlib Reference Manual, Volume 2," O'Reilly and Associates ;
- Mansfield, Niall. "The X Window System : A User's Guide," Addison-Wesley, 1989 ;
- Quercia, Valerie and Tim O'Reilly. "X Window System User's Guide," O'Reilly and Associates.
I-A-5-c. Cours X11 sur WWW▲
Des cours au format hypertext sont disponibles sur Internet :
I-A-5-d. Sources d'informations▲
Le forum de news comp.window.x permet des échanges sur tous les sujets relatifs à X, les développeurs du consortium l'utilisent pour diffuser les informations importantes.
D'autres forums de news sont très utiles : comp.windows.x, comp.windows.x.apps, comp.windows.x.announce.
La FAQ comp.windows.x est également une excellente source d'informations. On peut la télécharger à ftp://ftp.inria.fr/faq [ftp://ftp.inria.fr/faq].
D'autres sont disponibles à ftp://ftp.x.org/contrib/faqs [ftp://ftp.x.org/contrib/faqs] et ftp://rtfm.mit.edu.
I-A-5-e. Concurrents▲
Le concurrent le plus sérieux de X11 fut le défunt NEWS développé par SUN.
La force de X11 par rapport à Windows est son aspect client-serveur (Windows n'a pas en standard de protocole graphique transportable par réseau).
Windows, même dans ses versions les plus performantes (NT, 95) ne propose pas de système graphique distribué.
NeXTSTEP a présenté pendant plusieurs années une sérieuse alternative à X. Proposant le concept du display-poscript en standard et des fonctions graphiques très puissantes adaptées au matériel NeXT (video-live en PIP, move-opaque 32 bits avec alpha-channel), NeXTSTEP fascinait la communauté. De plus, le kit de développement (Interface-Builder) possédait une conception objet très poussée qui permettait des temps de développement records. Malheureusement la firme NeXT a arrêté la fabrication des machines NeXT. Elle continue le développement de NeXTSTEP sur des machines génériques comme les PC, Dec et Sun, mais pour des résultats nettement moins spectaculaires.
I-A-6. Modèle client-serveur▲
X repose sur un modèle client-serveur :
Un serveur peut être accédé par plusieurs clients et un client peut accéder à plusieurs serveurs.
Les clients passent par la couche de protocole Xlib pour être compatibles avec le serveur.
I-A-6-a. Le serveur X▲
Le serveur X11 est le logiciel qui contrôle l'accès au hardware (clavier, frame-buffer, souris…). Il est donc forcement logé dans la console (terminal, station) : on ne peut pas le lancer en remote.
Exemple :
local_host:> rlogin another_host
Passwd:
another_host:> xinit
XServer Error, can't access to frame-buffer.
Toutes les applications X11 (clientes) adressent des requêtes au serveur X11 qui peut être en local ou sur une autre machine (mode remote).
On ne peut lancer qu'un seul serveur par console sinon :
Fatal server error:
Server already running !!!
xinit: Server error.
Le serveur interprète les requêtes des clients et les exécute.
Il signifie les actions de l'utilisateur (mouvements souris, frappe clavier) en envoyant des messages aux clients.
I-A-6-b. Identification des displays▲
Un display X11 est identifié par une adresse Internet (ex. : 157.169.25.4) suivie de « :0 ». Une machine Internet possède un numéro unique spécifié par l'association InterNIC (lors du raccordement à Internet). Le nombre « 0 » désigne la carte graphique gérée par la station.
Bien sûr on peut utiliser les noms et les domaines à la place du numéro IP (il faut pour cela bénéficier du DNS ou des pages jaunes pour un accès complet au réseau Internet).
DNS : Comment ça marche ?
Une machine Internet possède un numéro IP unique spécifié par l'association InterNIC (lors du raccordement à Internet). À chaque fois qu'une machine veut transcrire une adresse du style machine.organisation.pays en numéro IP, elle s'adresse à un serveur DNS. On spécifie à une machine le numéro IP de plusieurs serveurs DNS dans un fichier de configuration (variable selon les machines).
Exemple :
diard@jessica:/etc> cat resolv.conf
nameserver 157.169.25.4
nameserver 157.169.25.10
nameserver 157.169.25.1
Par exemple essi2.essi.fr:0 peut être utilisé. Pour l'accès à une machine d'un sous-réseau local, le nom de la machine suffit (essi2:0).
Certaines machines peuvent posséder plusieurs cartes graphiques (par exemple une carte 24 bits pour l'affichage et une autre carte 8 bits pour le développement). Il faut donc donner le numéro de la carte dans laquelle on veut afficher.
Le display destinataire de l'application X11 est identifié par différents niveaux de priorité.
Sur la ligne de commande dans le shell, on peut spécifier (dans les programmes X11 correctement écrits) :
local_host:> xclock -display another_host:0
Si aucun argument n'est spécifié, la variable d'environnement shell est exploitée.
Pour la positionner :
local_host:> setenv DISPLAY essi2.essi.fr:0
local_host:> export DISPLAY
L'interface graphique des applications X11 à partir de ce moment sera redirigée sur le display essi2.essi.fr:0.
I-B. Composition de X▲
X est bâti sur un système de couches.
L'interface la plus basse est l'interface des sockets, ce sont des voies de communication qui permettent de véhiculer des paquets d'octets entre de machines du réseau. L'aspect communication de X est entièrement sous-traité à Unix.
I-B-1. Le protocole X▲
Toutes les transactions (requêtes du client - réponses du serveur) X11 sont encodées dans un flux d'octets qui passe dans la connexion entre le client et le serveur. Nous reviendrons sur le protocole utilisé (nous verrons plus tard que dans le cas d'un lancement d'application X11 en local, certaines bibliothèques permettent de court-circuiter la couche réseau de X11 pour accélérer le traitement des commandes).
La couche supérieure gère le protocole. Les messages X sont de quatre types :
- les requêtes d'un client vers un serveur ;
- les réponses du serveur aux requêtes des clients ;
- la signification par le serveur des événements du type :
- une touche du clavier a été enfoncée,
- on a cliqué sur un bouton de la souris ;
- envoi par le serveur d'éventuelles erreurs.
Le protocole X constitue la base de l'échafaudage X, sa pérennité est garantie par le consortium.
Le protocole X ne suppose aucun protocole réseau et ne dépend ni du réseau (RS232, ETHERNET, TOKEN RING…) ni du système (UNIX,VMS,MSDOS). Le protocole X est performant : « le client doit pouvoir suivre la souris », un aller-retour (round-trip) entre 5 à 10 millisecondes (200 kbit/seconde).
I-B-2. Xlib▲
La Xlib est une interface de programmation du protocole X, elle est décrite en langage C.
Elle permet entre autres, au travers de primitives simples de tracer des lignes ou de récupérer les caractères entrés au clavier. Ce sont des fonctions de base, des commandes graphiques. Elle est installée sous le nom /usr/X11/lib/libX11.a.
C'est cette bibliothèque qui encode dans le protocole les commandes graphiques.
I-B-3. X-ToolKit▲
La création d'une interface graphique est très fastidieuse si l'on doit gérer soi-même le fait que la souris cliquée à tel endroit correspond à telle action…
Une couche permet de s'affranchir de la gestion des icônes, boutons, menus…
Une bibliothèque destinée à simplifier la programmation de gadgets a été créée : X Toolkit Intrinsics. Connue sous le nom de Xt, la bibliothèque introduit le concept de widget. Un widget est une structure de données accompagnant une fenêtre et permettant de qualifier aisément certains paramètres (taille, fond, contours…), mais aussi de dicter plus facilement la réaction de l'interface.
Une hiérarchie de widgets est introduite par Xt, proposant ainsi un comportement objet qui se révèle fort utile. La bibliothèque Xt est installée dans /usr/X11/lib/libXt.a.
I-B-4. Toolbox▲
Le dernier niveau est appelé la boite à outils (toolbox). Les plus connues sont les Athena's Widgets (gratuit), OpenLook (gratuit) et Motif (payant).
Ces boites à outils définissent des widgets de type bouton de commande, boite de dialogue, barre de défilement… Les boites à outils introduisent des notions de présentation des applications (le fameux look and feel). Motif semble actuellement avoir pris le dessus, bien qu'il soit payant.
I-B-5. Le window-manager▲
Le « window-manager » est un élément-clé de X11. C'est une application X11 qui permet de gérer les fenêtres qui sont ouvertes sur le display. Appelé communément « environnement », il propose des menus, des icônes pour positionner, redimensionner, fermer les fenêtres connectées sur le display où il tourne.
Ne pas confondre serveur X et window-manager. Un window-manager est une application X11 qui n'a aucun accès privilégié au matériel (à part une autorité un peu différente pour pouvoir commander les autres applications X). On peut le lancer en remote. Le serveur X11 n'a pas d'interface graphique. C'est un noyau qui tourne localement sur la console (on peut lancer des applications X sans avoir lancé de window-manager, mais pas sans avoir lancé le serveur X).
Il existe un grand nombre de window-managers (commerciaux ou dans le domaine public). On peut en citer quelques-uns : hpVUE, fvwm, ctwm, olwm (Openlook), mwm, gwm (produit local programmé par Colas Nohaboo du projet Koala de l'INRIA, dont la principale particularité est son extensibilité : http://www.inria.fr/koala/colas).
Ils offrent tous à peu près les mêmes caractéristiques, l'ergonomie et l'extensibilité les différencient.
Certains (hpVUE, fvwm, olvwm…) implémentent le concept d'écran virtuel.
Écrans virtuels : comment ça marche ?
Le window-manager propose plusieurs écrans auxquels on peut accéder par une fenêtre spéciale. Il stocke pour chaque écran virtuel les identifieurs des fenêtres appartenant à celui-ci (une simple table). Lorsqu'on accède à un écran, le windowmanager « mappe » les fenêtres concernées et « unmappe » les autres. Ce mécanisme est purement logique (pas de transferts ni d'allocations de mémoire vidéo supplémentaires).
Devant la diversité des window-managers, un nouvel environnement de développement vient de voir le jour. Il est déjà porté sur toutes les plateformes des constructeurs du consortium X. Il s'appelle CDE (Common Desktop Environment).
I-B-6. Problèmes liés au réseau▲
Le fait d'utiliser des connexions réseau apporte un certain nombre de contraintes.
En ce qui concerne la fiabilité, la connexion peut être coupée à tout moment. On suppose qu'il n'y a pas de perte de paquets ni de duplication (TCP/IP s'en charge), la seule erreur est la perte de connexion.
Des décisions sur les formats de données doivent être prises, car le réseau permet de mélanger des machines de différents constructeurs. Les identifieurs X11 (de fenêtres, de fontes…) sont codés sur 32 bits et les coordonnées sur 16 bits.
Il y a deux façons de coder un entier en binaire : « little endian » (Intel) et « big endian » (les autres constructeurs). X doit donc prendre en compte le fait que le client code les entiers différemment. Pour cela deux ports sont ouverts, un pour chaque famille.
Le protocole ne doit pas être trop lourd pour permettre les connexions à travers un modem (peu raisonnable) ou une ligne RNIS (mieux, 64 Kbauds).
I-C. Configuration de XWindow▲
I-C-1. Démarrer avec X11▲
I-C-1-a. Où se trouvent les commandes X-Window ?▲
Les commandes X-Window se trouvent en général dans le répertoire /usr/bin/X11. Il convient d'inclure celui-ci dans le mécanisme des règles de recherche. Pour les Unixiens utilisateurs de csh ou tcsh, il est vivement conseillé d'inclure la commande ci-dessous dans le .cshrc.
set path = ($path /usr/bin/X11)
I-C-1-b. Les autorisations de connexions▲
En utilisant un système de fenêtrage, l'utilisateur est amené à ouvrir des fenêtres (sessions) sur différentes machines. Pour que cela soit possible un fichier appelé .rhosts, se situant dans le répertoire d'accueil (home dir) de l'utilisateur, donnera les autorisations nécessaires. L'exemple ci-dessous montre le contenu du fichier .rhosts d'un utilisateur toto s'autorisant des sessions automatiques depuis et vers les machines mach1, mach2 et mach3 du domaine org.fr (son répertoire d'accueil étant commun aux trois machines) :
mach1.org.fr toto mach2.org.fr toto mach3.org.fr toto
I-C-1-c. Le fichier de configuration du serveur X▲
Un serveur X a besoin de connaître les préférences de l'utilisateur concernant un certain nombre de paramètres. C'est le rôle du fichier .Xdefaults situé dans le répertoire d'accueil de l'utilisateur. L'exemple ci-dessous est une configuration minimum pour démarrer :
! Ressources generales par defaut.
!
*BitmapFilePath : /usr/include/X11/bitmaps
*font : 9x15
!
! Ressources de Xterm
!
XTerm.termName : xterm
XTerm.geometry : 80x34
XTerm.SunFunctionKeys : on
XTerm.VT100.boldFont : 6x13bold
XTerm.VT100.Font : 6x13
XTerm.VT100.font1 : 5x8
XTerm.VT100.font2 : 6x9
XTerm.VT100.font3 : 9x15
XTerm.VT100.font4 : 10x20
XTerm.VT100.ScrollBar : on
I-C-1-d. Fichier de configuration de twm▲
Les gestionnaires de fenêtres en général permettent à l'utilisateur de personnaliser un certain nombre de paramètres tels que les répertoires d'icônes, les polices utilisées dans les bandeaux de fenêtres, les menus déroulants. Dans le cas de twm un fichier appelé .twmrc joue ce rôle, il est situé dans le répertoire d'accueil de l'utilisateur. L'exemple suivant est une configuration minimum pour démarrer.
WarpCursor
BorderWidth 5
TitleFont "9x15"
MenuFont "9x15"
IconFont "9x15"
ResizeFont "9x15"
IconManagerFont "9x15"
NoTitleFocus
Zoom
ShowIconmanager
#Button = KEYS : CONTEXT : FUNCTION
Button1 = : root : f.menu "button1"
Button2 = : root : f.menu "button2"
Button3 = : root : f.menu "button3"
Button1 = m : window : f.menu "button1"
Button2 = m : window : f.menu "button2"
Button3 = m : window : f.menu "button3"
Button1 = m : title : f.menu "button1"
Button2 = m : title : f.menu "button2"
Button3 = m : title : f.menu "button3"
Button1 = : icon : f.iconify
Button2 = : icon : f.move
Button1 = : title : f.raise
Button2 = : title : f.move
IconDirectory "/usr/include/X11/bitmaps"
menu "button1"
{
"Rafraîchir ecran" f.refresh
"Nouveau .twmrc" f.twmrc
"Destruction fenetre" f.destroy
"Nouveau .Xdefaults" !"xrdb -load .Xdefaults &"
}
menu "button2"
{
"Actions speciales" f.title
"UnFocus" f.unfocus
"UnIconify" f.iconify
"Move Window" f.move
"Resize Window" f.resize
"Raise Window" f.raise
"Lower Window" f.lower
"Focus on Window" f.focus
"Zoom" f.fullzoom
"Kill twm" f.quit
}
menu "button3"
{}
I-C-1-e. Fichier de configuration de mwm▲
!!
!! Default Window Menu Description
!!
Menu DefaultWindowMenu
{
Restore _R Alt<Key>F5 f.restore
Move _M Alt<Key>F7 f.move
Size _S Alt<Key>F8 f.resize
Minimize _n Alt<Key>F9 f.minimize
Maximize _x Alt<Key>F10 f.maximize
Lower _L Alt<Key>F3 f.lower
no-label f.separator
Close _C Alt<Key>F4 f.kill
}
!!
!! Key Binding Description
!!
Keys DefaultKeyBindings
{
Shift<Key>Escape window|icon f.post_wmenu
Alt<Key>space window|icon f.post_wmenu
Alt<Key>Tab root|icon|window f.next_key
Alt Shift<Key>Tab root|icon|window f.prev_key
Alt<Key>Escape root|icon|window f.circle_down
Alt Shift<Key>Escape root|icon|window f.circle_up
Alt Shift Ctrl<Key>exclam root|icon|window f.set_behavior
Alt<Key>F6 window f.next_key transient
Alt Shift<Key>F6 window f.prev_key transient
Shift<Key>F10 icon f.post_wmenu
! Alt Shift<Key>Delete root|icon|window f.restart
}
!!
!! Button Binding Description(s)
!!
Buttons DefaultButtonBindings
{
<Btn1Down> icon|frame f.raise
<Btn3Down> icon|frame f.post_wmenu
<Btn3Down> root f.menu DefaultRootMenu
}
Buttons ExplicitButtonBindings
{
<Btn1Down> frame|icon f.raise
<Btn3Down> frame|icon f.post_wmenu
<Btn3Down> root f.menu DefaultRootMenu
! <Btn1Up> icon f.restore
Alt<Btn1Down> window|icon f.lower
! Alt<Btn2Down> window|icon f.resize
! Alt<Btn3Down> window|icon f.move
}
Buttons PointerButtonBindings
{
<Btn1Down> frame|icon f.raise
<Btn3Down> frame|icon f.post_wmenu
<Btn3Down> root f.menu DefaultRootMenu
<Btn1Down> window f.raise
! <Btn1Up> icon f.restore
Alt<Btn1Down> window|icon f.lower
! Alt<Btn2Down> window|icon f.resize
! Alt<Btn3Down> window|icon f.move
}
!!
!! END OF mwm RESOURCE DESCRIPTION FILE
!!
I-C-1-f. Démarrer une session X sur une station▲
Dans la livraison du MIT, on trouve la commande startx qui lance le chargement d'un serveur X et l'initialisation d'un certain nombre de clients X. La commande startx recherche la présence d'un fichier appelé .xinitrc dans le répertoire d'accueil de l'utilisateur, il contient les applications à lancer en ouvrant la session. Si le fichier .xinitrc n'existe pas, des applications trouvées dans le fichier /usr/lib/X11/xinit/xinitrc seront alors lancées par défaut. Toutes les applications figurant dans un .xinitrc doivent être lancées en arrière-plan sauf la dernière, car quand celle-ci se terminera, la session X tout entière prendra fin. Dans l'exemple suivant, la commande xquit permet de quitter la session :
xhost + > /dev/null &
twm &
xconsole -iconic &
xclock -geometry 120x120+1017+6 &
xterm -ls -sb &
xquit -geometry 60x72+1078+776
I-C-1-g. Démarrer une session X sur un terminal X▲
Il y a plusieurs solutions pour initialiser une session X sur un terminal X. Une des méthodes généralement utilisées est l'établissement préalable d'une session Telnet entre le terminal et la machine hôte de référence. Une fois cette connexion obtenue, l'utilisateur pourra lancer une procédure de commandes contenant les applications à démarrer comme dans l'exemple suivant :
#!/bin/csh
xhost + > /dev/null &
xrdb ~/.Xdefaults & twm & xclock -geometry 120x120-0+0 &
xterm -ls -sb &
Il est également possible de configurer le terminal X afin qu'il utilise XDM. Dans ce cas une bannière de connexion invite l'utilisateur à se présenter (nom et mot de passe). En cas de succès des applications sont lancées automatiquement.
L'initialisation du terminal X, ainsi que la fin de la session X, sont propres à chaque type de terminal et ne sont donc pas mentionnées ici.
I-C-2. Les ressources▲
I-C-2-a. Introduction▲
Dans l'environnement X-Window le mot ressource est utilisé pour spécifier des valeurs qui sont utilisées par les applications, et qui peuvent être facilement modifiées par l'utilisateur. Dans le principe il convient de distinguer les ressources standards (communes à toutes les applications) et les ressources particulières (inventées par le créateur de l'application).
I-C-2-b. Les ressources standards▲
Toute application s'appuyant sur la bibliothèque Xt Intrinsics hérite des ressources suivantes :
- font pour spécifier les polices de caractères utilisées ;
- geometry pour indiquer le positionnement et la taille des fenêtres ;
- background pour qualifier le fond d'écran d'une fenêtre ;
- borderwidth pour donner la taille en pixels du contour des fenêtres ;
- display pour indiquer le nom de la station qui héberge le serveur X ciblé ;
- …
Ces ressources sont appelées les ressources standards.
I-C-2-c. Les ressources des applications▲
En plus des ressources standards, les programmeurs définissent des ressources propres à leurs applications. Ces ressources servent à personnaliser les utilisations, l'utilisateur ayant la maîtrise de nombreux paramètres. Ainsi l'application xterm fournie par le consortium X prévoit pour l'utilisateur la possibilité de spécifier ses choix pour les ressources suivantes :
- scrollBar pour indiquer si l'utilisateur désire ou non la présence d'une barre de défilement sur le côté de sa fenêtre ;
- saveLines pour mentionner le nombre de lignes sur lequel portera l'effet d'une barre de défilement ;
- …
Le manuel d'une application X-Window contient toujours la liste des ressources propres à cette application ainsi que leurs valeurs par défaut.
I-C-2-d. Le nommage des ressources▲
Les ressources d'une application X-Window sont associées aux fenêtres qui la composent sous la forme d'une arborescence respectant les imbrications des fenêtres composantes. Les fenêtres composant une application ont un nom (utilisable à l'extérieur du programme) donné par le programmeur, il doit figurer dans le manuel de l'application. L'application exemple crée une fenêtre contenant deux sous-fenêtres qui sont des boutons de commandes.
Pour personnaliser l'application exemple l'utilisateur pourra procéder de la façon suivante :
exemple.bouton1.font : 6x13
exemple.bouton1.borderWidth : 5
exemple.bouton1.label : Com A
exemple.bouton2.font : 9x15
exemple.bouton2.borderWidth : 5
exemple.bouton2.label : Com B
L'utilisateur a ici utilisé les ressources standards font et borderWidth, il demande une police de caractères spécifique pour chaque bouton de commande. Par contre pour le bord de la fenêtre il stipule la même valeur pour bouton1 et bouton2 et aurait pu utiliser la notation suivante :
exemple*borderWidth : 5
!! ou
Exemple*borderWidth : 5
La notation * permet de s'affranchir de tout ou partie de la hiérarchie des fenêtres. L'exemple ci-dessus créerait toutes les fenêtres de l'application avec un bord de cinq pixels quel que soit leur niveau d'emboitement. La seconde ligne commençant par « Exemple » cible toutes les applications de la classe Exemple dont exemple est un membre. C'est une notation fréquemment utilisée.
Dans le jargon X-Window, on dit que exemple est une application et que exemple.bouton2 est un widget, label étant une ressource propre à l'application exemple. Les (sous-) fenêtres ne sont que la partie visible des widgets, un widget est une structure de données accompagnant une fenêtre et permettant de la qualifier à l'aide de ressources.
I-C-2-e. Où spécifier des ressources ?▲
Il y a divers endroits pour spécifier les ressources des applications XWindow.
L'auteur d'une application utilisera un fichier de ressources qu'il placera dans le répertoire /usr/lib/X11/app-defaults, mais il pourra également spécifier dans son programme des ressources inaltérables.
L'utilisateur pourra personnaliser l'application en positionnant des ressources dans le fichier .Xdefaults situé dans son répertoire d'accueil. Il pourra également indiquer des ressources en arguments de la ligne de commande qui lance l'application ciblée. Lorsqu'une même ressource est citée dans plusieurs endroits, l'ordre de préséance est celui de la figure ci-dessus.
I-C-2-f. Modifier des ressources pour tous les utilisateurs▲
L'auteur d'un client X peut désirer que son application soit installée avec des valeurs de ressources par défaut correctement initialisées pour tous les utilisateurs potentiels. Il peut alors installer dans le répertoire /usr/bin/X11/appdefaults un fichier dont le nom sera la classe de son application, et ce fichier sera consulté à chaque démarrage de l'application.
Les clients X ont tous une classe dont le nom est celui de l'application, mais avec la première lettre en majuscule (en général). Ainsi la classe de l'application xterm est Xterm, celle de l'application xlatex est Xlatex… Ce mécanisme offre la possibilité de faire cohabiter plusieurs versions d'une même application (sous des noms différents) tout en partageant le même
fichier dans /usr/bin/X11/appdefaults.
Un administrateur d'applications X averti pourra souhaiter franciser les clients X les plus fréquemment utilisés. Pour être efficace, il portera ses modifications dans le fichier app-defaults existant ou en créera un exemplaire.
L'exemple suivant montre l'application xfd avant et après francisation.
Le fichier /usr/bin/X11/app-defaults/Xfd tel que livré par le consortium X :
*quit.Label : Quit
*prev.Label : Prev Page
*next.Label : Next Page
*select.Label : Select a character
Le fichier /usr/bin/X11/app-defaults/Xfd après modification :
*quit.Label : Sortir
*prev.Label : Page precedente
*next.Label : Page suivante
*select.Label : Choisissez un caractere
I-C-2-g. Modifier des ressources pour un utilisateur▲
Le fichier .Xdefaults situé dans le répertoire d'accueil de l'utilisateur lui permet de personnaliser les applications X-Window. Lorsque le fichier .Xdefaults a été modifié, il faut en avertir le serveur X de la façon suivante :
xrdb -load ~/.Xdefaults
I-C-2-h. Les ressources spécifiées en arguments de la ligne de commande▲
Un certain nombre de ressources peuvent être placées en arguments de la ligne de commande. C'est le cas de toutes les ressources standards (font, borderWidth…) et aussi de certaines ressources des applications dans la mesure où le programmeur en a décidé ainsi. Les ressources spécifiées de cette façon sont toujours prioritaires par rapport au contenu de app-defaults et .Xdefaults. L'exemple suivant montre l'appel de l'application xterm en spécifiant des ressources sur la ligne de commande :
xterm -fn 9x15 -ls -sb
-fn 9x15 est la spécification de la ressource standard font , -ls et -sb sont des spécifications de ressources propres à l'application xterm.
C'est au développeur d'une application de prévoir les ressources personnalisables, il doit également déterminer si les ressources peuvent être simplement spécifiées en arguments de la ligne de commande. Ainsi dans l'application xterm, la ressource scrollBar peut être positionnée en argument de la ligne de commande en utilisant -sb. C'est le créateur de l'application qui en a décidé ainsi, aussi l'indique-t-il dans son manuel.
I-C-2-i. La commande xrdb▲
xrdb permet de prendre en compte la personnalisation des ressources par un utilisateur. Cette commande utilise la syntaxe du préprocesseur du langage C pour permettre de présenter des fichiers de ressources adaptés à différents cas. xrdb connaît (entre autres) les symboles suivants :
- COLOR, qui est positionné si l'écran utilisé est répertorié du genre StaticColor, PseudoColor, TrueColor ou DirectColor (cf. la commande xdpyinfo) ;
- SERVERHOST, le nom de la machine hébergeant le serveur X ;
- VENDOR, une chaîne permettant d'identifier le fournisseur du serveur X utilisé (elle est hélas souvent très longue).
Dans un fichier .Xdefaults, l'utilisateur pourra s'autoriser des écritures du genre :
#ifdef COLOR
Mwm*background : SlateGrey
Mwm*foreground : yellow
#endif
On utilise en général xrdb en lui fournissant le nom d'un fichier de ressources en argument comme dans l'exemple suivant :
xrdb /.Xdefaults
I-C-2-j. Les nouveautés de X11R5▲
Au niveau de la gestion des ressources, un certain nombre d'améliorations ont été apportées par la révision X11R5.
Dans le nommage des ressources, on peut maintenant introduire le caractère « ? » pour remplacer un élément d'un nom complet de ressource, comme dans l'exemple suivant :
Xdf.?.quitter.background : red
La nouvelle ressource customization permet à l'utilisateur d'être automatiquement aiguillé vers un fichier app-defaults adapté à son terminal.
En général les auteurs d'applications fournissent maintenant un fichier app-defaults pour les terminaux monochromes et un autre pour les terminaux couleur. Le fichier contenant les spécifications de couleur est en général suffixé par -color comme dans l'exemple suivant (l'application xdf) :
- Xdf (fichier des ressources par défaut pour les terminaux monochromes) ;
- Xdf-color (fichier des ressources par défaut pour les terminaux couleur).
En positionnant la variable customization à la valeur -color dans un fichier .Xdefaults (*customization : -color), l'utilisateur disposant d'un écran couleur aura une coloration automatique de l'application.