implemented the maximization as I described on the mailinglist, this feels better to me.
authorarg@mmvi
Fri, 22 Sep 2006 07:37:56 +0200
changeset 473 2d8af0d7920d
parent 472 298be2d65d2e
child 474 f57b92d6bc1d
implemented the maximization as I described on the mailinglist, this feels better to me.
client.c
config.arg.h
config.default.h
dwm.h
event.c
main.c
view.c
--- a/client.c	Wed Sep 20 09:53:21 2006 +0200
+++ b/client.c	Fri Sep 22 07:37:56 2006 +0200
@@ -89,8 +89,6 @@
 	if(!sel)
 		sel = c;
 	else if(sel != c) {
-		if(maximized)
-			togglemax(NULL);
 		old = sel;
 		sel = c;
 		if(old) {
@@ -208,6 +206,10 @@
 	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 @@
 }
 
 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;
 
--- a/config.arg.h	Wed Sep 20 09:53:21 2006 +0200
+++ b/config.arg.h	Fri Sep 22 07:37:56 2006 +0200
@@ -33,7 +33,6 @@
 	{ 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 } }, \
--- a/config.default.h	Wed Sep 20 09:53:21 2006 +0200
+++ b/config.default.h	Fri Sep 22 07:37:56 2006 +0200
@@ -28,7 +28,6 @@
 	{ 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 } }, \
--- a/dwm.h	Wed Sep 20 09:53:21 2006 +0200
+++ b/dwm.h	Fri Sep 22 07:37:56 2006 +0200
@@ -78,6 +78,7 @@
 	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 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 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 */
--- a/event.c	Wed Sep 20 09:53:21 2006 +0200
+++ b/event.c	Fri Sep 22 07:37:56 2006 +0200
@@ -130,7 +130,7 @@
 	}
 	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 @@
 	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;
--- a/main.c	Wed Sep 20 09:53:21 2006 +0200
+++ b/main.c	Fri Sep 22 07:37:56 2006 +0200
@@ -24,7 +24,6 @@
 Atom wmatom[WMLast], netatom[NetLast];
 Bool running = True;
 Bool issel = True;
-Bool maximized = False;
 Client *clients = NULL;
 Client *sel = NULL;
 Client *stack = NULL;
--- a/view.c	Wed Sep 20 09:53:21 2006 +0200
+++ b/view.c	Fri Sep 22 07:37:56 2006 +0200
@@ -61,8 +61,6 @@
 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 @@
 	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 @@
 	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 @@
 
 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))