applied sanders focus_ patches
0a25fe91
2 file(s) · +49 −26
| 11 | 11 | /* static functions */ |
|
| 12 | 12 | ||
| 13 | 13 | static void |
|
| 14 | - | grabbutton(Client *c, unsigned int button, unsigned int modifier) |
|
| 14 | + | grabbuttons(Client *c, Bool focus) |
|
| 15 | 15 | { |
|
| 16 | - | XGrabButton(dpy, button, modifier, c->win, False, BUTTONMASK, |
|
| 17 | - | GrabModeAsync, GrabModeSync, None, None); |
|
| 18 | - | XGrabButton(dpy, button, modifier | LockMask, c->win, False, BUTTONMASK, |
|
| 19 | - | GrabModeAsync, GrabModeSync, None, None); |
|
| 20 | - | XGrabButton(dpy, button, modifier | numlockmask, c->win, False, BUTTONMASK, |
|
| 21 | - | GrabModeAsync, GrabModeSync, None, None); |
|
| 22 | - | XGrabButton(dpy, button, modifier | numlockmask | LockMask, c->win, False, BUTTONMASK, |
|
| 23 | - | GrabModeAsync, GrabModeSync, None, None); |
|
| 16 | + | XUngrabButton(dpy, AnyButton, AnyModifier, c->win); |
|
| 17 | + | ||
| 18 | + | if(focus) { |
|
| 19 | + | XGrabButton(dpy, Button1, MODKEY, c->win, False, BUTTONMASK, |
|
| 20 | + | GrabModeAsync, GrabModeSync, None, None); |
|
| 21 | + | XGrabButton(dpy, Button1, MODKEY | LockMask, c->win, False, BUTTONMASK, |
|
| 22 | + | GrabModeAsync, GrabModeSync, None, None); |
|
| 23 | + | XGrabButton(dpy, Button1, MODKEY | numlockmask, c->win, False, BUTTONMASK, |
|
| 24 | + | GrabModeAsync, GrabModeSync, None, None); |
|
| 25 | + | XGrabButton(dpy, Button1, MODKEY | numlockmask | LockMask, c->win, False, BUTTONMASK, |
|
| 26 | + | GrabModeAsync, GrabModeSync, None, None); |
|
| 27 | + | ||
| 28 | + | XGrabButton(dpy, Button2, MODKEY, c->win, False, BUTTONMASK, |
|
| 29 | + | GrabModeAsync, GrabModeSync, None, None); |
|
| 30 | + | XGrabButton(dpy, Button2, MODKEY | LockMask, c->win, False, BUTTONMASK, |
|
| 31 | + | GrabModeAsync, GrabModeSync, None, None); |
|
| 32 | + | XGrabButton(dpy, Button2, MODKEY | numlockmask, c->win, False, BUTTONMASK, |
|
| 33 | + | GrabModeAsync, GrabModeSync, None, None); |
|
| 34 | + | XGrabButton(dpy, Button2, MODKEY | numlockmask | LockMask, c->win, False, BUTTONMASK, |
|
| 35 | + | GrabModeAsync, GrabModeSync, None, None); |
|
| 36 | + | ||
| 37 | + | XGrabButton(dpy, Button3, MODKEY, c->win, False, BUTTONMASK, |
|
| 38 | + | GrabModeAsync, GrabModeSync, None, None); |
|
| 39 | + | XGrabButton(dpy, Button3, MODKEY | LockMask, c->win, False, BUTTONMASK, |
|
| 40 | + | GrabModeAsync, GrabModeSync, None, None); |
|
| 41 | + | XGrabButton(dpy, Button3, MODKEY | numlockmask, c->win, False, BUTTONMASK, |
|
| 42 | + | GrabModeAsync, GrabModeSync, None, None); |
|
| 43 | + | XGrabButton(dpy, Button3, MODKEY | numlockmask | LockMask, c->win, False, BUTTONMASK, |
|
| 44 | + | GrabModeAsync, GrabModeSync, None, None); |
|
| 45 | + | } |
|
| 46 | + | else |
|
| 47 | + | XGrabButton(dpy, AnyButton, AnyModifier, c->win, False, BUTTONMASK, |
|
| 48 | + | GrabModeAsync, GrabModeSync, None, None); |
|
| 49 | + | ||
| 24 | 50 | } |
|
| 25 | 51 | ||
| 26 | 52 | static void |
|
| 40 | 66 | ||
| 41 | 67 | } |
|
| 42 | 68 | ||
| 43 | - | static void |
|
| 44 | - | ungrabbutton(Client *c, unsigned int button, unsigned int modifier) |
|
| 45 | - | { |
|
| 46 | - | XUngrabButton(dpy, button, modifier, c->win); |
|
| 47 | - | XUngrabButton(dpy, button, modifier | LockMask, c->win); |
|
| 48 | - | XUngrabButton(dpy, button, modifier | numlockmask, c->win); |
|
| 49 | - | XUngrabButton(dpy, button, modifier | numlockmask | LockMask, c->win); |
|
| 50 | - | } |
|
| 51 | - | ||
| 52 | 69 | static int |
|
| 53 | 70 | xerrordummy(Display *dsply, XErrorEvent *ee) |
|
| 54 | 71 | { |
|
| 77 | 94 | if(sel->ismax) |
|
| 78 | 95 | togglemax(NULL); |
|
| 79 | 96 | sel = c; |
|
| 80 | - | grabbutton(old, AnyButton, 0); |
|
| 97 | + | grabbuttons(old, False); |
|
| 81 | 98 | drawtitle(old); |
|
| 82 | 99 | } |
|
| 83 | - | ungrabbutton(c, AnyButton, 0); |
|
| 100 | + | grabbuttons(c, True); |
|
| 84 | 101 | drawtitle(c); |
|
| 85 | 102 | XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime); |
|
| 86 | 103 | } |
|
| 220 | 237 | c->next = clients; |
|
| 221 | 238 | clients = c; |
|
| 222 | 239 | ||
| 223 | - | grabbutton(c, Button1, MODKEY); |
|
| 224 | - | grabbutton(c, Button2, MODKEY); |
|
| 225 | - | grabbutton(c, Button3, MODKEY); |
|
| 240 | + | grabbuttons(c, False); |
|
| 226 | 241 | ||
| 227 | 242 | if((tc = getclient(trans))) /* inherit tags */ |
|
| 228 | 243 | for(i = 0; i < ntags; i++) |
|
| 384 | 399 | void |
|
| 385 | 400 | unmanage(Client *c) |
|
| 386 | 401 | { |
|
| 402 | + | Client *tc; |
|
| 403 | + | Window trans; |
|
| 387 | 404 | XGrabServer(dpy); |
|
| 388 | 405 | XSetErrorHandler(xerrordummy); |
|
| 389 | 406 | ||
| 407 | + | XGetTransientForHint(dpy, c->win, &trans); |
|
| 408 | + | ||
| 390 | 409 | XUngrabButton(dpy, AnyButton, AnyModifier, c->win); |
|
| 391 | 410 | XDestroyWindow(dpy, c->twin); |
|
| 392 | 411 | ||
| 396 | 415 | c->next->prev = c->prev; |
|
| 397 | 416 | if(c == clients) |
|
| 398 | 417 | clients = c->next; |
|
| 399 | - | if(sel == c) |
|
| 400 | - | sel = getnext(clients); |
|
| 418 | + | if(sel == c) { |
|
| 419 | + | if(trans && (tc = getclient(trans)) && isvisible(tc)) |
|
| 420 | + | sel = tc; |
|
| 421 | + | else |
|
| 422 | + | sel = getnext(clients); |
|
| 423 | + | } |
|
| 401 | 424 | free(c->tags); |
|
| 402 | 425 | free(c); |
|
| 403 | 426 | ||
| 123 | 123 | } |
|
| 124 | 124 | else if((c = getclient(ev->window))) { |
|
| 125 | 125 | focus(c); |
|
| 126 | - | if(CLEANMASK(ev->state) == 0) |
|
| 126 | + | if(CLEANMASK(ev->state) != MODKEY) |
|
| 127 | 127 | return; |
|
| 128 | 128 | switch(ev->button) { |
|
| 129 | 129 | default: |