Boucle d'attente d'événements
Lecture avec attente d'un événement avec extraction de celui-ci de la file
Nous savons déjà que les applications développées sous X Window utilisent le principe du pilotage par événements. L'application sera ainsi influencée par les actions de l'utilisateur par des événements de manière asynchrone (Voir chapitre introduction).
Les
événements dont nous parlons ne sont pas des événements
qui peuvent interrompre votre application à tout moment (comme peuvent
l'être les signaux envoyés par
le système). En fait, le serveur envoie un événement
qui sera stocké dans une file d'événements (ou files
messages IPC sous Unix ou de messages
Windows par similitude à Windows de Microsoft). A notre application
de lire régulièrement cette file d'événements afin
d'effectuer ou non un traitement correspondant à cet événement.
La fonction de lecture de la file des événements est la suivante:
int XNextEvent(Display *display, XEvent *Evenement);
En entrée:
Nous ne présentons plus display...
Evènement: Union C. Contiendra l'événement envoyé par le serveur. L'événement sera supprimé de la file d'attente.
Pour éviter
des erreurs, mettez "memset(&Evenement, 0, sizeof(XEvent));" avant
de lire le message...
En sortie:
Le résultat est 0 si un événement a pu être prélevé.
Quand
vous lancez cette fonction, celle-ci ne vous rendra la main que lorsqu'un événement
sera à traiter !
Vérifier qu'il existe un événement à traiter dans la file des événements
Il existe donc une autre fonction qui va vous indiquer la présence ou non d'un événement à traiter, afin de ne pas être bloqué dans cette fonction XNextEvent () alors que vous pourriez faire autre chose !
int XPending(display)
Display *display;
Cette fonction retourne le nombre d'événements reçus du serveur, mais non retirés de la liste des événements (donc non traités ! équivalent de faire XEventsQueued() avec le mode QueuedAfterFlush).
Exemple
Lecture avec attente d'un événement sans extraction de celui-ci de la file