applied yiyus fgeom patch
authorAnselm R Garbe <garbeam@gmail.com>
Sun, 27 Apr 2008 18:22:52 +0100
changeset 1183 b20561489ffb
parent 1182 9940d125b703
child 1184 bf63402f3b33
applied yiyus fgeom patch
config.def.h
dwm.c
--- a/config.def.h	Sun Apr 27 18:00:45 2008 +0100
+++ b/config.def.h	Sun Apr 27 18:22:52 2008 +0100
@@ -35,8 +35,11 @@
 Layout layouts[] = {
 	/* symbol		function	isfloating */
 	{ "[]=",		tilev,		False }, /* first entry is default */
+	{ "<>=",		tilev,		True },
 	{ "[]|",		tileh,		False },
-	{ "><>",		floating,	True },
+	{ "<>|",		tileh,		True },
+	{ "><>",		NULL,	True },
+	{ "[m]",		monocle,	False },
 	{ "[M]",		monocle,	True },
 };
 
--- a/dwm.c	Sun Apr 27 18:00:45 2008 +0100
+++ b/dwm.c	Sun Apr 27 18:22:52 2008 +0100
@@ -68,6 +68,7 @@
 struct Client {
 	char name[256];
 	int x, y, w, h;
+	int fx, fy, fw, fh;
 	int basew, baseh, incw, inch, maxw, maxh, minw, minh;
 	int minax, maxax, minay, maxay;
 	long flags;
@@ -144,7 +145,6 @@
 void enternotify(XEvent *e);
 void eprint(const char *errstr, ...);
 void expose(XEvent *e);
-void floating(void); /* default floating layout */
 void focus(Client *c);
 void focusin(XEvent *e);
 void focusnext(const char *arg);
@@ -286,13 +286,17 @@
 	Client *c;
 
 	for(c = clients; c; c = c->next)
-		if(isvisible(c))
+		if(isvisible(c)) {
 			unban(c);
+			if(lt->isfloating || c->isfloating)
+				resize(c, c->fx, c->fy, c->fw, c->fh, True);
+		}
 		else
 			ban(c);
 
 	focus(NULL);
-	lt->arrange();
+	if(lt->arrange)
+		lt->arrange();
 	restack();
 }
 
@@ -360,7 +364,7 @@
 			movemouse(c);
 		}
 		else if(ev->button == Button2) {
-			if((floating != lt->arrange) && c->isfloating)
+			if(!lt->isfloating && c->isfloating)
 				togglefloating(NULL);
 			else
 				zoom(NULL);
@@ -670,15 +674,6 @@
 }
 
 void
-floating(void) { /* default floating layout */
-	Client *c;
-
-	for(c = clients; c; c = c->next)
-		if(isvisible(c))
-			resize(c, c->x, c->y, c->w, c->h, True);
-}
-
-void
 focus(Client *c) {
 	if(!c || (c && !isvisible(c)))
 		for(c = stack; c && !isvisible(c); c = c->snext);
@@ -993,8 +988,8 @@
 	/* geometry */
 	c->x = wa->x;
 	c->y = wa->y;
-	c->w = wa->width;
-	c->h = wa->height;
+	c->w = c->fw = wa->width;
+	c->h = c->fh = wa->height;
 	c->oldbw = wa->border_width;
 	if(c->w == sw && c->h == sh) {
 		c->x = sx;
@@ -1010,6 +1005,8 @@
 		c->y = MAX(c->y, wy);
 		c->bw = BORDERPX;
 	}
+	c->fx = c->x;
+	c->fy = c->y;
 
 	wc.border_width = c->bw;
 	XConfigureWindow(dpy, w, CWBorderWidth, &wc);
@@ -1105,8 +1102,11 @@
 				ny = wy + wh - c->h - 2 * c->bw;
 			if(!c->isfloating && !lt->isfloating && (abs(nx - c->x) > SNAP || abs(ny - c->y) > SNAP))
 				togglefloating(NULL);
-			if((lt->isfloating) || c->isfloating)
+			if(lt->isfloating || c->isfloating) {
+				c->fx = nx;
+				c->fy = ny;
 				resize(c, nx, ny, c->w, c->h, False);
+			}
 			break;
 		}
 	}
@@ -1261,10 +1261,16 @@
 			XSync(dpy, False);
 			nw = MAX(ev.xmotion.x - ocx - 2 * c->bw + 1, 1);
 			nh = MAX(ev.xmotion.y - ocy - 2 * c->bw + 1, 1);
-			if(!c->isfloating && !lt->isfloating && (abs(nw - c->w) > SNAP || abs(nh - c->h) > SNAP))
+			if(!c->isfloating && !lt->isfloating && (abs(nw - c->w) > SNAP || abs(nh - c->h) > SNAP)) {
+				c->fx = c->x;
+				c->fy = c->y;
 				togglefloating(NULL);
-			if((lt->isfloating) || c->isfloating)
+			}
+			if((lt->isfloating) || c->isfloating) {
 				resize(c, c->x, c->y, nw, nh, True);
+				c->fw = nw;
+				c->fh = nh;
+			}
 			break;
 		}
 	}
@@ -1284,16 +1290,11 @@
 	if(!lt->isfloating) {
 		wc.stack_mode = Below;
 		wc.sibling = barwin;
-		if(!sel->isfloating) {
-			XConfigureWindow(dpy, sel->win, CWSibling|CWStackMode, &wc);
-			wc.sibling = sel->win;
-		}
-		for(c = nexttiled(clients); c; c = nexttiled(c->next)) {
-			if(c == sel)
-				continue;
-			XConfigureWindow(dpy, c->win, CWSibling|CWStackMode, &wc);
-			wc.sibling = c->win;
-		}
+		for(c = stack; c; c = c->snext)
+			if(!c->isfloating && isvisible(c)) {
+				XConfigureWindow(dpy, c->win, CWSibling|CWStackMode, &wc);
+				wc.sibling = c->win;
+			}
 	}
 	XSync(dpy, False);
 	while(XCheckMaskEvent(dpy, EnterWindowMask, &ev));
@@ -1841,6 +1842,8 @@
 		memcpy(seltags, tmp, TAGSZ);
 		arrange();
 	}
+	else
+		viewprevtag(NULL);
 }
 
 void
@@ -1885,14 +1888,14 @@
 zoom(const char *arg) {
 	Client *c = sel;
 
-	if(!sel || lt->isfloating || sel->isfloating)
-		return;
 	if(c == nexttiled(clients))
-		if(!(c = nexttiled(c->next)))
+		if(!c || !(c = nexttiled(c->next)))
 			return;
-	detach(c);
-	attach(c);
-	focus(c);
+	if(!lt->isfloating && !sel->isfloating) {
+		detach(c);
+		attach(c);
+		focus(c);
+	}
 	arrange();
 }