Création d'une fenêtre sous X Window

 

Les fenêtres sont donc basées sur une structure arborescente: Chaque fenêtre a une fenêtre parent. Sauf une ! La root window qui est en fait l'écran.

Il y a deux méthodes de création de fenêtres: une simple et une plus complexe que vous verrez plus tard car cette dernière met en oeuvre beaucoup trop de conceptes qu'il vaut mieux étudier indivuellement...

 

Image non trouvée !Certains paramètres (par ex. x et y) ou certaines fonctions peuvent ne pas être interprétés par le gestionnaire de fenêtres (window manager) utilisé. Il faut bien comprendre que certaines fonctions que vous lançez au serveur seront renvoyées automatiquement par celui-ci vers le gestionnaire de fenêtres qui réinterpréte la fonction avant que le serveur ne l'exécute. Par exemple, si vous demandez de dessiner votre fenêtre aux coordonnées (0,0), il y a des chances pour que cela ne soit pas exécuté, d'autant plus vrai si une fenêtre se trouve déjà à cette place. Le gestionnaire de fenêtres voulant certainement faire en sorte que les fenêtres restent accessibles à l'utilisateur.

Plus simplement, vous ne faites que des souhaits (des requètes) qui seront peut-être exaucés (réinterprétées par le gestionnaire).

 

Création d'une fenêtre simplifiée

Cette fonction va vous permettre de créer rapidement une fenêtre de classe fenêtre en Input/Output. Vous l'aurez compris, il existe donc d'autres classes de fenêtres. Ces classes seront utilisables via la méthode complexe de création de fenêtre.

Window XCreateSimpleWindow (display, parent, x, y, width, height, border_width, border_color, background)
Display *display;
Window parent;
int x, y;
unsigned int width, height, border_width;
unsigned long border_color, background;

En entrée:

display est un pointeur sur la structure display alimentée au préalable lors de la connexion au serveur X par XOpenDisplay()
parent est l'identifiant de la fenêtre mêre. Dans le cas où vous voulez créer une nouvelle fenêtre sur votre écran, parent sera renseigné par la macro DefaultRootWindow () ou RootWindow ()

x et y sont les coordonées en haut à gauche de votre fenêtre.width, height étant la largeur et la hauteur de votre fenêtre.

border_width est l'épaisseur de la bordure

border_color et background seront généralement renseignées réciproquement par blackPixel() et WhitePixel()

 

En sortie:

Un identifiant sur la fenêtre qui devra être bien conservé dans un coin !

Image non trouvée !La création de la fenêtre ne la dessinera pas pour autant à l'écran ! Cette fonction ne permettant qu'une définition de votre fenêtre pour le serveur X. Cela se traduit pour la moment par une réservation de ressources qu'il ne faudra pas oublier de libérer lorsque vous n'aurez plus besoin de votre fenêtre (en générale à la fin de votre application !)

Image non trouvée !Cette fonction permettant de se créer rapidement une fenêtre, vous n'avez pas immédiatement accès à certains attributs de celle-ci. Cependant, ils pourront être modifiés par la suite via des fonctions appropriées que vous verrons plus tard.

 

Affichage de fenêtre

XMapWindow (display, w)
Display *display;
Window w;

 

Détruire une fenêtre

XUnmapWindow (display, w)
Display *display;
Window w;

Forcer l'exécution des requètes

Sous XWindow, vous envoyez des requètes au window manager. Une requète étant souvent traitée que partiellement (par exemple le positionnement que vous indiquez lors de la création d'une fenêtre peut très bien ne pas être pris en compte, alors que les dimensions le seront), peut-être totalement, tout dépendant du window Manager, mais dans tous les cas, cette requète ne sera pas traitée tout de suite...

En effet, les requètes émises sont stockées dans une file d'attente. Et ce jusqu'à ce que quelque chose force le window manager à traiter cette file.

Une solution pour forcer le traitement sera d'utiliser la fonction suivante:

XFlush (display);

Dans l'exemple qui suit création et affichage d'une fenêtre. XFlush (display) sera bien utile, car sinon, le window manager n'afficherait jamais votre fenêtre (essayez le en mettant la ligne en commentaire !)


Exemple

Image non trouvée !Création d'une fenêtre et affichage de celle-ci