19 KEYS |
19 KEYS |
20 |
20 |
21 #define CLEANMASK(mask) (mask & ~(numlockmask | LockMask)) |
21 #define CLEANMASK(mask) (mask & ~(numlockmask | LockMask)) |
22 |
22 |
23 static void |
23 static void |
|
24 synconfig(Client *c, int x, int y, int w, int h, unsigned int border) { |
|
25 XEvent synev; |
|
26 |
|
27 synev.type = ConfigureNotify; |
|
28 synev.xconfigure.display = dpy; |
|
29 synev.xconfigure.event = c->win; |
|
30 synev.xconfigure.window = c->win; |
|
31 synev.xconfigure.x = x; |
|
32 synev.xconfigure.y = y; |
|
33 synev.xconfigure.width = w; |
|
34 synev.xconfigure.height = h; |
|
35 synev.xconfigure.border_width = border; |
|
36 synev.xconfigure.above = None; |
|
37 XSendEvent(dpy, c->win, True, NoEventMask, &synev); |
|
38 } |
|
39 |
|
40 static void |
24 movemouse(Client *c) { |
41 movemouse(Client *c) { |
25 int x1, y1, ocx, ocy, di; |
42 int x1, y1, ocx, ocy, di; |
26 unsigned int dui; |
43 unsigned int dui; |
27 Window dummy; |
44 Window dummy; |
28 XEvent ev; |
45 XEvent ev; |
32 if(XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync, |
49 if(XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync, |
33 None, cursor[CurMove], CurrentTime) != GrabSuccess) |
50 None, cursor[CurMove], CurrentTime) != GrabSuccess) |
34 return; |
51 return; |
35 XQueryPointer(dpy, root, &dummy, &dummy, &x1, &y1, &di, &di, &dui); |
52 XQueryPointer(dpy, root, &dummy, &dummy, &x1, &y1, &di, &di, &dui); |
36 for(;;) { |
53 for(;;) { |
37 XMaskEvent(dpy, MOUSEMASK | ExposureMask, &ev); |
54 XMaskEvent(dpy, MOUSEMASK | ExposureMask | StructureNotifyMask, &ev); |
38 switch (ev.type) { |
55 switch (ev.type) { |
39 default: |
56 default: |
|
57 break; |
|
58 case ConfigureRequest: |
|
59 synconfig(c, c->x, c->y, c->w, c->h, ev.xconfigure.border_width); |
|
60 XSync(dpy, False); |
40 break; |
61 break; |
41 case Expose: |
62 case Expose: |
42 handler[Expose](&ev); |
63 handler[Expose](&ev); |
43 break; |
64 break; |
44 case MotionNotify: |
65 case MotionNotify: |
47 c->y = ocy + (ev.xmotion.y - y1); |
68 c->y = ocy + (ev.xmotion.y - y1); |
48 resize(c, False, TopLeft); |
69 resize(c, False, TopLeft); |
49 break; |
70 break; |
50 case ButtonRelease: |
71 case ButtonRelease: |
51 XUngrabPointer(dpy, CurrentTime); |
72 XUngrabPointer(dpy, CurrentTime); |
|
73 return; |
|
74 case DestroyNotify: |
|
75 case UnmapNotify: |
|
76 XUngrabPointer(dpy, CurrentTime); |
|
77 handler[ev.type](&ev); |
52 return; |
78 return; |
53 } |
79 } |
54 } |
80 } |
55 } |
81 } |
56 |
82 |
66 if(XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync, |
92 if(XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync, |
67 None, cursor[CurResize], CurrentTime) != GrabSuccess) |
93 None, cursor[CurResize], CurrentTime) != GrabSuccess) |
68 return; |
94 return; |
69 XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w, c->h); |
95 XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w, c->h); |
70 for(;;) { |
96 for(;;) { |
71 XMaskEvent(dpy, MOUSEMASK | ExposureMask, &ev); |
97 XMaskEvent(dpy, MOUSEMASK | ExposureMask | StructureNotifyMask, &ev); |
72 switch(ev.type) { |
98 switch(ev.type) { |
73 default: |
99 default: |
|
100 break; |
|
101 case ConfigureRequest: |
|
102 synconfig(c, c->x, c->y, c->w, c->h, ev.xconfigure.border_width); |
|
103 XSync(dpy, False); |
74 break; |
104 break; |
75 case Expose: |
105 case Expose: |
76 handler[Expose](&ev); |
106 handler[Expose](&ev); |
77 break; |
107 break; |
78 case MotionNotify: |
108 case MotionNotify: |
89 sticky = (ocy <= ev.xmotion.y) ? TopRight : BotRight; |
119 sticky = (ocy <= ev.xmotion.y) ? TopRight : BotRight; |
90 resize(c, True, sticky); |
120 resize(c, True, sticky); |
91 break; |
121 break; |
92 case ButtonRelease: |
122 case ButtonRelease: |
93 XUngrabPointer(dpy, CurrentTime); |
123 XUngrabPointer(dpy, CurrentTime); |
|
124 return; |
|
125 case DestroyNotify: |
|
126 case UnmapNotify: |
|
127 XUngrabPointer(dpy, CurrentTime); |
|
128 handler[ev.type](&ev); |
94 return; |
129 return; |
95 } |
130 } |
96 } |
131 } |
97 } |
132 } |
98 |
133 |
141 else if(ev->button == Button3 && (arrange == dofloat || c->isfloat)) { |
176 else if(ev->button == Button3 && (arrange == dofloat || c->isfloat)) { |
142 restack(c); |
177 restack(c); |
143 resizemouse(c); |
178 resizemouse(c); |
144 } |
179 } |
145 } |
180 } |
146 } |
|
147 |
|
148 static void |
|
149 synconfig(Client *c, int x, int y, int w, int h, unsigned int border) { |
|
150 XEvent synev; |
|
151 |
|
152 synev.type = ConfigureNotify; |
|
153 synev.xconfigure.display = dpy; |
|
154 synev.xconfigure.event = c->win; |
|
155 synev.xconfigure.window = c->win; |
|
156 synev.xconfigure.x = x; |
|
157 synev.xconfigure.y = y; |
|
158 synev.xconfigure.width = w; |
|
159 synev.xconfigure.height = h; |
|
160 synev.xconfigure.border_width = border; |
|
161 synev.xconfigure.above = None; |
|
162 XSendEvent(dpy, c->win, True, NoEventMask, &synev); |
|
163 } |
181 } |
164 |
182 |
165 static void |
183 static void |
166 configurerequest(XEvent *e) { |
184 configurerequest(XEvent *e) { |
167 unsigned long newmask; |
185 unsigned long newmask; |