Xlib: les évènements


Les masques d'évènements :

Les Clients demandent à recevoir des évènements par des masques à l'aide de fonctions telles que XSelectInput(display, w, event_mask);

Exemple :



  /* La fenêtre sera sensible à un changement d'exposition, aux entrées clavier
     aux clicks souris, au changement de taille (Structure), et aux 
     déplacement du curseur */

  XSelectInput(display, win, ExposureMask | KeyPressMask |
	       ButtonPressMask | StructureNotifyMask | PointerMotionMask);


Les routines de lecture :

Le traitement des évènements se fait à l'aide de routines de lecture spécialisées :

La boucle de gestion des évènements :

Après la création et le mapping des fenêtres, les Clients doivent boucler et agir en fonction des évènements reçus :




    XEvent report;

    while(1) {
        XNextEvent(display, &report);
        switch (report.type) {
        case Expose:
            /* traitement des évènements de type Expose */
            break;
        case ButtonPress:
            /* traitement des évènements de type ButtonPress */
            break;
        case KeyPress:
            /* traitement des évènements de type KeyPress */
            break;
        case ConfigureNotify:
            /* traitement des évènements de type ConfigureNotify */
            break;
        }
    }


Les différents types d'événements

Il existe de très nombreux événements, cependant nous ne nous servons généralement que des quatre ou cinq plus utiles.

La structure ci-dessous, tirée du manuel, vous permet de connaître tous les types d'événements. On accédera aux informations retournées par ces événements en accèdant au champs correspondant de la structure.

Ne pas confondre :

Le champ type de la structure XEvent. permet de tester le type de chaque événement reçu.



   typedef union _XEvent {
          int type;                /* must not be changed */
          XAnyEvent xany;
          XKeyEvent xkey;
          XButtonEvent xbutton;
          XMotionEvent xmotion;
          XCrossingEvent xcrossing;
          XFocusChangeEvent xfocus;
          XExposeEvent xexpose;
          XGraphicsExposeEvent xgraphicsexpose;
          XNoExposeEvent xnoexpose;
          XVisibilityEvent xvisibility;
          XCreateWindowEvent xcreatewindow;
          XDestroyWindowEvent xdestroywindow;
          XUnmapEvent xunmap;
          XMapEvent xmap;
          XMapRequestEvent xmaprequest;
          XReparentEvent xreparent;
          XConfigureEvent xconfigure;
          XGravityEvent xgravity;
          XResizeRequestEvent xresizerequest;
          XConfigureRequestEvent xconfigurerequest;
          XCirculateEvent xcirculate;
          XCirculateRequestEvent xcirculaterequest;
          XPropertyEvent xproperty;
          XSelectionClearEvent xselectionclear;
          XSelectionRequestEvent xselectionrequest;
          XSelectionEvent xselection;
          XColormapEvent xcolormap;
          XClientMessageEvent xclient;
          XMappingEvent xmapping;
          XErrorEvent xerror;
          XKeymapEvent xkeymap;
          long pad[24];
     } XEvent;



michel.buffa@essi.fr