X-Git-Url: https://jasonwoof.com/gitweb/?a=blobdiff_plain;ds=sidebyside;f=client.c;h=e8fe150f3ff63cce9d7564839dc304fdfc826b1e;hb=a50b15a9e9663b1a7ee11d39ddf246427aecaeef;hp=eb23452cf7fa4f54f9e5acc046e36d72512a15ff;hpb=950a1ab5afe3e94dfe78e3ff2216bb9f444d5148;p=dwm.git diff --git a/client.c b/client.c index eb23452..e8fe150 100644 --- a/client.c +++ b/client.c @@ -11,16 +11,42 @@ /* static functions */ static void -grabbutton(Client *c, unsigned int button, unsigned int modifier) +grabbuttons(Client *c, Bool focus) { - 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); + XUngrabButton(dpy, AnyButton, AnyModifier, c->win); + + if(focus) { + 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); + + 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); + } + else + XGrabButton(dpy, AnyButton, AnyModifier, c->win, False, BUTTONMASK, + GrabModeAsync, GrabModeSync, None, None); + } static void @@ -28,31 +54,18 @@ resizetitle(Client *c) { int i; - c->tw = 0; - for(i = 0; i < ntags; i++) - if(c->tags[i]) - c->tw += textw(tags[i]); - c->tw += textw(c->name); + c->tw = textw(c->name); if(c->tw > c->w) c->tw = c->w + 2; c->tx = c->x + c->w - c->tw + 2; c->ty = c->y; if(isvisible(c)) - XMoveResizeWindow(dpy, c->title, c->tx, c->ty, c->tw, c->th); + XMoveResizeWindow(dpy, c->twin, c->tx, c->ty, c->tw, c->th); else - XMoveResizeWindow(dpy, c->title, c->tx + 2 * sw, c->ty, c->tw, c->th); + XMoveResizeWindow(dpy, c->twin, c->tx + 2 * sw, c->ty, c->tw, c->th); } -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) { @@ -65,7 +78,7 @@ void ban(Client *c) { XMoveWindow(dpy, c->win, c->x + 2 * sw, c->y); - XMoveWindow(dpy, c->title, c->tx + 2 * sw, c->ty); + XMoveWindow(dpy, c->twin, c->tx + 2 * sw, c->ty); } void @@ -81,48 +94,14 @@ focus(Client *c) if(sel->ismax) togglemax(NULL); sel = c; - grabbutton(old, AnyButton, 0); + grabbuttons(old, False); drawtitle(old); } - ungrabbutton(c, AnyButton, 0); + grabbuttons(c, True); drawtitle(c); XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime); } -void -focusnext(Arg *arg) -{ - Client *c; - - if(!sel) - return; - - if(!(c = getnext(sel->next))) - c = getnext(clients); - if(c) { - focus(c); - restack(); - } -} - -void -focusprev(Arg *arg) -{ - Client *c; - - if(!sel) - return; - - if(!(c = getprev(sel->prev))) { - for(c = clients; c && c->next; c = c->next); - c = getprev(c); - } - if(c) { - focus(c); - restack(); - } -} - Client * getclient(Window w) { @@ -140,7 +119,7 @@ getctitle(Window w) Client *c; for(c = clients; c; c = c->next) - if(c->title == w) + if(c->twin == w) return c; return NULL; } @@ -248,7 +227,7 @@ manage(Window w, XWindowAttributes *wa) twa.background_pixmap = ParentRelative; twa.event_mask = ExposureMask | EnterWindowMask; - c->title = XCreateWindow(dpy, root, c->tx, c->ty, c->tw, c->th, + c->twin = XCreateWindow(dpy, root, c->tx, c->ty, c->tw, c->th, 0, DefaultDepth(dpy, screen), CopyFromParent, DefaultVisual(dpy, screen), CWOverrideRedirect | CWBackPixmap | CWEventMask, &twa); @@ -258,9 +237,7 @@ manage(Window w, XWindowAttributes *wa) c->next = clients; clients = c; - grabbutton(c, Button1, MODKEY); - grabbutton(c, Button2, MODKEY); - grabbutton(c, Button3, MODKEY); + grabbuttons(c, False); if((tc = getclient(trans))) /* inherit tags */ for(i = 0; i < ntags; i++) @@ -276,7 +253,7 @@ manage(Window w, XWindowAttributes *wa) sel = c; arrange(NULL); XMapWindow(dpy, c->win); - XMapWindow(dpy, c->title); + XMapWindow(dpy, c->twin); if(isvisible(c)) focus(c); } @@ -363,7 +340,7 @@ void settitle(Client *c) { char **list = NULL; - int n; + int i, n; XTextProperty name; name.nitems = 0; @@ -422,11 +399,15 @@ togglemax(Arg *arg) void unmanage(Client *c) { + Client *tc; + Window trans; XGrabServer(dpy); XSetErrorHandler(xerrordummy); + XGetTransientForHint(dpy, c->win, &trans); + XUngrabButton(dpy, AnyButton, AnyModifier, c->win); - XDestroyWindow(dpy, c->title); + XDestroyWindow(dpy, c->twin); if(c->prev) c->prev->next = c->next; @@ -434,8 +415,12 @@ unmanage(Client *c) c->next->prev = c->prev; if(c == clients) clients = c->next; - if(sel == c) - sel = getnext(clients); + if(sel == c) { + if(trans && (tc = getclient(trans)) && isvisible(tc)) + sel = tc; + else + sel = getnext(clients); + } free(c->tags); free(c); @@ -446,30 +431,3 @@ unmanage(Client *c) focus(sel); arrange(NULL); } - -void -zoom(Arg *arg) -{ - Client *c; - - if(!sel || (arrange != dotile) || sel->isfloat || sel->ismax) - return; - - if(sel == getnext(clients)) { - if((c = getnext(sel->next))) - sel = c; - else - return; - } - - /* pop */ - sel->prev->next = sel->next; - if(sel->next) - sel->next->prev = sel->prev; - sel->prev = NULL; - clients->prev = sel; - sel->next = clients; - clients = sel; - focus(sel); - arrange(NULL); -}