X-Git-Url: https://git.danieliu.xyz/?a=blobdiff_plain;f=client.c;h=eb23452cf7fa4f54f9e5acc046e36d72512a15ff;hb=595028614bc94c1733b28725dcf9777b0a47ad24;hp=dff398a4aa2eac8da7fa67623207d3dced80b7ac;hpb=2eebebf26243a4a80d646c85db2b9c9ebd168743;p=dwm.git diff --git a/client.c b/client.c index dff398a..eb23452 100644 --- a/client.c +++ b/client.c @@ -10,6 +10,19 @@ /* static functions */ +static void +grabbutton(Client *c, unsigned int button, unsigned int modifier) +{ + XGrabButton(dpy, button, modifier, c->win, False, BUTTONMASK, + GrabModeAsync, GrabModeSync, None, None); + XGrabButton(dpy, button, modifier | LockMask, c->win, False, BUTTONMASK, + GrabModeAsync, GrabModeSync, None, None); + XGrabButton(dpy, button, modifier | numlockmask, c->win, False, BUTTONMASK, + GrabModeAsync, GrabModeSync, None, None); + XGrabButton(dpy, button, modifier | numlockmask | LockMask, c->win, False, BUTTONMASK, + GrabModeAsync, GrabModeSync, None, None); +} + static void resizetitle(Client *c) { @@ -31,6 +44,15 @@ resizetitle(Client *c) } +static void +ungrabbutton(Client *c, unsigned int button, unsigned int modifier) +{ + XUngrabButton(dpy, button, modifier, c->win); + XUngrabButton(dpy, button, modifier | LockMask, c->win); + XUngrabButton(dpy, button, modifier | numlockmask, c->win); + XUngrabButton(dpy, button, modifier | numlockmask | LockMask, c->win); +} + static int xerrordummy(Display *dsply, XErrorEvent *ee) { @@ -51,13 +73,18 @@ focus(Client *c) { Client *old = sel; - if (!issel) + if(!issel) return; - if(sel && sel->ismax) - togglemax(NULL); - sel = c; - if(old && old != c) + if(!sel) + sel = c; + else if(sel != c) { + if(sel->ismax) + togglemax(NULL); + sel = c; + grabbutton(old, AnyButton, 0); drawtitle(old); + } + ungrabbutton(c, AnyButton, 0); drawtitle(c); XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime); } @@ -187,6 +214,7 @@ killclient(Arg *arg) void manage(Window w, XWindowAttributes *wa) { + unsigned int i; Client *c, *tc; Window trans; XSetWindowAttributes twa; @@ -230,34 +258,15 @@ manage(Window w, XWindowAttributes *wa) c->next = clients; clients = c; - XGrabButton(dpy, Button1, MODKEY, c->win, False, BUTTONMASK, - GrabModeAsync, GrabModeSync, None, None); - XGrabButton(dpy, Button1, MODKEY | LockMask, c->win, False, BUTTONMASK, - GrabModeAsync, GrabModeSync, None, None); - XGrabButton(dpy, Button1, MODKEY | numlockmask, c->win, False, BUTTONMASK, - GrabModeAsync, GrabModeSync, None, None); - XGrabButton(dpy, Button1, MODKEY | numlockmask | LockMask, c->win, False, BUTTONMASK, - GrabModeAsync, GrabModeSync, None, None); + grabbutton(c, Button1, MODKEY); + grabbutton(c, Button2, MODKEY); + grabbutton(c, Button3, MODKEY); - XGrabButton(dpy, Button2, MODKEY, c->win, False, BUTTONMASK, - GrabModeAsync, GrabModeSync, None, None); - XGrabButton(dpy, Button2, MODKEY | LockMask, c->win, False, BUTTONMASK, - GrabModeAsync, GrabModeSync, None, None); - XGrabButton(dpy, Button2, MODKEY | numlockmask, c->win, False, BUTTONMASK, - GrabModeAsync, GrabModeSync, None, None); - XGrabButton(dpy, Button2, MODKEY | numlockmask | LockMask, c->win, False, BUTTONMASK, - GrabModeAsync, GrabModeSync, None, None); - - XGrabButton(dpy, Button3, MODKEY, c->win, False, BUTTONMASK, - GrabModeAsync, GrabModeSync, None, None); - XGrabButton(dpy, Button3, MODKEY | LockMask, c->win, False, BUTTONMASK, - GrabModeAsync, GrabModeSync, None, None); - XGrabButton(dpy, Button3, MODKEY | numlockmask, c->win, False, BUTTONMASK, - GrabModeAsync, GrabModeSync, None, None); - XGrabButton(dpy, Button3, MODKEY | numlockmask | LockMask, c->win, False, BUTTONMASK, - GrabModeAsync, GrabModeSync, None, None); - - settags(c); + if((tc = getclient(trans))) /* inherit tags */ + for(i = 0; i < ntags; i++) + c->tags[i] = tc->tags[i]; + else + settags(c); if(!c->isfloat) c->isfloat = trans || (c->maxw && c->minw &&