mouse.c
changeset 26 e8f627998d6f
parent 20 4560e0882c1d
child 31 386649deb651
equal deleted inserted replaced
25:e238dc4844d7 26:e8f627998d6f
    43 	old_cx = c->x;
    43 	old_cx = c->x;
    44 	old_cy = c->y;
    44 	old_cy = c->y;
    45 	if(XGrabPointer(dpy, root, False, MouseMask, GrabModeAsync, GrabModeAsync,
    45 	if(XGrabPointer(dpy, root, False, MouseMask, GrabModeAsync, GrabModeAsync,
    46 				None, cursor[CurResize], CurrentTime) != GrabSuccess)
    46 				None, cursor[CurResize], CurrentTime) != GrabSuccess)
    47 		return;
    47 		return;
    48 	XGrabServer(dpy);
       
    49 	XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w, c->h);
    48 	XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w, c->h);
    50 	for(;;) {
    49 	for(;;) {
    51 		XMaskEvent(dpy, MouseMask, &ev);
    50 		XMaskEvent(dpy, MouseMask | ExposureMask, &ev);
    52 		switch(ev.type) {
    51 		switch(ev.type) {
    53 		default: break;
    52 		default: break;
       
    53 		case Expose:
       
    54 			handler[Expose](&ev);
       
    55 			break;
    54 		case MotionNotify:
    56 		case MotionNotify:
    55 			XUngrabServer(dpy);
    57 			XFlush(dpy);
    56 			mmatch(c, old_cx, old_cy, ev.xmotion.x, ev.xmotion.y);
    58 			mmatch(c, old_cx, old_cy, ev.xmotion.x, ev.xmotion.y);
    57 			XResizeWindow(dpy, c->win, c->w, c->h);
    59 			XResizeWindow(dpy, c->win, c->w, c->h);
    58 			XGrabServer(dpy);
       
    59 			break;
    60 			break;
    60 		case ButtonRelease:
    61 		case ButtonRelease:
    61 			resize(c);
    62 			resize(c);
    62 			XUngrabServer(dpy);
       
    63 			XUngrabPointer(dpy, CurrentTime);
    63 			XUngrabPointer(dpy, CurrentTime);
    64 			return;
    64 			return;
    65 		}
    65 		}
    66 	}
    66 	}
    67 }
    67 }
    78 	old_cy = c->y;
    78 	old_cy = c->y;
    79 	if(XGrabPointer(dpy, root, False, MouseMask, GrabModeAsync, GrabModeAsync,
    79 	if(XGrabPointer(dpy, root, False, MouseMask, GrabModeAsync, GrabModeAsync,
    80 				None, cursor[CurMove], CurrentTime) != GrabSuccess)
    80 				None, cursor[CurMove], CurrentTime) != GrabSuccess)
    81 		return;
    81 		return;
    82 	XQueryPointer(dpy, root, &dummy, &dummy, &x1, &y1, &di, &di, &dui);
    82 	XQueryPointer(dpy, root, &dummy, &dummy, &x1, &y1, &di, &di, &dui);
    83 	XGrabServer(dpy);
       
    84 	for(;;) {
    83 	for(;;) {
    85 		XMaskEvent(dpy, MouseMask, &ev);
    84 		XMaskEvent(dpy, MouseMask | ExposureMask, &ev);
    86 		switch (ev.type) {
    85 		switch (ev.type) {
    87 		default: break;
    86 		default: break;
       
    87 		case Expose:
       
    88 			handler[Expose](&ev);
       
    89 			break;
    88 		case MotionNotify:
    90 		case MotionNotify:
    89 			XUngrabServer(dpy);
    91 			XFlush(dpy);
    90 			c->x = old_cx + (ev.xmotion.x - x1);
    92 			c->x = old_cx + (ev.xmotion.x - x1);
    91 			c->y = old_cy + (ev.xmotion.y - y1);
    93 			c->y = old_cy + (ev.xmotion.y - y1);
    92 			XMoveResizeWindow(dpy, c->win, c->x, c->y, c->w, c->h);
    94 			XMoveResizeWindow(dpy, c->win, c->x, c->y, c->w, c->h);
    93 			XGrabServer(dpy);
       
    94 			break;
    95 			break;
    95 		case ButtonRelease:
    96 		case ButtonRelease:
    96 			resize(c);
    97 			resize(c);
    97 			XUngrabServer(dpy);
       
    98 			XUngrabPointer(dpy, CurrentTime);
    98 			XUngrabPointer(dpy, CurrentTime);
    99 			return;
    99 			return;
   100 		}
   100 		}
   101 	}
   101 	}
   102 }
   102 }