La profondeur (Depth) est le nombre de bits par pixel qui va être disponible pour représenter les couleurs que l'on pourra utiliser pour dessiner dans la fenêtre.
Le Visual Type représente la manière dont le serveur va gèrer les couleurs. Il existe en effet différents moyens d'accèder à l'écran (en TrueColor ou par Colormap, on etudiera ça plus en détail lorsque nous aborderons la gestion des couleurs). Peu de hardwares supportent de multiples Visuals.
Il existe des macros bien utiles pour obtenir des valeurs par defaut pour ces deux paramètres :
Une fenêtre possède une classe qui diffère selon qu'elle est capable ou non d'afficher des résultats.
Les classes possibles sont :
Les attributs d'une fenêtre contrôlent de nombreux aspects concernant l'apparence d'une fenêtre ainsi que la manière dont elle va réagir aux différents évènements.
Exemple d'attributs :
Il existe plusieurs moyens pour créer une fenêtre.
Attention les fenêtres sont crées unmapées, elles n'apparaissent pas à l'écran tout de suite car leur création est bufférisée par la Xlib.
La fonction XMapWindow() est utilisée pour afficher une fenêtre et tous ses enfants. Une fenêtre peut être retirée de l'écran sans être détruite avec XUnmapWindow().
Une fenêtre occupe environs 100 octets dans la mémoire du serveur.
Une fenêtre ne coûte rien! Les applications courantes comportent plus d'une centaine de fenêtres (Xmh, etc...)
XCreateWindow() est utilisée pour créer une fenêtre quelconque X, les paramètres sont passés dans la structure XSetWindowAttributes.
Exemple :
Window win_des; XSetWindowAttributes xswa; int winX,winY,winW,winH; int border_width; /* largeur, hauteur de la fenêtre */ winW=600; winH=600; /* largeur de la bordure */ border_width = 3; /* Position de la fenêtre par rapport à la taille de la RootWindow */ winX=(DisplayWidth(dpy,DefaultScreen(dpy)) - winW) >> 1; winY=(DisplayHeight(dpy,DefaultScreen(dpy)) - winH) >> 1; /* attributs de la fenetre. On ne positionne dans cet exemple que le champ event_mask pour indiquer la liste des évènements auxquels la fenêtre va être sensible */ xswa.event_mask = ExposureMask|ButtonPressMask|ButtonReleaseMask| PointerMotionMask; /* Couleur de la bordure et du background */ xswa.background_pixel = WhitePixel(dpy,DefaultScreen(dpy)); xswa.border_pixel = BlackPixel(dpy,DefaultScreen(dpy)); win_des = XCreateWindow(display, DefaultRootWindow(display), winX, winY, winW, winH, border_width, DefaultDepth(dpy,DefaultScreen(dpy)), InputOutput, DefaultVisual(dpy,DefaultScreen(dpy)), CWEventMask|CWBackPixel|CWBorderPixel, &xswa); /* Affichage de la fenêtre à l'écran */ XMapWindow(dpy,win_des);
![]()
Les attributs de la fenêtre peuvent être modifiés après la création à l'aide de fonctions spécialisées telles :
L'exemple précédent illustre bien la "lourdeur" et la complexité de la programmation sous Xlib. Fort heureusement, pour la création de fenêtres, tâche courante s'il en est, la Xlib propose une fonction plus facile à utiliser.
La fonction XCreateSimpleWindow() permet de créer plus rapidement une fenêtre.
L'appel de XCreateSimpleWindow() au lieu de XCreateWindow() fait que la fenêtre crée hérite de tous les attributs de la fenêtre père.
Exemple :
win = XCreateSimpleWindow(display, RootWindow(display, screen), x, y, width, height, border_width, BlackPixel(display,screen), WhitePixel(display,screen));
![]()
ATTENTION : avec cette fonction, seuls quelques attributs sont spécifiés à la création. Les attributs de la fenêtre pourront être modifiés après la création à l'aide de fonctions spécialisées telles :
Détaillons les différents paramètres de la fonction XCreateWindow().
#include <X11/X11.h> Display *display; Window window, parent_window; int x, y; unsigned int width, height; unsigned int border_width; int depth; unsigned int class; Visual *visual; unsigned long valuemask; XSetWindowAttributes *attributes; window = XCreateWindow(display, parent_window, x, y, width, height, border_width, depth, class, visual, valuemask, attributes);
![]()
Les fonctions de création de fenêtres retournent un identificateur de fenêtre de type Window (ou la constante None si l'appel a échoué). Le premier paramètre est le display, retourné par la fonction XOpenDisplay. Le second paramètre est l'identificateur de la fenêtre père. Rappelons que chaque fenêtre est "clippée" par sa fenêtre père. Le père de la première fenêtre créée est la Root Window, dont il est facile d'obtenir l'identificateur grace à la macro RootWindow.
Les troisème et quatrième paramètres (x et y) donnent la position désirée du coin en haut à gauche de la fenêtre (en pixels). Nous employons le terme "désirée" car le Window Manager peut arbitrairement modifier la position de la fenêtre lors de ca création. Les deux paramètres suivants (width et height) correspondent à la taille de la fenêtre en pixels. Le paramètre suivant (border_width) indique l'epaisseur souhaitée du cadre autour de la fenêtre. Ici aussi, si la fenêtre possède comme père la Root Window, le Window Manager peut affecter à la bordure une valeur différente de celle spécifiée dans le code.
Le paramètre depth correspond au nombre de bit planes disponibles sur le display. Cette valeur peut être obtenue à l'aide de la macro DefaultDepth, ou de la constante CopyFromParent. Le paramètre class est une constante pouvant prendre une des valeurs suivantes: InputOutput, InputOnly, ou CopyFromParent. La majeure partie des fenêtres que l'on va manipuler seront de la classe InputOutput. Le paramètre visual sert à décrire un modèle abstrait du hardware graphique dont est équipé la machine sur laquelle l'application devra être exécutée. Nous étudierons plus en détail ce paramètre lors dans le chapitre consacré à la couleur. En attendant, ne prenons pas de risque et utilisons soit la macro DefaultVisual soit la constante CopyFromParent.
Les deux paramètres suivants, valuemask et attributes sont très liés. La structure XSetWindowAttributes contient 15 champs conditionnant l'aspect et le comportement de la fenêtre. La variable valuemask est un masque de bits qui sert à indiquer quels champs parmis les 15 on va spécifier dans la variable contenant les attributs.
typedef struct { Pixmap background_pixmap; /* background, None, or ParentRelative */ unsigned long background_pixel; /* background pixel */ Pixmap border_pixmap; /* border of the window or CopyFromParent */ unsigned long border_pixel; /* border pixel value */ int bit_gravity; /* one of bit gravity values */ int bit_gravity; /* one of bit gravity values */ int win_gravity; /* one of the window gravity values */ int backing_store; /* NotUseful, WhenMapped, Always */ unsigned long backing_planes; /* planes to be preserved if possible */ unsigned long backing_pixel; /* value to use in restoring planes */ Bool save_under; /* should bits under be saved? (popups) */ long event_mask; /* set of events that should be saved */ long do_not_propagate_mask; /* set of events that should not propagate */ Bool override_redirect; /* boolean value for override_redirect */ Colormap colormap; /* color map to be associated with window */ Cursor cursor; /* cursor to be displayed (or None) */ } XSetWindowAttributes;
![]()
Chaque masque correspond à un des champs de la structure précédente.
CWBackPixmap CWBackPixel CWBorderPixmap CWBorderPixel CWBitGravity CWWinGravity CWBackingStore CWBackingPlanes CWBackingPixel CWOverrideRedirect CWSaveUnder CWEventMask CWDontPropagate CWColormap CWCursor
![]()
XChangeWindowAttributes(3X11), XConfigureWindow(3X11), XDefineCursor(3X11), XDestroyWindow(3X11), XMapWindow(3X11), XRaiseWindow(3X11), XUnmapWindow(3X11).