dwm

dynamic window manager
git clone git://git.suckless.org/dwm
Log | Files | Refs | README | LICENSE

commit d800ec05ff63451193a0b858c114f5144534c2a1
parent bda53ac6ad834824e8e5d5678ccd638a122c173a
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:
Mclient.c | 41++++-------------------------------------
Mconfig.arg.h | 1-
Mconfig.default.h | 1-
Mdwm.h | 4++--
Mevent.c | 4++--
Mmain.c | 1-
Mview.c | 23+++++++++++++++++------
7 files changed, 25 insertions(+), 50 deletions(-)

diff --git a/client.c b/client.c @@ -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) { @@ -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); @@ -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; diff --git a/config.arg.h b/config.arg.h @@ -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 } }, \ diff --git a/config.default.h b/config.default.h @@ -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 } }, \ diff --git a/dwm.h b/dwm.h @@ -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; @@ -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 */ @@ -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 */ diff --git a/event.c b/event.c @@ -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); @@ -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; diff --git a/main.c b/main.c @@ -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; diff --git a/view.c b/view.c @@ -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); @@ -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) @@ -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)) { @@ -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))