changed main event loop
b6ad663f
3 file(s) · +21 −10
| 108 | 108 | ||
| 109 | 109 | /* event.c */ |
|
| 110 | 110 | extern void grabkeys(); |
|
| 111 | + | extern void procevent(); |
|
| 111 | 112 | ||
| 112 | 113 | /* main.c */ |
|
| 113 | 114 | extern int getproto(Window w); |
| 384 | 384 | GrabModeAsync, GrabModeAsync); |
|
| 385 | 385 | } |
|
| 386 | 386 | } |
|
| 387 | + | ||
| 388 | + | void |
|
| 389 | + | procevent() |
|
| 390 | + | { |
|
| 391 | + | XEvent ev; |
|
| 392 | + | ||
| 393 | + | while(XPending(dpy)) { |
|
| 394 | + | XNextEvent(dpy, &ev); |
|
| 395 | + | if(handler[ev.type]) |
|
| 396 | + | (handler[ev.type])(&ev); /* call handler */ |
|
| 397 | + | } |
|
| 398 | + | } |
|
| 399 | + |
| 27 | 27 | resize(sel, True, TopLeft); |
|
| 28 | 28 | unmanage(sel); |
|
| 29 | 29 | } |
|
| 30 | + | XUngrabKey(dpy, AnyKey, AnyModifier, root); |
|
| 30 | 31 | XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, CurrentTime); |
|
| 32 | + | XSync(dpy, False); |
|
| 31 | 33 | } |
|
| 32 | 34 | ||
| 33 | 35 | static void |
|
| 37 | 39 | Window *wins, d1, d2; |
|
| 38 | 40 | XWindowAttributes wa; |
|
| 39 | 41 | ||
| 42 | + | wins = NULL; |
|
| 40 | 43 | if(XQueryTree(dpy, root, &d1, &d2, &wins, &num)) { |
|
| 41 | 44 | for(i = 0; i < num; i++) { |
|
| 42 | 45 | if(!XGetWindowAttributes(dpy, wins[i], &wa)) |
|
| 168 | 171 | fd_set rd; |
|
| 169 | 172 | Bool readin = True; |
|
| 170 | 173 | Window w; |
|
| 171 | - | XEvent ev; |
|
| 172 | 174 | XModifierKeymap *modmap; |
|
| 173 | 175 | XSetWindowAttributes wa; |
|
| 174 | 176 | ||
| 196 | 198 | if(otherwm) |
|
| 197 | 199 | eprint("dwm: another window manager is already running\n"); |
|
| 198 | 200 | ||
| 201 | + | XSync(dpy, False); |
|
| 199 | 202 | XSetErrorHandler(NULL); |
|
| 200 | 203 | xerrorxlib = XSetErrorHandler(xerror); |
|
| 201 | 204 | XSync(dpy, False); |
|
| 268 | 271 | ||
| 269 | 272 | /* main event loop, also reads status text from stdin */ |
|
| 270 | 273 | XSync(dpy, False); |
|
| 271 | - | goto XLoop; |
|
| 274 | + | procevent(); |
|
| 272 | 275 | while(running) { |
|
| 273 | 276 | FD_ZERO(&rd); |
|
| 274 | 277 | if(readin) |
|
| 288 | 291 | strcpy(stext, "broken pipe"); |
|
| 289 | 292 | drawstatus(); |
|
| 290 | 293 | } |
|
| 291 | - | if(FD_ISSET(xfd, &rd)) { |
|
| 292 | - | XLoop: |
|
| 293 | - | while(XPending(dpy)) { |
|
| 294 | - | XNextEvent(dpy, &ev); |
|
| 295 | - | if(handler[ev.type]) |
|
| 296 | - | (handler[ev.type])(&ev); /* call handler */ |
|
| 297 | - | } |
|
| 298 | - | } |
|
| 294 | + | if(FD_ISSET(xfd, &rd)) |
|
| 295 | + | procevent(); |
|
| 299 | 296 | } |
|
| 300 | 297 | } |
|
| 301 | 298 | cleanup(); |
|