aewl
diff client.c @ 372:a9b4077ec058
applied sanders focus_ patches
author | Anselm R. Garbe <arg@10kloc.org> |
---|---|
date | Mon, 28 Aug 2006 08:06:50 +0200 |
parents | a1901753deef |
children | b1159a638d0a |
line diff
1.1 --- a/client.c Mon Aug 28 08:02:29 2006 +0200 1.2 +++ b/client.c Mon Aug 28 08:06:50 2006 +0200 1.3 @@ -11,16 +11,42 @@ 1.4 /* static functions */ 1.5 1.6 static void 1.7 -grabbutton(Client *c, unsigned int button, unsigned int modifier) 1.8 +grabbuttons(Client *c, Bool focus) 1.9 { 1.10 - XGrabButton(dpy, button, modifier, c->win, False, BUTTONMASK, 1.11 - GrabModeAsync, GrabModeSync, None, None); 1.12 - XGrabButton(dpy, button, modifier | LockMask, c->win, False, BUTTONMASK, 1.13 - GrabModeAsync, GrabModeSync, None, None); 1.14 - XGrabButton(dpy, button, modifier | numlockmask, c->win, False, BUTTONMASK, 1.15 - GrabModeAsync, GrabModeSync, None, None); 1.16 - XGrabButton(dpy, button, modifier | numlockmask | LockMask, c->win, False, BUTTONMASK, 1.17 - GrabModeAsync, GrabModeSync, None, None); 1.18 + XUngrabButton(dpy, AnyButton, AnyModifier, c->win); 1.19 + 1.20 + if(focus) { 1.21 + XGrabButton(dpy, Button1, MODKEY, c->win, False, BUTTONMASK, 1.22 + GrabModeAsync, GrabModeSync, None, None); 1.23 + XGrabButton(dpy, Button1, MODKEY | LockMask, c->win, False, BUTTONMASK, 1.24 + GrabModeAsync, GrabModeSync, None, None); 1.25 + XGrabButton(dpy, Button1, MODKEY | numlockmask, c->win, False, BUTTONMASK, 1.26 + GrabModeAsync, GrabModeSync, None, None); 1.27 + XGrabButton(dpy, Button1, MODKEY | numlockmask | LockMask, c->win, False, BUTTONMASK, 1.28 + GrabModeAsync, GrabModeSync, None, None); 1.29 + 1.30 + XGrabButton(dpy, Button2, MODKEY, c->win, False, BUTTONMASK, 1.31 + GrabModeAsync, GrabModeSync, None, None); 1.32 + XGrabButton(dpy, Button2, MODKEY | LockMask, c->win, False, BUTTONMASK, 1.33 + GrabModeAsync, GrabModeSync, None, None); 1.34 + XGrabButton(dpy, Button2, MODKEY | numlockmask, c->win, False, BUTTONMASK, 1.35 + GrabModeAsync, GrabModeSync, None, None); 1.36 + XGrabButton(dpy, Button2, MODKEY | numlockmask | LockMask, c->win, False, BUTTONMASK, 1.37 + GrabModeAsync, GrabModeSync, None, None); 1.38 + 1.39 + XGrabButton(dpy, Button3, MODKEY, c->win, False, BUTTONMASK, 1.40 + GrabModeAsync, GrabModeSync, None, None); 1.41 + XGrabButton(dpy, Button3, MODKEY | LockMask, c->win, False, BUTTONMASK, 1.42 + GrabModeAsync, GrabModeSync, None, None); 1.43 + XGrabButton(dpy, Button3, MODKEY | numlockmask, c->win, False, BUTTONMASK, 1.44 + GrabModeAsync, GrabModeSync, None, None); 1.45 + XGrabButton(dpy, Button3, MODKEY | numlockmask | LockMask, c->win, False, BUTTONMASK, 1.46 + GrabModeAsync, GrabModeSync, None, None); 1.47 + } 1.48 + else 1.49 + XGrabButton(dpy, AnyButton, AnyModifier, c->win, False, BUTTONMASK, 1.50 + GrabModeAsync, GrabModeSync, None, None); 1.51 + 1.52 } 1.53 1.54 static void 1.55 @@ -40,15 +66,6 @@ 1.56 1.57 } 1.58 1.59 -static void 1.60 -ungrabbutton(Client *c, unsigned int button, unsigned int modifier) 1.61 -{ 1.62 - XUngrabButton(dpy, button, modifier, c->win); 1.63 - XUngrabButton(dpy, button, modifier | LockMask, c->win); 1.64 - XUngrabButton(dpy, button, modifier | numlockmask, c->win); 1.65 - XUngrabButton(dpy, button, modifier | numlockmask | LockMask, c->win); 1.66 -} 1.67 - 1.68 static int 1.69 xerrordummy(Display *dsply, XErrorEvent *ee) 1.70 { 1.71 @@ -77,10 +94,10 @@ 1.72 if(sel->ismax) 1.73 togglemax(NULL); 1.74 sel = c; 1.75 - grabbutton(old, AnyButton, 0); 1.76 + grabbuttons(old, False); 1.77 drawtitle(old); 1.78 } 1.79 - ungrabbutton(c, AnyButton, 0); 1.80 + grabbuttons(c, True); 1.81 drawtitle(c); 1.82 XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime); 1.83 } 1.84 @@ -220,9 +237,7 @@ 1.85 c->next = clients; 1.86 clients = c; 1.87 1.88 - grabbutton(c, Button1, MODKEY); 1.89 - grabbutton(c, Button2, MODKEY); 1.90 - grabbutton(c, Button3, MODKEY); 1.91 + grabbuttons(c, False); 1.92 1.93 if((tc = getclient(trans))) /* inherit tags */ 1.94 for(i = 0; i < ntags; i++) 1.95 @@ -384,9 +399,13 @@ 1.96 void 1.97 unmanage(Client *c) 1.98 { 1.99 + Client *tc; 1.100 + Window trans; 1.101 XGrabServer(dpy); 1.102 XSetErrorHandler(xerrordummy); 1.103 1.104 + XGetTransientForHint(dpy, c->win, &trans); 1.105 + 1.106 XUngrabButton(dpy, AnyButton, AnyModifier, c->win); 1.107 XDestroyWindow(dpy, c->twin); 1.108 1.109 @@ -396,8 +415,12 @@ 1.110 c->next->prev = c->prev; 1.111 if(c == clients) 1.112 clients = c->next; 1.113 - if(sel == c) 1.114 - sel = getnext(clients); 1.115 + if(sel == c) { 1.116 + if(trans && (tc = getclient(trans)) && isvisible(tc)) 1.117 + sel = tc; 1.118 + else 1.119 + sel = getnext(clients); 1.120 + } 1.121 free(c->tags); 1.122 free(c); 1.123