35 return; |
34 return; |
36 XQueryPointer(dpy, root, &dummy, &dummy, &x1, &y1, &di, &di, &dui); |
35 XQueryPointer(dpy, root, &dummy, &dummy, &x1, &y1, &di, &di, &dui); |
37 for(;;) { |
36 for(;;) { |
38 XMaskEvent(dpy, MOUSEMASK | ExposureMask, &ev); |
37 XMaskEvent(dpy, MOUSEMASK | ExposureMask, &ev); |
39 switch (ev.type) { |
38 switch (ev.type) { |
40 default: break; |
39 default: |
|
40 break; |
41 case Expose: |
41 case Expose: |
42 handler[Expose](&ev); |
42 handler[Expose](&ev); |
43 break; |
43 break; |
44 case MotionNotify: |
44 case MotionNotify: |
45 XSync(dpy, False); |
45 XSync(dpy, False); |
69 return; |
68 return; |
70 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); |
71 for(;;) { |
70 for(;;) { |
72 XMaskEvent(dpy, MOUSEMASK | ExposureMask, &ev); |
71 XMaskEvent(dpy, MOUSEMASK | ExposureMask, &ev); |
73 switch(ev.type) { |
72 switch(ev.type) { |
74 default: break; |
73 default: |
|
74 break; |
75 case Expose: |
75 case Expose: |
76 handler[Expose](&ev); |
76 handler[Expose](&ev); |
77 break; |
77 break; |
78 case MotionNotify: |
78 case MotionNotify: |
79 XSync(dpy, False); |
79 XSync(dpy, False); |
145 } |
144 } |
146 } |
145 } |
147 } |
146 } |
148 |
147 |
149 static void |
148 static void |
150 synconfig(Client *c, int x, int y, int w, int h, unsigned int border) |
149 synconfig(Client *c, int x, int y, int w, int h, unsigned int border) { |
151 { |
|
152 XEvent synev; |
150 XEvent synev; |
153 |
151 |
154 synev.type = ConfigureNotify; |
152 synev.type = ConfigureNotify; |
155 synev.xconfigure.display = dpy; |
153 synev.xconfigure.display = dpy; |
156 synev.xconfigure.event = c->win; |
154 synev.xconfigure.event = c->win; |
163 synev.xconfigure.above = None; |
161 synev.xconfigure.above = None; |
164 XSendEvent(dpy, c->win, True, NoEventMask, &synev); |
162 XSendEvent(dpy, c->win, True, NoEventMask, &synev); |
165 } |
163 } |
166 |
164 |
167 static void |
165 static void |
168 configurerequest(XEvent *e) |
166 configurerequest(XEvent *e) { |
169 { |
|
170 unsigned long newmask; |
167 unsigned long newmask; |
171 Client *c; |
168 Client *c; |
172 XConfigureRequestEvent *ev = &e->xconfigurerequest; |
169 XConfigureRequestEvent *ev = &e->xconfigurerequest; |
173 XWindowChanges wc; |
170 XWindowChanges wc; |
174 |
171 |
217 XSync(dpy, False); |
214 XSync(dpy, False); |
218 } |
215 } |
219 } |
216 } |
220 |
217 |
221 static void |
218 static void |
222 destroynotify(XEvent *e) |
219 destroynotify(XEvent *e) { |
223 { |
|
224 Client *c; |
220 Client *c; |
225 XDestroyWindowEvent *ev = &e->xdestroywindow; |
221 XDestroyWindowEvent *ev = &e->xdestroywindow; |
226 |
222 |
227 if((c = getclient(ev->window))) |
223 if((c = getclient(ev->window))) |
228 unmanage(c); |
224 unmanage(c); |
229 } |
225 } |
230 |
226 |
231 static void |
227 static void |
232 enternotify(XEvent *e) |
228 enternotify(XEvent *e) { |
233 { |
|
234 Client *c; |
229 Client *c; |
235 XCrossingEvent *ev = &e->xcrossing; |
230 XCrossingEvent *ev = &e->xcrossing; |
236 |
231 |
237 if(ev->mode != NotifyNormal || ev->detail == NotifyInferior) |
232 if(ev->mode != NotifyNormal || ev->detail == NotifyInferior) |
238 return; |
233 return; |
259 drawtitle(c); |
253 drawtitle(c); |
260 } |
254 } |
261 } |
255 } |
262 |
256 |
263 static void |
257 static void |
264 keypress(XEvent *e) |
258 keypress(XEvent *e) { |
265 { |
|
266 static unsigned int len = sizeof(key) / sizeof(key[0]); |
259 static unsigned int len = sizeof(key) / sizeof(key[0]); |
267 unsigned int i; |
260 unsigned int i; |
268 KeySym keysym; |
261 KeySym keysym; |
269 XKeyEvent *ev = &e->xkey; |
262 XKeyEvent *ev = &e->xkey; |
270 |
263 |
271 keysym = XKeycodeToKeysym(dpy, (KeyCode)ev->keycode, 0); |
264 keysym = XKeycodeToKeysym(dpy, (KeyCode)ev->keycode, 0); |
272 for(i = 0; i < len; i++) { |
265 for(i = 0; i < len; i++) { |
273 if(keysym == key[i].keysym && |
266 if(keysym == key[i].keysym |
274 CLEANMASK(key[i].mod) == CLEANMASK(ev->state)) |
267 && CLEANMASK(key[i].mod) == CLEANMASK(ev->state)) |
275 { |
268 { |
276 if(key[i].func) |
269 if(key[i].func) |
277 key[i].func(&key[i].arg); |
270 key[i].func(&key[i].arg); |
278 return; |
271 return; |
279 } |
272 } |
280 } |
273 } |
281 } |
274 } |
282 |
275 |
283 static void |
276 static void |
284 leavenotify(XEvent *e) |
277 leavenotify(XEvent *e) { |
285 { |
|
286 XCrossingEvent *ev = &e->xcrossing; |
278 XCrossingEvent *ev = &e->xcrossing; |
287 |
279 |
288 if((ev->window == root) && !ev->same_screen) { |
280 if((ev->window == root) && !ev->same_screen) { |
289 issel = False; |
281 issel = False; |
290 drawall(); |
282 drawall(); |
291 } |
283 } |
292 } |
284 } |
293 |
285 |
294 static void |
286 static void |
295 mappingnotify(XEvent *e) |
287 mappingnotify(XEvent *e) { |
296 { |
|
297 XMappingEvent *ev = &e->xmapping; |
288 XMappingEvent *ev = &e->xmapping; |
298 |
289 |
299 XRefreshKeyboardMapping(ev); |
290 XRefreshKeyboardMapping(ev); |
300 if(ev->request == MappingKeyboard) |
291 if(ev->request == MappingKeyboard) |
301 grabkeys(); |
292 grabkeys(); |
302 } |
293 } |
303 |
294 |
304 static void |
295 static void |
305 maprequest(XEvent *e) |
296 maprequest(XEvent *e) { |
306 { |
|
307 static XWindowAttributes wa; |
297 static XWindowAttributes wa; |
308 XMapRequestEvent *ev = &e->xmaprequest; |
298 XMapRequestEvent *ev = &e->xmaprequest; |
309 |
299 |
310 if(!XGetWindowAttributes(dpy, ev->window, &wa)) |
300 if(!XGetWindowAttributes(dpy, ev->window, &wa)) |
311 return; |
301 return; |
319 if(!getclient(ev->window)) |
309 if(!getclient(ev->window)) |
320 manage(ev->window, &wa); |
310 manage(ev->window, &wa); |
321 } |
311 } |
322 |
312 |
323 static void |
313 static void |
324 propertynotify(XEvent *e) |
314 propertynotify(XEvent *e) { |
325 { |
|
326 Client *c; |
315 Client *c; |
327 Window trans; |
316 Window trans; |
328 XPropertyEvent *ev = &e->xproperty; |
317 XPropertyEvent *ev = &e->xproperty; |
329 |
318 |
330 if(ev->state == PropertyDelete) |
319 if(ev->state == PropertyDelete) |
378 [PropertyNotify] = propertynotify, |
366 [PropertyNotify] = propertynotify, |
379 [UnmapNotify] = unmapnotify |
367 [UnmapNotify] = unmapnotify |
380 }; |
368 }; |
381 |
369 |
382 void |
370 void |
383 grabkeys() |
371 grabkeys() { |
384 { |
|
385 static unsigned int len = sizeof(key) / sizeof(key[0]); |
372 static unsigned int len = sizeof(key) / sizeof(key[0]); |
386 unsigned int i; |
373 unsigned int i; |
387 KeyCode code; |
374 KeyCode code; |
388 |
375 |
389 XUngrabKey(dpy, AnyKey, AnyModifier, root); |
376 XUngrabKey(dpy, AnyKey, AnyModifier, root); |