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...
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 !
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 !)
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
Création
d'une fenêtre et affichage de celle-ci