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