/* erreur.c */ /* programme a de-boguer */ #include <stdio.h> #include <X11/Xlib.h> GC gc; Display *display; int screen; Window win, wim, root; unsigned long white_pixel, black_pixel; main() { if ((display = XOpenDisplay ("")) == NULL) { fprintf (stderr, "Can't open Display\n"); exit (1); } gc = DefaultGC (display, screen); screen = DefaultScreen (display); root = RootWindow (display, screen); white_pixel = WhitePixel (display, screen); black_pixel = BlackPixel (display, screen); win = XCreateSimpleWindow (display, root, 0, 0, 200, 150, 2, black_pixel, white_pixel); XSelectInput (display, win, ExposureMask | ButtonPressMask); XStoreName (display, win, "erreur"); XMapWindow (display, win); for (;;) { XEvent ev; XNextEvent (display, &ev); switch (ev.type) { case Expose : XDrawString (display, win, gc, 10, 30, "coucou !", 8); break; case ButtonPress : if( (ev.xbutton.x + ev.xbutton.y)%2 == 0) { XDrawString (display, win, gc, ev.xbutton.x, ev.xbutton.y, "ici", 3); XDrawString (display, win, gc, ev.xbutton.x +30, ev.xbutton.y, "la",2); } else { XDrawString (display, win, gc, ev.xbutton.x, ev.xbutton.y, "ici", 3); XDrawString (display, wim, gc, ev.xbutton.x +30, ev.xbutton.y, "la",2); }; break; default : break; } } }
cliquez dans la fenêtre jusqu'à ce que se produise l'erreur. Regardez le diagnostic d'erreur.
Le serveur envoie un événement-anomalie indiquant qu'une erreur est survenue. Le message sera reçu bien après la détection de l'erreur du fait de la communication asynchrone. Par défaut, le traitement d'une erreur associé à l'événement-anomalie est l'affichage sur stderr des informations (particulièrement les ressources en cause), puis la terminaison du programme. Il est possible d'associer un autre traitement, notamment qui poursuit l'exécution.
Copiez le programme ci-dessus. Ajouter XSynchronize et des instructions
traçantes write(1, "indication", 10), pour détecter
le moment de l'erreur, et donc l'instruction erronée.
XSynchronize
(display, bool)
int bool;
si bool = 1, passage en mode synchrone (très lent), sinon bool =
0 pour le mode asynchrone. En synchrone, elle force le vidage du tampon
de requêtes, et fait attendre le client chaque terminaison de requête.
programme suivant | index général | fonctions de la XLib | événements | types dans XLib |