Le système X

Transcription

Le système X
Le système X
Samir Djilali-Saïah
[email protected]
Université de Paris 12
24 avril 2006
Samir Djilali-Saïah
[email protected]
Le système X
Samir Djilali-Saïah
[email protected]
Le système X
Première partie I
Utilisation du Système X
Samir Djilali-Saïah
[email protected]
Le système X
Utilisation du système X
I Système X
I Clients
I Lancement des clients
I Gestionnaire de fenêtres
Samir Djilali-Saïah
[email protected]
Le système X
Le Système X (1/2)
I Le système X est un système de création et de gestion
d'interfaces graphiques.
I Le système X permet l'achage,
I
I
I
I
sur un ou plusieurs écrans,
de plusieurs applications,
tournant sur des machines diérentes,
dans des fenêtres séparées.
I Il coordonne les activités des diérentes applications qui n'ont
pas besoin de se connaître, et qui peuvent pourtant échanger
des données.
I Les programmes construits sur les principes du système X sont
appelés
clients
X.
I Le dispositif graphique de sortie (écran), et le dispositif de
saisie (souris et clavier) constituent le display. Le processus
chargé de gérer le display est appelé un
Samir Djilali-Saïah
[email protected]
Le système X
serveur.
Le système X (2/2)
I Chaque application X
I
I
se connecte elle-même à un serveur via un réseau,
et dispose sur son display d'une ou de plusieurs fenêtres.
I L'utilisation d'un
gestionnaire de fenêtres
est recommandée,
mais n'est pas indispensable :
I
il coordonne la position relative des fenêtres, leur taille et leur
décoration, mais le contenu (l'intérieur) des fenêtres est de la
responsabilité des applications.
I Le système X constitue le fondement d'un système de
fenêtrage sur lequel sont construites des interfaces graphiques
utilisateurs. La plus répandue des interfaces graphiques est
OSF/Motif.
Samir Djilali-Saïah
[email protected]
Le système X
Clients X
I Le système X a été développé au MIT, dans le cadre du projet
Athena. Il est actuellement maintenu et développé par le
consortium X qui regroupe les principaux constructeurs.
I Le système X est fourni avec un certain nombre de clients,
dont des contributions émanant d'autres origines.
I Quelques clients importants :
I
I
I
I
xterm : émulateur de terminal alphanumérique, avec un shell
xedit : éditeur de texte simple
bitmap : éditeur bitmap
xfig : un logiciel de dessin
I Quelques accessoires de bureau :
I
I
I
xcalc : une calculette
xclock : une horloge
xload : donne la charge du système
Samir Djilali-Saïah
[email protected]
Le système X
Lancement de clients X
I X permet à l'utilisateur de spécier des options sur la ligne de
commande qui lance un client
I
I
certaines options sont communes à toutes les applications X
certaines applications admettent de plus des options spéciques
I Les options communes concernent
I
I
I
I
I
le serveur utilisé
le choix de couleurs
la fonte (police de caractères)
la géométrie (dimensions et placement)
le titre de la fenêtre
I Ces options spécient des valeurs de
I
I
I
ressources
:
les ressources concernent des widget (contraction de window
est gadget, désigne une fenêtre avec un aspect et un
comportement prédénis)
une ressource est un attribut d'une widget qui peut recevoir
une valeur
une ressource a une valeur par défaut. Lui donner une nouvelle
valeur permet de la personnaliser
Samir Djilali-Saïah
[email protected]
Le système X
Les options communes
I Les options communes sont données en spéciant leur
(version courte ou longue) suivi de la
nom
valeur
I Les principales sont :
I
I
I
I
I
I
I
I
I
-display, -d : numéro du serveur auquel se connecter
-background, -bg : couleur du fond de la fenêtre
-foreground, -fg : couleur des dessins et du texte
-borderwidth, -bw : largeur du bord (en pixels)
-bordercolor, -bd : couleur du bord
-geometry, -g : taille et position de la fenêtre
-font, -fn : police de caractères
-iconic : lancement sous forme iconiée
-title : titre de la fenêtre
Samir Djilali-Saïah
[email protected]
Le système X
Display
I L'option
-display
permet de donner le nom de la machine,
du serveur et de l'écran sur lequel s'acheront les fenêtres du
client
I Par défaut, cette valeur est celle contenue dans le variable
DISPLAY
-dipslay [hôte] :serveur[.écran]
hôte : adresse IP de la machine sur laquelle tourne le serveur
serveur : numéro du processus serveur sur la machine hôte
(en général 0). Plusieurs serveurs peuvent tourner
simultanément sur une même machine.
écran : numéro de l'écran principal (en général 0). un serveur
peut avoir plusieurs écrans numérotés à partir de 0
d'environnement
I Sa syntaxe est :
I
I
I
I La connexion peut échouer si la machine du client n'est pas
autorisée à se connecter sur la machine du serveur. On peut y
remédier par la commande
xhost
I Exemple :
rsh machine1 xterm -display machine2 :0.0
Samir Djilali-Saïah
[email protected]
Le système X
Couleurs
I Les options
-foreground, -background, -bordercolor
permettent de choisir d'autres couleurs que celles dénies par
défaut
I Elle sont suivi d'une spécication de couleur
I Les noms de couleurs sont stockés dans le chier ASCII
rgb.txt
qui se trouve dans le répertoire
/usr/lib/X11.
I Exemple :
red, blue, green, khaki, sienna, light yellow, ...
Samir Djilali-Saïah
[email protected]
Le système X
Taille et position
I L'option
-geometry
permet de donner l'emplacement, et la
taille de la fenêtre du client (en pixels)
I
I
l'emplacement se dénit par rapport aux bords de l'écran
la taille est donnée par la largeur et la hauteur de la fenêtre
I La valeur de cette option est donnée par 4 paramètres, sous la
largeur x hauteur (+/-) décalage_x (+/-)
décalage_y (sans espace entre les paramètres)
forme
I Exemples :
I
I
I
coin supérieur gauche : -geometry +0+0
coin supérieur droit : -geometry +0-0
coin inférieur droit, avec une marge verticale de 10 pixels, et
une marge horizontale de 50 pixels : -geometry -50-10
Samir Djilali-Saïah
[email protected]
Le système X
Titre et police de caractères
I L'option
-title
permet de donner le titre qui s'achera dans
la barre de titre de la fenêtre. Par défaut, c'est le nom de
l'application.
I L'option
-font
permet d'utiliser une police autre que celle par
défaut.
I
I
I
I
une police conforme à iso8859-1 contient des caractère
accentués
pour choisir une police, utiliser xfontsel, et pour l'examiner
de près xfd
entourer le nom de la police d'apostrophes s'il contient des
caractères spéciaux
exemple :
-font '*courier-medium-r-*-120*-iso8859-1'
Samir Djilali-Saïah
[email protected]
Le système X
Gestionnaire de fenêtres
I Le gestionnaire de fenêtres (window manager) est un client X
I Son rôle est de faire vivre ensemble les applications présentes,
en permettant :
I
I
I
déplacer, dimensionner, empiler diéremment les fenêtres des
applications
icônier les applications
contrôler le foyer d'entrée du clavier, c-à-d déterminer quelle
est la fenêtres vers laquelle sont dirigées les frappes du clavier
I La plupart des gestionnaires de fenêtres ajoutent aux fenêtres,
une décoration, composée d'une bordure, d'une barre de titre
avec divers boutons, voire d'un menu déroulant
Samir Djilali-Saïah
[email protected]
Le système X
Deuxième partie II
Xlib : connexion au serveur X
Samir Djilali-Saïah
[email protected]
Le système X
Xlib : connexion au serveur X
I Ouverture
I Macros utiles
I Fermeture
Samir Djilali-Saïah
[email protected]
Le système X
Ouverture
I Connexion d'un client à un serveur par
I
I
I
Display *XOpenDisplay(char *nom_station)
Sim nom_station est NULL on utilise le contenu de la variable
d'environnement DISPLAY
La chaîne nom_station a la forme
I nom_hôte :numéro[.écran] en TCP ou IPC
I nom_hôte : :numéro[.écran] pour DECnet
En cas de succès, XOpenDisplay retourne un pointeur vers
une structure Display qui contient les informations transmises
par le serveur.
I En cas d'échec, retourne
Samir Djilali-Saïah
NULL
[email protected]
Le système X
Exemple
Display *dpy ;
...
if ((dpy =
XOpenDisplay(0)) == NULL) {
fprintf(stderr, %s : impossible d'ouvrir le serveur X %s , argv[0],
XdisplayName(0)) ;
exit(1) ;
}
I
XDisplayName retourne son propre nom s'il n'est pas NULL,
et le contenu de la variable DISPLAY sinon
Samir Djilali-Saïah
[email protected]
Le système X
Macros utiles
I A partir du Display, des informations utiles sont accessibles par
des fonctions macros, dont les plus importantes sont :
Display *dpy ;
int ecran ;
Window fen ;
unsigned long Noir, Blanc ;
GC ctx ;
DeaultScreen(dpy) // Ecran par défaut
fen = DafaultRootWindow(dpy) ; //Fenêtre racine
Noir = BlackPixel(dpy, ecran) ; //Pixel noir
Blanc = WhitePixel(dpy, ecran) ; //Pixel blanc
ctx = DefaultGC(dpy, ecran) ; // Contexte graphique
DisplayWidth(dpy, ecran) ; // largeur de l'écran en pixels
DisplayHeight(dpy, ecran) ;
DisplayWidthMM(dpy, ecran) ; // en millimètres
ecran =
Samir Djilali-Saïah
[email protected]
Le système X
Fermeture
I Il faut fermer la connexion par
Samir Djilali-Saïah
[email protected]
XCloseDisplay(dpy)
Le système X
Troisième partie III
Xlib : les fenêtres
Samir Djilali-Saïah
[email protected]
Le système X
Xlib : les fenêtres
I Création d'une fenêtre
I Arbre des fenêtres
I Caractéristiques
I Géométrie
I Couleurs
I Achage
I Evènements
Samir Djilali-Saïah
[email protected]
Le système X
Arbre des fenêtres
I Une fenêtre est une zone rectangulaire sur un écran
I Les fenêtres sont organisées en arbre :
I
I
I
I
la fenêtre racine occupe tout l'écran. Elle est accessible par
DefaultRootWindow(dpy)
les autres fenêtres ont une mère. Les s÷urs sont organisées en
listes correspondant à l'ordre d'empilement sur l'écran
l'achage correspond à un parcours préxe en profondeur
la partie achée d'une fenêtre est celle contenue dans sa mère
Samir Djilali-Saïah
[email protected]
Le système X
Caractéristiques d'une fenêtre
I Les caractéristiques d'une fenêtre concernent :
I
conguration
I géométrie : position, largeur, hauteur, épaisseur du bord
I rang : ordre d'empilement (parmi ses s÷urs
I
aspect et contenu
I couleur ou motif de la bordure et du fond
I curseur
I
prise en charge des évènements
I évènements reçus
I transmission éventuelle à la mère
I Ces attributs sont modiables
Samir Djilali-Saïah
[email protected]
Le système X
Géométrie d'une fenêtre
I Chaque fenêtre est placée par rapport à sa mère (coordonnée
du coin supérieur gauche, bordure comprise
I Chaque fenêtre a son propre repère (origine), au coin supérieur
gauche, bordure exclue
I L'axe des
x
est horizontal (largeur), celui des
(hauteur)
Samir Djilali-Saïah
[email protected]
Le système X
y
est vertical
Couleurs d'une fenêtre
I Chaque fenêtre a une couleur de bordure et une couleur du
fond
I Les couleurs sont repérées par des indices dans une table de
couleurs
Samir Djilali-Saïah
[email protected]
Le système X
Création d'une fenêtre
Window
XCreateSimpleWindow(
Display *display, // le display
Window parent, // fenêtre mère
int x, int y, // position de l'origine
unsigned int width, unsigned int height, // largeur, hauteur
unsigned int border_width, // largeur du bord
unsigned long border, unsigned long background) ;// couleurs bord
et fond
I Exemple : fen =
XCreateSimpleWindow(dpy,DefaultRootWindow(dpy),
10, 50, //origine
500, 300, //géométrie
BlackPixel(dpy, DefaultScreen(dpy)), //bord noir
WhitePixel(dpy, DefaultScreen(dpy))) ; //fond blanc
I Le type
Window
est entier long sans signe. Il contient une
valeur qui désigne un n÷ud dans l'arbre des fenêtres
Samir Djilali-Saïah
[email protected]
Le système X
Achage d'une fenêtre (1/3)
I Une fenêtre créée est insérée dans la liste des lles de sa mère,
en général comme lle cadette (en avant plan).
I Mais pour être visible, elle doit être achée (mapped) par
XMapWindow(dpy,fen)
I Pour être visible :
I
I
I
I Une
toutes ses fenêtres ancêtres doivent être mappées
elle ne doit pas être couverte par une fenêtre s÷ur ou cousine
le tampon des requêtes doit être vidé de cette requête
d'achage
fenêtre est retirée par XUnmapWindow(dpy,fen)
Samir Djilali-Saïah
[email protected]
Le système X
Achage d'une fenêtre (2/3)
I Création et achage d'une fenêtre principale et de 3
sous-fenêtres
Window fen, lle[3] ;
void Installer(void) {
int i ;
XCreateSimpleWindow(dpy, DefaultRootWindow(dpy),
fen=
0, 0, 300, 300, 6, Noir, Blanc) ;
for(i=0 ;i<3 ;i++)
XCreateSimpleWindow(dpy, fen, 50*i+10, 10, 40, 40,
lle[i]=
4, Noir, Blanc) ;
XMapWindow(dpy,fen) ;
XMapSubwindows(dpy,fen) ;
}
Samir Djilali-Saïah
[email protected]
Le système X
Achage d'une fenêtre (3/3)
I Mise en avant d'une fenêtre par rapport à ses s÷urs :
XRaiseWindow(dpy,fen)
I Mise en avant et achage :
Samir Djilali-Saïah
[email protected]
XMapRaised(dpy,fen)
Le système X
Evènements
I Chaque fenêtre peut être "sensibilisée" à une famille
d'évènements, par
XSelectInput
I C'est le client qui choisit les évènements pour une fenêtre
I Le serveur envoie les évènements aux clients en indiquant la
fenêtre concernée
I Pour sélectionner les évènements à recevoir, on forme un
masque, union de masques d'évènements
Samir Djilali-Saïah
[email protected]
Le système X
Noms et masques d'évènements
KeyPress, KeyRelease,
ButtonPress, ButtonRelease, MotionNotify,
EnterNotify, LeaveNotify, Expose, MapNotify, ...
Quelques masques : KeyPressMask, KeyReleaseMask,
ButtonPressMask, ButtonReleaseMase,
EnterWindowMask, LeaveWindowMask,
PointerMotionMask, ...
I Quelques évènements :
I
Samir Djilali-Saïah
[email protected]
Le système X
Evènements (exemple)
XEvent event ;
XSelectInput(dpy, lle,
ButtonPressMask|EnterWindowMask|LeaveWindowMask) ;
for( ; ;){
XNextEvent(dpy, &event) ;
switch(event.type) {
case
ButtonPress :
exit(0) ;
case
EnterNotify :
XsetWindowBorderWidth(dpy,lle,4) ;
break ;
case
LeaveNotify :
XsetWindowBorderWidth(dpy,lle,2) ;
break ;
}
}
Samir Djilali-Saïah
[email protected]
Le système X
Propagation d'évènements
I Si un évènement se produit dans une fenêtre mais que le type
d'évènement n'est pas sélectionné pou celle-ci :
I
I
le serveur teste si la mère a sélectionnée ce type d'évènement,
puis sa grand-mère, etc.
si une autre fenêtre à sélectionnée l'évènement, il est
envoyé,sinon, il est ignoré
I Pour inhiber la propagation des évènements d'un certain type,
on utilise le masque
do_not_propagate
I Par défaut, les évènements sont propagés.
Samir Djilali-Saïah
[email protected]
Le système X