mouvement de souris

/* 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;
    } 
  } 
}

Exécution :

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.

Fonctionnement de ce programme :

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.

Exercice moverec2.c :

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