about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorarg@mmvi <unknown>2006-09-22 07:37:56 +0200
committerarg@mmvi <unknown>2006-09-22 07:37:56 +0200
commitd800ec05ff63451193a0b858c114f5144534c2a1 (patch)
treecc6261bca4c022b6a22d0a1568bf3ea3ec4c9c06
parentbda53ac6ad834824e8e5d5678ccd638a122c173a (diff)
downloaddwm-d800ec05ff63451193a0b858c114f5144534c2a1.tar.gz
implemented the maximization as I described on the mailinglist, this feels better to me.
-rw-r--r--client.c41
-rw-r--r--config.arg.h1
-rw-r--r--config.default.h1
-rw-r--r--dwm.h4
-rw-r--r--event.c4
-rw-r--r--main.c1
-rw-r--r--view.c23
7 files changed, 25 insertions, 50 deletions
diff --git a/client.c b/client.c
index 725f70b..2f1e2b3 100644
--- 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
index 9bb581e..6f9aed2 100644
--- 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
index ad048ae..9c67d98 100644
--- 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
index c08388f..60f9201 100644
--- 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
index 3783eb4..d5f4aa8 100644
--- 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
index c6e67e9..b3c753e 100644
--- 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
index 80d483a..fce7309 100644
--- 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))