20 #define CLEANMASK(mask) (mask & ~(numlockmask | LockMask)) |
20 #define CLEANMASK(mask) (mask & ~(numlockmask | LockMask)) |
21 #define MOUSEMASK (BUTTONMASK | PointerMotionMask) |
21 #define MOUSEMASK (BUTTONMASK | PointerMotionMask) |
22 |
22 |
23 static void |
23 static void |
24 movemouse(Client *c) { |
24 movemouse(Client *c) { |
25 int x1, y1, ocx, ocy, di; |
25 int x1, y1, ocx, ocy, di, nx, ny; |
26 unsigned int dui; |
26 unsigned int dui; |
27 Window dummy; |
27 Window dummy; |
28 XEvent ev; |
28 XEvent ev; |
29 |
29 |
30 ocx = c->x; |
30 ocx = nx = c->x; |
31 ocy = c->y; |
31 ocy = ny = c->y; |
32 if(XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync, |
32 if(XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync, |
33 None, cursor[CurMove], CurrentTime) != GrabSuccess) |
33 None, cursor[CurMove], CurrentTime) != GrabSuccess) |
34 return; |
34 return; |
35 c->ismax = False; |
35 c->ismax = False; |
36 XQueryPointer(dpy, root, &dummy, &dummy, &x1, &y1, &di, &di, &dui); |
36 XQueryPointer(dpy, root, &dummy, &dummy, &x1, &y1, &di, &di, &dui); |
37 for(;;) { |
37 for(;;) { |
38 XMaskEvent(dpy, MOUSEMASK | ExposureMask | SubstructureRedirectMask, &ev); |
38 XMaskEvent(dpy, MOUSEMASK | ExposureMask | SubstructureRedirectMask, &ev); |
39 switch (ev.type) { |
39 switch (ev.type) { |
40 case ButtonRelease: |
40 case ButtonRelease: |
41 resize(c, True); |
|
42 XUngrabPointer(dpy, CurrentTime); |
41 XUngrabPointer(dpy, CurrentTime); |
43 return; |
42 return; |
44 case ConfigureRequest: |
43 case ConfigureRequest: |
45 case Expose: |
44 case Expose: |
46 case MapRequest: |
45 case MapRequest: |
47 handler[ev.type](&ev); |
46 handler[ev.type](&ev); |
48 break; |
47 break; |
49 case MotionNotify: |
48 case MotionNotify: |
50 XSync(dpy, False); |
49 XSync(dpy, False); |
51 c->x = ocx + (ev.xmotion.x - x1); |
50 nx = ocx + (ev.xmotion.x - x1); |
52 c->y = ocy + (ev.xmotion.y - y1); |
51 ny = ocy + (ev.xmotion.y - y1); |
53 if(abs(wax + c->x) < SNAP) |
52 if(abs(wax + nx) < SNAP) |
54 c->x = wax; |
53 nx = wax; |
55 else if(abs((wax + waw) - (c->x + c->w + 2 * c->border)) < SNAP) |
54 else if(abs((wax + waw) - (nx + c->w + 2 * c->border)) < SNAP) |
56 c->x = wax + waw - c->w - 2 * c->border; |
55 nx = wax + waw - c->w - 2 * c->border; |
57 if(abs(way - c->y) < SNAP) |
56 if(abs(way - ny) < SNAP) |
58 c->y = way; |
57 ny = way; |
59 else if(abs((way + wah) - (c->y + c->h + 2 * c->border)) < SNAP) |
58 else if(abs((way + wah) - (ny + c->h + 2 * c->border)) < SNAP) |
60 c->y = way + wah - c->h - 2 * c->border; |
59 ny = way + wah - c->h - 2 * c->border; |
61 resize(c, False); |
60 resize(c, nx, ny, c->w, c->h, False); |
62 break; |
61 break; |
63 } |
62 } |
64 } |
63 } |
65 } |
64 } |
66 |
65 |
79 XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w + c->border - 1, c->h + c->border - 1); |
78 XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w + c->border - 1, c->h + c->border - 1); |
80 for(;;) { |
79 for(;;) { |
81 XMaskEvent(dpy, MOUSEMASK | ExposureMask | SubstructureRedirectMask , &ev); |
80 XMaskEvent(dpy, MOUSEMASK | ExposureMask | SubstructureRedirectMask , &ev); |
82 switch(ev.type) { |
81 switch(ev.type) { |
83 case ButtonRelease: |
82 case ButtonRelease: |
84 resize(c, True); |
|
85 XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, |
83 XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, |
86 c->w + c->border - 1, c->h + c->border - 1); |
84 c->w + c->border - 1, c->h + c->border - 1); |
87 XUngrabPointer(dpy, CurrentTime); |
85 XUngrabPointer(dpy, CurrentTime); |
88 while(XCheckMaskEvent(dpy, EnterWindowMask, &ev)); |
86 while(XCheckMaskEvent(dpy, EnterWindowMask, &ev)); |
89 return; |
87 return; |