dwm

my fork of dwm
Index Commits 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))