timplemented the maximization as I described on the mailinglist, this feels better to me. - dwm - [fork] customized build of dwm, the dynamic window manager
 (HTM) git clone git://src.adamsgaard.dk/dwm
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit d800ec05ff63451193a0b858c114f5144534c2a1
 (DIR) parent bda53ac6ad834824e8e5d5678ccd638a122c173a
 (HTM) Author: arg@mmvi <unknown>
       Date:   Fri, 22 Sep 2006 07:37:56 +0200
       
       implemented the maximization as I described on the mailinglist, this feels better to me.
       Diffstat:
         M client.c                            |      41 +++----------------------------
         M config.arg.h                        |       1 -
         M config.default.h                    |       1 -
         M dwm.h                               |       4 ++--
         M event.c                             |       4 ++--
         M main.c                              |       1 -
         M view.c                              |      23 +++++++++++++++++------
       
       7 files changed, 25 insertions(+), 50 deletions(-)
       ---
 (DIR) diff --git a/client.c b/client.c
       t@@ -89,8 +89,6 @@ focus(Client *c) {
                if(!sel)
                        sel = c;
                else if(sel != c) {
       -                if(maximized)
       -                        togglemax(NULL);
                        old = sel;
                        sel = c;
                        if(old) {
       t@@ -208,6 +206,10 @@ manage(Window w, XWindowAttributes *wa) {
                c->w = c->tw = wa->width;
                c->h = wa->height;
                c->th = bh;
       +        c->rx = sx;
       +        c->ry = bh;
       +        c->rw = sw;
       +        c->rh = sh - bh;
        
                c->border = 0;
                updatesize(c);
       t@@ -370,41 +372,6 @@ updatetitle(Client *c) {
        }
        
        void
       -togglemax(Arg *arg) {
       -        int ox, oy, ow, oh;
       -        Client *c;
       -        XEvent ev;
       -
       -        if(!sel)
       -                return;
       -
       -        if((maximized = !maximized)) {
       -                ox = sel->x;
       -                oy = sel->y;
       -                ow = sel->w;
       -                oh = sel->h;
       -                sel->x = sx;
       -                sel->y = sy + bh;
       -                sel->w = sw - 2;
       -                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;
       -                sel->y = oy;
       -                sel->w = ow;
       -                sel->h = oh;
       -        }
       -        else
       -                arrange(NULL);
       -        while(XCheckMaskEvent(dpy, EnterWindowMask, &ev));
       -}
       -
       -void
        unmanage(Client *c) {
                Client *nc;
        
 (DIR) diff --git a/config.arg.h b/config.arg.h
       t@@ -33,7 +33,6 @@ static Key key[] = { \
                { MODKEY,                        XK_j,                focusnext,        { 0 } }, \
                { MODKEY,                        XK_k,                focusprev,        { 0 } }, \
                { MODKEY,                        XK_Return,        zoom,                { 0 } }, \
       -        { MODKEY,                        XK_m,                togglemax,        { 0 } }, \
                { MODKEY,                        XK_g,                resizecol,        { .i = 20 } }, \
                { MODKEY,                        XK_s,                resizecol,        { .i = -20 } }, \
                { MODKEY|ShiftMask,                XK_1,                tag,                { .i = 0 } }, \
 (DIR) diff --git a/config.default.h b/config.default.h
       t@@ -28,7 +28,6 @@ static Key key[] = { \
                { MODKEY,                        XK_Tab,                focusnext,        { 0 } }, \
                { MODKEY|ShiftMask,                XK_Tab,                focusprev,        { 0 } }, \
                { MODKEY,                        XK_Return,        zoom,                { 0 } }, \
       -        { MODKEY,                        XK_m,                togglemax,        { 0 } }, \
                { MODKEY,                        XK_g,                resizecol,        { .i = 20 } }, \
                { MODKEY,                        XK_s,                resizecol,        { .i = -20 } }, \
                { MODKEY|ShiftMask,                XK_1,                tag,                { .i = 0 } }, \
 (DIR) diff --git a/dwm.h b/dwm.h
       t@@ -78,6 +78,7 @@ struct Client {
                int proto;
                int x, y, w, h;
                int tx, ty, tw, th; /* title window geometry */
       +        int rx, ry, rw, rh; /* revert geometry */
                int basew, baseh, incw, inch, maxw, maxh, minw, minh;
                int grav;
                long flags; 
       t@@ -99,7 +100,7 @@ extern unsigned int ntags, numlockmask;                /* number of tags, dynamic lock mask */
        extern void (*handler[LASTEvent])(XEvent *);        /* event handler */
        extern void (*arrange)(Arg *);                        /* arrange function, indicates mode  */
        extern Atom wmatom[WMLast], netatom[NetLast];
       -extern Bool running, issel, maximized, *seltag;        /* seltag is array of Bool */
       +extern Bool running, issel, *seltag;                /* seltag is array of Bool */
        extern Client *clients, *sel, *stack;                /* global cleint list and stack */
        extern Cursor cursor[CurLast];
        extern DC dc;                                        /* global draw context */
       t@@ -117,7 +118,6 @@ extern void manage(Window w, XWindowAttributes *wa);        /* manage new client */
        extern void resize(Client *c, Bool sizehints, Corner sticky); /* resize c*/
        extern void updatesize(Client *c);                        /* update the size structs of c */
        extern void updatetitle(Client *c);                /* update the name of c */
       -extern void togglemax(Arg *arg);                /* (un)maximize c */
        extern void unmanage(Client *c);                /* destroy c */
        
        /* draw.c */
 (DIR) diff --git a/event.c b/event.c
       t@@ -130,7 +130,7 @@ buttonpress(XEvent *e) {
                }
                else if((c = getclient(ev->window))) {
                        focus(c);
       -                if(maximized || CLEANMASK(ev->state) != MODKEY)
       +                if(CLEANMASK(ev->state) != MODKEY)
                                return;
                        if(ev->button == Button1 && (arrange == dofloat || c->isfloat)) {
                                restack(c);
       t@@ -170,7 +170,7 @@ configurerequest(XEvent *e) {
                XWindowChanges wc;
        
                if((c = getclient(ev->window))) {
       -                if((c == sel) && !c->isfloat && (arrange != dofloat) && maximized) {
       +                if((c == sel) && !c->isfloat && (arrange != dofloat)) {
                                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
       t@@ -24,7 +24,6 @@ unsigned int ntags, numlockmask;
        Atom wmatom[WMLast], netatom[NetLast];
        Bool running = True;
        Bool issel = True;
       -Bool maximized = False;
        Client *clients = NULL;
        Client *sel = NULL;
        Client *stack = NULL;
 (DIR) diff --git a/view.c b/view.c
       t@@ -61,8 +61,6 @@ void
        dofloat(Arg *arg) {
                Client *c;
        
       -        maximized = False;
       -
                for(c = clients; c; c = c->next) {
                        if(isvisible(c)) {
                                resize(c, True, TopLeft);
       t@@ -82,8 +80,6 @@ dotile(Arg *arg) {
                int h, i, n, w;
                Client *c;
        
       -        maximized = False;
       -
                w = sw - mw;
                for(n = 0, c = clients; c; c = c->next)
                        if(isvisible(c) && !c->isfloat)
       t@@ -190,7 +186,7 @@ resizecol(Arg *arg) {
                for(n = 0, c = clients; c; c = c->next)
                        if(isvisible(c) && !c->isfloat)
                                n++;
       -        if(!sel || sel->isfloat || n < 2 || (arrange != dotile) || maximized)
       +        if(!sel || sel->isfloat || n < 2 || (arrange != dotile))
                        return;
        
                if(sel == getnext(clients)) {
       t@@ -273,13 +269,28 @@ viewall(Arg *arg) {
        
        void
        zoom(Arg *arg) {
       +        int tmp;
                unsigned int n;
                Client *c;
       +        XEvent ev;
       +
       +        if(!sel)
       +                return;
       +
       +        if(sel->isfloat || (arrange == dofloat)) {
       +                tmp = sel->x; sel->x = sel->rx; sel->rx = tmp;
       +                tmp = sel->y; sel->y = sel->ry; sel->ry = tmp;
       +                tmp = sel->w; sel->w = sel->rw; sel->rw = tmp;
       +                tmp = sel->h; sel->h = sel->rh; sel->rh = tmp;
       +                resize(sel, True, TopLeft);
       +                while(XCheckMaskEvent(dpy, EnterWindowMask, &ev));
       +                return;
       +        }
        
                for(n = 0, c = clients; c; c = c->next)
                        if(isvisible(c) && !c->isfloat)
                                n++;
       -        if(!sel || sel->isfloat || n < 2 || (arrange != dotile) || maximized)
       +        if(n < 2 || (arrange != dotile))
                        return;
        
                if((c = sel) == nexttiled(clients))