Xlib: les fenêtres (window)


Dernière modification : 03/11/96

Table des matières

Caractèristiques des fenêtres

Généralités

Autres caractèristiques

Les caractèristiques Depth et Visual Type

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 :

Classe d'une fenêtre

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 :

Attributs des fenêtres

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 :

Pour créer une fenêtre

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...)

Créer une fenêtre quelconque

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 :

Il existe une manière plus simple pour créer une fenêtre

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 :

Un peu plus d'informations

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.

Structure XSetWindowAttributes (tirée du manuel):



 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;


Noms des masques pour valuemask :

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


Voir aussi les fonctions suivantes

XChangeWindowAttributes(3X11), XConfigureWindow(3X11), XDefineCursor(3X11), XDestroyWindow(3X11), XMapWindow(3X11), XRaiseWindow(3X11), XUnmapWindow(3X11).


michel.buffa@essi.fr