changeset 489 | d34374cbe926 |
parent 488 | 0d2559f46b9e |
child 490 | 303d3384720e |
488:0d2559f46b9e | 489:d34374cbe926 |
---|---|
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 |
|
41 movemouse(Client *c) { |
24 movemouse(Client *c) { |
42 int x1, y1, ocx, ocy, di; |
25 int x1, y1, ocx, ocy, di; |
43 unsigned int dui; |
26 unsigned int dui; |
44 Window dummy; |
27 Window dummy; |
45 XEvent ev; |
28 XEvent ev; |
50 None, cursor[CurMove], CurrentTime) != GrabSuccess) |
33 None, cursor[CurMove], CurrentTime) != GrabSuccess) |
51 return; |
34 return; |
52 c->ismax = False; |
35 c->ismax = False; |
53 XQueryPointer(dpy, root, &dummy, &dummy, &x1, &y1, &di, &di, &dui); |
36 XQueryPointer(dpy, root, &dummy, &dummy, &x1, &y1, &di, &di, &dui); |
54 for(;;) { |
37 for(;;) { |
55 XMaskEvent(dpy, MOUSEMASK | ExposureMask | StructureNotifyMask, &ev); |
38 XMaskEvent(dpy, MOUSEMASK | ExposureMask, &ev); |
56 switch (ev.type) { |
39 switch (ev.type) { |
57 default: |
|
58 break; |
|
59 case ConfigureRequest: |
|
60 synconfig(c, c->x, c->y, c->w, c->h, ev.xconfigure.border_width); |
|
61 XSync(dpy, False); |
|
62 break; |
|
63 case Expose: |
40 case Expose: |
64 handler[Expose](&ev); |
41 handler[Expose](&ev); |
65 break; |
42 break; |
66 case MotionNotify: |
43 case MotionNotify: |
67 XSync(dpy, False); |
44 XSync(dpy, False); |
70 resize(c, False, TopLeft); |
47 resize(c, False, TopLeft); |
71 break; |
48 break; |
72 case ButtonRelease: |
49 case ButtonRelease: |
73 XUngrabPointer(dpy, CurrentTime); |
50 XUngrabPointer(dpy, CurrentTime); |
74 return; |
51 return; |
75 case DestroyNotify: |
|
76 case UnmapNotify: |
|
77 XUngrabPointer(dpy, CurrentTime); |
|
78 handler[ev.type](&ev); |
|
79 return; |
|
80 } |
52 } |
81 } |
53 } |
82 } |
54 } |
83 |
55 |
84 static void |
56 static void |
94 None, cursor[CurResize], CurrentTime) != GrabSuccess) |
66 None, cursor[CurResize], CurrentTime) != GrabSuccess) |
95 return; |
67 return; |
96 c->ismax = False; |
68 c->ismax = False; |
97 XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w, c->h); |
69 XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w, c->h); |
98 for(;;) { |
70 for(;;) { |
99 XMaskEvent(dpy, MOUSEMASK | ExposureMask | StructureNotifyMask, &ev); |
71 XMaskEvent(dpy, MOUSEMASK | ExposureMask, &ev); |
100 switch(ev.type) { |
72 switch(ev.type) { |
101 default: |
|
102 break; |
|
103 case ConfigureRequest: |
|
104 synconfig(c, c->x, c->y, c->w, c->h, ev.xconfigure.border_width); |
|
105 XSync(dpy, False); |
|
106 break; |
|
107 case Expose: |
73 case Expose: |
108 handler[Expose](&ev); |
74 handler[Expose](&ev); |
109 break; |
75 break; |
110 case MotionNotify: |
76 case MotionNotify: |
111 XSync(dpy, False); |
77 XSync(dpy, False); |
122 resize(c, True, sticky); |
88 resize(c, True, sticky); |
123 break; |
89 break; |
124 case ButtonRelease: |
90 case ButtonRelease: |
125 XUngrabPointer(dpy, CurrentTime); |
91 XUngrabPointer(dpy, CurrentTime); |
126 return; |
92 return; |
127 case DestroyNotify: |
|
128 case UnmapNotify: |
|
129 XUngrabPointer(dpy, CurrentTime); |
|
130 handler[ev.type](&ev); |
|
131 return; |
|
132 } |
93 } |
133 } |
94 } |
134 } |
95 } |
135 |
96 |
136 static void |
97 static void |
185 static void |
146 static void |
186 configurerequest(XEvent *e) { |
147 configurerequest(XEvent *e) { |
187 unsigned long newmask; |
148 unsigned long newmask; |
188 Client *c; |
149 Client *c; |
189 XConfigureRequestEvent *ev = &e->xconfigurerequest; |
150 XConfigureRequestEvent *ev = &e->xconfigurerequest; |
151 XEvent synev; |
|
190 XWindowChanges wc; |
152 XWindowChanges wc; |
191 |
153 |
192 if((c = getclient(ev->window))) { |
154 if((c = getclient(ev->window))) { |
193 c->ismax = False; |
155 c->ismax = False; |
194 gravitate(c, True); |
156 gravitate(c, True); |
208 wc.width = c->w; |
170 wc.width = c->w; |
209 wc.height = c->h; |
171 wc.height = c->h; |
210 newmask = ev->value_mask & (~(CWSibling | CWStackMode | CWBorderWidth)); |
172 newmask = ev->value_mask & (~(CWSibling | CWStackMode | CWBorderWidth)); |
211 if(newmask) |
173 if(newmask) |
212 XConfigureWindow(dpy, c->win, newmask, &wc); |
174 XConfigureWindow(dpy, c->win, newmask, &wc); |
213 else |
175 else { |
214 synconfig(c, c->x, c->y, c->w, c->h, c->border); |
176 synev.type = ConfigureNotify; |
177 synev.xconfigure.display = dpy; |
|
178 synev.xconfigure.event = c->win; |
|
179 synev.xconfigure.window = c->win; |
|
180 synev.xconfigure.x = c->x; |
|
181 synev.xconfigure.y = c->y; |
|
182 synev.xconfigure.width = c->w; |
|
183 synev.xconfigure.height = c->h; |
|
184 synev.xconfigure.border_width = c->border; |
|
185 synev.xconfigure.above = None; |
|
186 XSendEvent(dpy, c->win, True, NoEventMask, &synev); |
|
187 } |
|
215 XSync(dpy, False); |
188 XSync(dpy, False); |
216 if(c->isfloat) |
189 if(c->isfloat) |
217 resize(c, False, TopLeft); |
190 resize(c, False, TopLeft); |
218 else |
191 else |
219 arrange(NULL); |
192 arrange(NULL); |