/* pointer.c */ /* mouvement de souris */ #include <stdio.h> #include <string.h> #include <X11/Xlib.h> #include <X11/Xutil.h> GC gc; Display *display; int screen; Window win, root, wbidon; unsigned long white_pixel, black_pixel; XSetWindowAttributes xattrib; unsigned int ubidon; int x, y, bidon, i = 0; 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, 100, 5, black_pixel, white_pixel); XSelectInput (display, win, PointerMotionMask | ButtonPressMask | ExposureMask); XStoreName (display, win, "pointer"); XMapWindow (display, win); for (;;) { XEvent ev; char buf[40]; XNextEvent (display, &ev); switch (ev.type) { case Expose : XDrawString (display, win, gc, 10, 30, "1 2", 21); break ; case MotionNotify : sprintf (buf, "time: %ld x: %d y: %d\n", ev.xmotion.time, ev.xmotion.x, ev.xmotion.y); write(1, buf, strlen(buf)); break ; case ButtonPress : XQueryPointer (display, win, &wbidon, &wbidon, &bidon, &bidon, &x, &y, &ubidon); sprintf (buf, "x: %d y: %d\n", x, y); write(1, buf, strlen(buf)); if (i == 0) { xattrib.event_mask = PointerMotionMask | ButtonPressMask | ExposureMask | PointerMotionHintMask ; XChangeWindowAttributes (display, win, CWEventMask, &xattrib); i = 1 ; write(1, "PointerMotionHintMask actif\n", 28); } else { xattrib.event_mask= PointerMotionMask | ButtonPressMask | ExposureMask ; XChangeWindowAttributes (display, win, CWEventMask, &xattrib); i = 0 ; write(1, "PointerMotionHintMask non actif\n", 32); } default : break; } } }
Bougez votre souris du chiffre 1 au chiffre 2. Regardez les événements "mouvement de souris" s'afficher. Cliquez sur le chiffre 1 puis sur le chiffre 2 pour changer de mode d'émission des evenements. Regardez encore les événements "mouvement de souris" s'afficher.
Le nombre d'événement de déplacement souris est très important. Pour ne pas ralentir le programme client, il est possible de se limiter aux événements "déplacement" au moment de pressage d'un bouton, sortie de fenêtre, .... Cela grace au masque PointerMotionHintMask.
Il s'agit de bouger un rectangle avec la souris. Le rectangle suivra le pointeur dès que vous aurez cliquez dedans et s'immobilisera dès que vous relacherez le bouton.
programme suivant | index général | fonctions de la XLib | événements | types dans XLib |