Correction de moverec2.c

/* moverec2.c EXERCICE */

/* bouger un rectangle avec la souris */

#include <stdio.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>

GC      gc1, gc2; 
Display *display; 
int     screen; 
Window  win,  root; 
unsigned long white_pixel, black_pixel,  val_gc_masq;
XGCValues gc_valeurs; 
int x1, x2, y1, y2, decalx, decaly, mouvement;
  
main() { 
  display = XOpenDisplay ("");
  screen = DefaultScreen (display); 
  root = RootWindow (display, screen); 
  white_pixel = WhitePixel (display, screen); 
  black_pixel = BlackPixel (display, screen); 
  win = XCreateSimpleWindow (display, root,  
			     0, 0, 300, 300, 5, black_pixel, white_pixel); 
  XSelectInput (display, win, ButtonPressMask | ButtonReleaseMask |
		PointerMotionMask | ExposureMask); 
  XStoreName (display, win, "moverec2"); 
  XMapWindow (display, win);
  val_gc_masq = 0;
  gc_valeurs.background = white_pixel;
  val_gc_masq = val_gc_masq | GCBackground ;
  gc_valeurs.foreground = black_pixel;
  val_gc_masq = val_gc_masq | GCForeground ;
  gc_valeurs.line_width = 3;
  val_gc_masq = val_gc_masq | GCLineWidth ;
  gc_valeurs.plane_mask = black_pixel ^ white_pixel;
  val_gc_masq = val_gc_masq | GCPlaneMask ;
  gc1 = XCreateGC (display, win, val_gc_masq, &gc_valeurs);
  gc2 = XCreateGC (display, win, val_gc_masq, &gc_valeurs);
  XSetFunction (display, gc1, GXcopy);
  XSetFunction (display, gc2, GXinvert);
  x1 = y1 = 10;
  mouvement = 0;
 
  for (;;) { 
    XEvent ev; 
    XNextEvent (display, &ev); 
    switch (ev.type) { 
    case Expose :
      XDrawRectangle (display, win, gc1, x1, y1, 40, 40);
      break;
    case ButtonPress : 
      if ((mouvement == 0) && (ev.xbutton.x - x1 < 40)
	  && (ev.xbutton.x - x1 >= 0) && (ev.xbutton.y - y1 < 40)
	  && (ev.xbutton.y - y1 >= 0)) {
	decalx = ev.xbutton.x - x1;
	decaly = ev.xbutton.y - y1;
	mouvement = 1;
      }
      break;
    case ButtonRelease : 
      if (mouvement == 1)
	mouvement = 0;
      break;
    case MotionNotify : 
      if (mouvement == 1) {
	x2 = ev.xbutton.x ;
	y2 = ev.xbutton.y ;
	XDrawRectangle (display, win, gc2, x1, y1, 40, 40);
	x1 = x2 - decalx;
	y1 = y2 - decaly;
	XDrawRectangle (display, win, gc1, x1, y1, 40, 40);
      }
      break;
    default : 
      break;            
    } 
  } 
} 

chapître de l'exercice index général fonctions de la XLib événements types dans XLib