URI: 
       applied Sanders max_and_focus.patch - dwm - dynamic window manager
  HTML git clone https://git.parazyd.org/dwm
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit 26157e6973f240a9b5ee407b9d2d5eca9358844f
   DIR parent 6d22782e8f991a99f9adef56b2b729e5ab5454d2
  HTML Author: Anselm R. Garbe <arg@10kloc.org>
       Date:   Mon,  4 Sep 2006 08:55:49 +0200
       
       applied Sanders max_and_focus.patch
       Diffstat:
         M client.c                            |      50 ++++++++++++++++++-------------
         M dwm.h                               |       3 +--
         M event.c                             |       8 ++++----
         M main.c                              |       1 +
         M view.c                              |      30 +++++++++++++-----------------
       
       5 files changed, 48 insertions(+), 44 deletions(-)
       ---
   DIR diff --git a/client.c b/client.c
       @@ -82,22 +82,29 @@ ban(Client *c)
        void
        focus(Client *c)
        {
       -        Client *old = sel;
       +        Client *old;
        
                if(!issel)
                        return;
                if(!sel)
                        sel = c;
                else if(sel != c) {
       -                if(sel->ismax)
       +                if(maximized)
                                togglemax(NULL);
       +                old = sel;
                        sel = c;
       -                grabbuttons(old, False);
       -                drawtitle(old);
       +                if(old) {
       +                        grabbuttons(old, False);
       +                        drawtitle(old);
       +                }
       +        }
       +        if(c) {
       +                grabbuttons(c, True);
       +                drawtitle(c);
       +                XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime);
                }
       -        grabbuttons(c, True);
       -        drawtitle(c);
       -        XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime);
       +        else
       +                XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime);
        }
        
        Client *
       @@ -247,8 +254,6 @@ manage(Window w, XWindowAttributes *wa)
                clients = c;
        
                settitle(c);
       -        if(isvisible(c))
       -                sel = c;
                arrange(NULL);
                XMapWindow(dpy, c->win);
                XMapWindow(dpy, c->twin);
       @@ -366,12 +371,13 @@ void
        togglemax(Arg *arg)
        {
                int ox, oy, ow, oh;
       +        Client *c;
                XEvent ev;
        
                if(!sel)
                        return;
        
       -        if((sel->ismax = !sel->ismax)) {
       +        if((maximized = !maximized)) {
                        ox = sel->x;
                        oy = sel->y;
                        ow = sel->w;
       @@ -382,6 +388,9 @@ togglemax(Arg *arg)
                        sel->h = sh - 2 - bh;
        
                        restack();
       +                for(c = getnext(clients); c; c = getnext(c->next))
       +                        if(c != sel)
       +                                ban(c);
                        resize(sel, arrange == dofloat, TopLeft);
        
                        sel->x = ox;
       @@ -390,37 +399,36 @@ togglemax(Arg *arg)
                        sel->h = oh;
                }
                else
       -                resize(sel, False, TopLeft);
       +                arrange(NULL);
                while(XCheckMaskEvent(dpy, EnterWindowMask, &ev));
        }
        
        void
        unmanage(Client *c)
        {
       -        Client *tc;
       +        Client *tc, *fc;
                Window trans;
                XGrabServer(dpy);
                XSetErrorHandler(xerrordummy);
        
       -        XGetTransientForHint(dpy, c->win, &trans);
       -
       -        XUngrabButton(dpy, AnyButton, AnyModifier, c->win);
       -        XDestroyWindow(dpy, c->twin);
       -
                detach(c);
                if(sel == c) {
       +                XGetTransientForHint(dpy, c->win, &trans);
                        if(trans && (tc = getclient(trans)) && isvisible(tc))
       -                        sel = tc;
       +                        fc = tc;
                        else
       -                        sel = getnext(clients);
       +                        fc = getnext(clients);
       +                focus(fc);
                }
       +
       +        XUngrabButton(dpy, AnyButton, AnyModifier, c->win);
       +        XDestroyWindow(dpy, c->twin);
       +
                free(c->tags);
                free(c);
        
                XSync(dpy, False);
                XSetErrorHandler(xerror);
                XUngrabServer(dpy);
       -        if(sel)
       -                focus(sel);
                arrange(NULL);
        }
   DIR diff --git a/dwm.h b/dwm.h
       @@ -58,7 +58,6 @@ struct Client {
                long flags; 
                unsigned int border, weight;
                Bool isfloat;
       -        Bool ismax;
                Bool *tags;
                Client *next;
                Client *prev;
       @@ -73,7 +72,7 @@ extern unsigned int ntags, numlockmask;
        extern void (*handler[LASTEvent])(XEvent *);
        extern void (*arrange)(Arg *);
        extern Atom wmatom[WMLast], netatom[NetLast];
       -extern Bool running, issel, *seltag;
       +extern Bool running, issel, maximized, *seltag;
        extern Client *clients, *sel;
        extern Cursor cursor[CurLast];
        extern DC dc;
   DIR diff --git a/event.c b/event.c
       @@ -131,15 +131,15 @@ buttonpress(XEvent *e)
                }
                else if((c = getclient(ev->window))) {
                        focus(c);
       -                if(c->ismax || CLEANMASK(ev->state) != MODKEY)
       +                if(maximized || CLEANMASK(ev->state) != MODKEY)
                                return;
       -                if((ev->button == Button1) && ((arrange == dofloat) || c->isfloat)) {
       +                if(ev->button == Button1 && (arrange == dofloat || c->isfloat)) {
                                restack(c);
                                movemouse(c);
                        }
                        else if(ev->button == Button2)
                                zoom(NULL);
       -                else if(ev->button == Button3 && ((arrange == dofloat) || c->isfloat)) {
       +                else if(ev->button == Button3 && (arrange == dofloat || c->isfloat)) {
                                restack(c);
                                resizemouse(c);
                        }
       @@ -173,7 +173,7 @@ configurerequest(XEvent *e)
                XWindowChanges wc;
        
                if((c = getclient(ev->window))) {
       -                if(!c->isfloat && (arrange != dofloat) && c->ismax) {
       +                if((c == sel) && !c->isfloat && (arrange != dofloat) && maximized) {
                                synconfig(c, sx, sy + bh, sw - 2, sh - 2 - bh, ev->border_width);
                                XSync(dpy, False);
                                return;
   DIR diff --git a/main.c b/main.c
       @@ -24,6 +24,7 @@ unsigned int ntags, numlockmask;
        Atom wmatom[WMLast], netatom[NetLast];
        Bool running = True;
        Bool issel = True;
       +Bool maximized = False;
        Client *clients = NULL;
        Client *sel = NULL;
        Cursor cursor[CurLast];
   DIR diff --git a/view.c b/view.c
       @@ -57,22 +57,20 @@ detach(Client *c)
        void
        dofloat(Arg *arg)
        {
       -        Client *c;
       +        Client *c, *fc;
       +
       +        maximized = False;
        
                for(c = clients; c; c = c->next) {
       -                c->ismax = False;
                        if(isvisible(c)) {
                                resize(c, True, TopLeft);
                        }
                        else
                                ban(c);
                }
       -        if(!sel || !isvisible(sel))
       -                sel = getnext(clients);
       -        if(sel)
       -                focus(sel);
       -        else
       -                XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime);
       +        if(!(fc = sel) || !isvisible(fc))
       +                fc = getnext(clients);
       +        focus(fc);
                restack();
        }
        
       @@ -80,7 +78,9 @@ void
        dotile(Arg *arg)
        {
                int h, i, n, w;
       -        Client *c;
       +        Client *c, *fc;
       +
       +        maximized = False;
        
                w = sw - mw;
                for(n = 0, c = clients; c; c = c->next)
       @@ -93,7 +93,6 @@ dotile(Arg *arg)
                        h = sh - bh;
        
                for(i = 0, c = clients; c; c = c->next) {
       -                c->ismax = False;
                        if(isvisible(c)) {
                                if(c->isfloat) {
                                        resize(c, True, TopLeft);
       @@ -132,12 +131,9 @@ dotile(Arg *arg)
                        else
                                ban(c);
                }
       -        if(!sel || !isvisible(sel))
       -                sel = getnext(clients);
       -        if(sel)
       -                focus(sel);
       -        else
       -                XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime);
       +        if(!(fc = sel) || !isvisible(fc))
       +                fc = getnext(clients);
       +        focus(fc);
                restack();
        }
        
       @@ -289,7 +285,7 @@ zoom(Arg *arg)
        {
                Client *c = sel;
        
       -        if(!c || (arrange != dotile) || c->isfloat || c->ismax)
       +        if(!c || (arrange != dotile) || c->isfloat || maximized)
                        return;
        
                if(c == getnext(clients))