Expose
Non, il ne s'agit pas d'exposer ses oeuvres d'arts.
Comme souvent dans les interfaces graphiques, l'image contenu dans une fenêtre n'est pas mémorisée. Cela consommerait trop de mémoire pour le serveur X. Dans ce cas, lorsque la fenêtre se trouve être altérée (par exemple lorsqu'une autre fenêtre se superpose dessus), son contenu est perdu. Afin que la fenêtre soit averti de cet état de fait, le serveur X va envoyer un événement. A la fenêtre de prendre en compte cet évènement ou non.
Pour que la fenêtre soit informée, celle-ci doit "s'abonner" via le bit ExposureMask positionné dans le masque d'événement.
Elle pourra ainsi recevoir le message Expose.
Une fenêtre
de type "InputOnly" ne recevra évidement jamais cet événement,
il n'y a rien à afficher !
Lorsque la fenêtre recevra le message Expose, elle trouvera dedans la région qui est altérée sous forme de rectangle dont elle recevra les coordonnées du coin supérieur gauche et la largeur et hauteur. Elle pourra ainsi redessiner ce qui se trouvait dans cette région.
Il peut arriver que plusieurs régions d'une même fenêtre soient altérée. Dans ce cas, la fenêtre recevra plusieurs Expose, une par région.
La structure de l'événement Expose est la suivante:
typedef struct {
int type; /* L'événement Expose */
unsigned long serial; /* n° de la dernière requète traité
par le serveur X */
Bool send_event; /* true si l'événement est "artificiel"
car envoyé via SendEvent() */
Display *display; /* L'identifiant du display */
Window window; /* L'identifiant de la fenêtre altérée */
int x, y; /* Coordonnées du coin supérieur gauche du rectangle
représentant la région altérée */
int width, height; /* Largeur et hauteur de la région altérée
*/
int count; /* si différent de 0, il y a d'autres régions qui sont
altérées pour cette fenêtre, la valeur indiquant le nombre
de message restant à traiter */
} XExposeEvent;
count
à zéro indique qu'il n'y aura pas d'autres "Expose"
pour cette fenêtre. Si vous ne voulez pas vous "fatiguer" avec
les régions, vous pouvez ignorer tous les Exposes dont le compteur count
est différent de 0, et ne traiter que celui qui est nul. Dans ce cas,
vous redessinez l'intégralité de la fenêtre ou encore simplement
la région englobant les régions altérées...