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