Subdirectorios comunes: dwm-4.8/.hg y dwm-nolayouts/.hg
diff -up dwm-4.8/config.def.h dwm-nolayouts/config.def.h
--- dwm-4.8/config.def.h	2008-03-06 16:30:28.000000000 +0100
+++ dwm-nolayouts/config.def.h	2008-03-06 17:09:59.000000000 +0100
@@ -1,25 +1,25 @@
 /* See LICENSE file for copyright and license details. */
 
 /* appearance */
-#define BORDERPX		1
-#define FONT			"-*-terminus-medium-r-normal-*-14-*-*-*-*-*-*-*"
+#define BORDERPX		3
+#define FONT			"-*-terminus-bold-r-normal-*-14-*-*-*-*-*-*-*"
 #define NORMBORDERCOLOR		"#cccccc"
-#define NORMBGCOLOR		"#cccccc"
+#define NORMBGCOLOR		"#e6e6e6"
 #define NORMFGCOLOR		"#000000"
 #define SELBORDERCOLOR		"#0066ff"
-#define SELBGCOLOR		"#0066ff"
-#define SELFGCOLOR		"#ffffff"
+#define SELBGCOLOR		"#e6e6e6"
+#define SELFGCOLOR		"#0066ff"
 
 /* bar position */
 #define BX sx
 #define BY sy
-#define BW MW
+#define BW sw
 
 /* window area */
 #define WX 0
 #define WY bh
 #define WW sw
-#define WH sh
+#define WH (sh - bh)
 
 /* master area */
 #define MX sx
@@ -29,38 +29,31 @@
 
 /* tile area, might be on a different screen */
 #define TX sx + MW
-#define TY sy
+#define TY bh
 #define TW sw - MW
-#define TH sh
+#define TH (sh - bh)
 
 /* monocle area, might be restricted to a specific screen */
-#define MOX sx
-#define MOY MY
-#define MOW sw
-#define MOH MH
+#define MOX WX
+#define MOY WY
+#define MOW WW - 2 * BORDERPX
+#define MOH WH - 2 * BORDERPX
 
 /* tagging */
-const char tags[][MAXTAGLEN] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" };
+const char tags[][MAXTAGLEN] = { "1", "2", "3", "4", "w" };
 
 Rule rules[] = {
 	/* class:instance:title substr	tags ref	isfloating */
-	{ "Firefox",			tags[8],	False },
+	{ "Firefox",			tags[4],	False },
 	{ "Gimp",			NULL,		True },
 	{ "MPlayer",			NULL,		True },
 	{ "Acroread",			NULL,		True },
 };
 
 /* layout(s) */
-#define RESIZEHINTS		True	/* False - respect size hints in tiled resizals */
+#define RESIZEHINTS		False	/* False - respect size hints in tiled resizals */
 #define SNAP			32	/* snap pixel */
 
-Layout layouts[] = {
-	/* symbol		function */
-	{ "[]=",		tile }, /* first entry is default */
-	{ "><>",		floating },
-	{ "[M]",		monocle },
-};
-
 /* key definitions */
 #define MODKEY			Mod1Mask
 Key keys[] = {
@@ -78,48 +71,30 @@ Key keys[] = {
 	{ MODKEY,			XK_r,		reapply,	NULL },
 	{ MODKEY,			XK_Return,	zoom,		NULL },
 	{ MODKEY,			XK_Tab,		viewprevtag,	NULL },
-	{ MODKEY,			XK_m,		setlayout,	"[M]" },
-	{ MODKEY,			XK_f,		setlayout,	"><>" },
-	{ MODKEY,			XK_t,		setlayout,	"[]=" },
-	{ MODKEY|ShiftMask,		XK_space,	togglefloating,	NULL },
+	{ MODKEY,			XK_space,		togglemax,	NULL },
+	{ MODKEY|ShiftMask,		XK_space,	raiseclient,	NULL },
 	{ MODKEY|ShiftMask,		XK_c,		killclient,	NULL },
 	{ MODKEY,			XK_0,		view,		NULL },
 	{ MODKEY,			XK_1,		view,		tags[0] },
 	{ MODKEY,			XK_2,		view,		tags[1] },
 	{ MODKEY,			XK_3,		view,		tags[2] },
 	{ MODKEY,			XK_4,		view,		tags[3] },
-	{ MODKEY,			XK_5,		view,		tags[4] },
-	{ MODKEY,			XK_6,		view,		tags[5] },
-	{ MODKEY,			XK_7,		view,		tags[6] },
-	{ MODKEY,			XK_8,		view,		tags[7] },
-	{ MODKEY,			XK_9,		view,		tags[8] },
+	{ MODKEY,			XK_w,		view,		tags[4] },
 	{ MODKEY|ControlMask,		XK_1,		toggleview,	tags[0] },
 	{ MODKEY|ControlMask,		XK_2,		toggleview,	tags[1] },
 	{ MODKEY|ControlMask,		XK_3,		toggleview,	tags[2] },
 	{ MODKEY|ControlMask,		XK_4,		toggleview,	tags[3] },
-	{ MODKEY|ControlMask,		XK_5,		toggleview,	tags[4] },
-	{ MODKEY|ControlMask,		XK_6,		toggleview,	tags[5] },
-	{ MODKEY|ControlMask,		XK_7,		toggleview,	tags[6] },
-	{ MODKEY|ControlMask,		XK_8,		toggleview,	tags[7] },
-	{ MODKEY|ControlMask,		XK_9,		toggleview,	tags[8] },
+	{ MODKEY|ControlMask,		XK_w,		toggleview,	tags[4] },
 	{ MODKEY|ShiftMask,		XK_0,		tag,		NULL },
 	{ MODKEY|ShiftMask,		XK_1,		tag,		tags[0] },
 	{ MODKEY|ShiftMask,		XK_2,		tag,		tags[1] },
 	{ MODKEY|ShiftMask,		XK_3,		tag,		tags[2] },
 	{ MODKEY|ShiftMask,		XK_4,		tag,		tags[3] },
-	{ MODKEY|ShiftMask,		XK_5,		tag,		tags[4] },
-	{ MODKEY|ShiftMask,		XK_6,		tag,		tags[5] },
-	{ MODKEY|ShiftMask,		XK_7,		tag,		tags[6] },
-	{ MODKEY|ShiftMask,		XK_8,		tag,		tags[7] },
-	{ MODKEY|ShiftMask,		XK_9,		tag,		tags[8] },
+	{ MODKEY|ShiftMask,		XK_w,		tag,		tags[4] },
 	{ MODKEY|ControlMask|ShiftMask,	XK_1,		toggletag,	tags[0] },
 	{ MODKEY|ControlMask|ShiftMask,	XK_2,		toggletag,	tags[1] },
 	{ MODKEY|ControlMask|ShiftMask,	XK_3,		toggletag,	tags[2] },
 	{ MODKEY|ControlMask|ShiftMask,	XK_4,		toggletag,	tags[3] },
-	{ MODKEY|ControlMask|ShiftMask,	XK_5,		toggletag,	tags[4] },
-	{ MODKEY|ControlMask|ShiftMask,	XK_6,		toggletag,	tags[5] },
-	{ MODKEY|ControlMask|ShiftMask,	XK_7,		toggletag,	tags[6] },
-	{ MODKEY|ControlMask|ShiftMask,	XK_8,		toggletag,	tags[7] },
-	{ MODKEY|ControlMask|ShiftMask,	XK_9,		toggletag,	tags[8] },
+	{ MODKEY|ControlMask|ShiftMask,	XK_w,		toggletag,	tags[4] },
 	{ MODKEY|ShiftMask,		XK_q,		quit,		NULL },
 };
diff -up dwm-4.8/dwm.c dwm-nolayouts/dwm.c
--- dwm-4.8/dwm.c	2008-03-06 16:30:28.000000000 +0100
+++ dwm-nolayouts/dwm.c	2008-03-06 17:15:22.000000000 +0100
@@ -103,11 +103,6 @@ typedef struct {
 } Key;
 
 typedef struct {
-	const char *symbol;
-	void (*arrange)(void);
-} Layout;
-
-typedef struct {
 	const char *prop;
 	const char *tag;
 	Bool isfloating;
@@ -135,7 +130,6 @@ void *emallocz(unsigned int size);
 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);
@@ -157,11 +151,11 @@ void killclient(const char *arg);
 void manage(Window w, XWindowAttributes *wa);
 void mappingnotify(XEvent *e);
 void maprequest(XEvent *e);
-void monocle(void);
 void movemouse(Client *c);
 Client *nexttiled(Client *c);
 void propertynotify(XEvent *e);
 void quit(const char *arg);
+void raiseclient(const char *arg);
 void reapply(const char *arg);
 void resize(Client *c, int x, int y, int w, int h, Bool sizehints);
 void resizemouse(Client *c);
@@ -169,14 +163,14 @@ void restack(void);
 void run(void);
 void scan(void);
 void setclientstate(Client *c, long state);
-void setlayout(const char *arg);
 void setup(void);
 void spawn(const char *arg);
 void tag(const char *arg);
 unsigned int textnw(const char *text, unsigned int len);
 unsigned int textw(const char *text);
 void tile(void);
-void togglefloating(const char *arg);
+void togglefloating(void);
+void togglemax(const char *arg);
 void toggletag(const char *arg);
 void toggleview(const char *arg);
 void unban(Client *c);
@@ -213,7 +207,6 @@ void (*handler[LASTEvent]) (XEvent *) = 
 	[UnmapNotify] = unmapnotify
 };
 Atom wmatom[WMLast], netatom[NetLast];
-Bool dozoom = True;
 Bool otherwm, readin;
 Bool running = True;
 Bool *prevtags;
@@ -224,7 +217,6 @@ Client *stack = NULL;
 Cursor cursor[CurLast];
 Display *dpy;
 DC dc = {0};
-Layout *lt = NULL;
 Window root, barwin;
 
 /* configuration, allows nested code to access above variables */
@@ -275,7 +267,7 @@ arrange(void) {
 			ban(c);
 
 	focus(NULL);
-	lt->arrange();
+	tile();
 	restack();
 }
 
@@ -327,6 +319,21 @@ buttonpress(XEvent *e) {
 				return;
 			}
 		}
+		if(ev->x < BW - textw(stext) && sel) {
+			if(ev->button == Button1) {
+				XWarpPointer(dpy, None, sel->win, 0, 0, 0, 0, 1, 1);
+				raiseclient(NULL);
+				movemouse(sel);
+			}
+			else if(ev->button == Button2)
+				zoom(NULL);
+			else if(ev->button == Button3)
+				resizemouse(sel);
+			else if(ev->button == Button4)
+				focusprev(NULL);
+			else if(ev->button == Button5)
+				focusnext(NULL);
+		}
 	}
 	else if((c = getclient(ev->window))) {
 		focus(c);
@@ -334,14 +341,11 @@ buttonpress(XEvent *e) {
 			return;
 		if(ev->button == Button1) {
 			restack();
+			raiseclient(NULL);
 			movemouse(c);
 		}
-		else if(ev->button == Button2) {
-			if((floating != lt->arrange) && c->isfloating)
-				togglefloating(NULL);
-			else
-				zoom(NULL);
-		}
+		else if(ev->button == Button2)
+			zoom(NULL);
 		else if(ev->button == Button3 && !c->isfixed) {
 			restack();
 			resizemouse(c);
@@ -428,7 +432,7 @@ configurerequest(XEvent *e) {
 	if((c = getclient(ev->window))) {
 		if(ev->value_mask & CWBorderWidth)
 			c->border = ev->border_width;
-		if(c->isfixed || c->isfloating || (floating == lt->arrange)) {
+		if(c->isfixed || c->isfloating) {
 			if(ev->value_mask & CWX)
 				c->x = sx + ev->x;
 			if(ev->value_mask & CWY)
@@ -510,9 +514,7 @@ drawbar(void) {
 		}
 		dc.x += dc.w;
 	}
-	dc.w = blw;
-	drawtext(lt->symbol, dc.norm, False);
-	x = dc.x + dc.w;
+	x = dc.x;
 	dc.w = textw(stext);
 	dc.x = BW - dc.w;
 	if(dc.x < x) {
@@ -524,7 +526,6 @@ drawbar(void) {
 		dc.x = x;
 		if(c) {
 			drawtext(c->name, dc.sel, False);
-			drawsquare(False, c->isfloating, False, dc.sel);
 		}
 		else
 			drawtext(NULL, dc.norm, False);
@@ -613,6 +614,7 @@ enternotify(XEvent *e) {
 		focus(c);
 	else
 		focus(NULL);
+	restack();
 }
 
 void
@@ -634,38 +636,21 @@ expose(XEvent *e) {
 }
 
 void
-floating(void) { /* default floating layout */
-	Client *c;
-
-	dozoom = False;
-	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);
 	if(sel && sel != c) {
 		grabbuttons(sel, False);
 		XSetWindowBorder(dpy, sel->win, dc.norm[ColBorder]);
-		if(lt->arrange == monocle)
-			resize(sel, sel->rx, sel->ry, sel->rw, sel->rh, True);
+		if(sel->rh != 0) {
+			resize(sel, sel->rx, sel->ry, sel->rw, sel->rh, RESIZEHINTS);
+			sel->rh = 0;
+		}
 	}
 	if(c) {
 		detachstack(c);
 		attachstack(c);
 		grabbuttons(c, True);
-		if(lt->arrange == monocle) {
-			if(sel != c) {
-				c->rx = c->x;
-				c->ry = c->y;
-				c->rw = c->w;
-				c->rh = c->h;
-			}
-			resize(c, MOX, MOY, MOW, MOH, RESIZEHINTS);
-		}
 	}
 	sel = c;
 	if(c) {
@@ -990,7 +975,8 @@ manage(Window w, XWindowAttributes *wa) 
 	c->x = c->rx = wa->x + sx;
 	c->y = c->ry = wa->y + sy;
 	c->w = c->rw = wa->width;
-	c->h = c->rh = wa->height;
+	c->h = wa->height;
+	c->rh = 0;
 	c->oldborder = wa->border_width;
 
 	if(c->w == sw && c->h == sh) {
@@ -1057,11 +1043,6 @@ maprequest(XEvent *e) {
 }
 
 void
-monocle(void) {
-	dozoom = False;
-}
-
-void
 movemouse(Client *c) {
 	int x1, y1, ocx, ocy, di, nx, ny;
 	unsigned int dui;
@@ -1077,6 +1058,9 @@ movemouse(Client *c) {
 	for(;;) {
 		XMaskEvent(dpy, MOUSEMASK|ExposureMask|SubstructureRedirectMask, &ev);
 		switch (ev.type) {
+		case ButtonPress:
+			if(ev.xbutton.button == Button3)
+				togglemax(NULL);
 		case ButtonRelease:
 			XUngrabPointer(dpy, CurrentTime);
 			return;
@@ -1089,17 +1073,17 @@ movemouse(Client *c) {
 			XSync(dpy, False);
 			nx = ocx + (ev.xmotion.x - x1);
 			ny = ocy + (ev.xmotion.y - y1);
-			if(abs(sx - nx) < SNAP)
-				nx = sx;
-			else if(abs((sx + sw) - (nx + c->w + 2 * c->border)) < SNAP)
-				nx = sx + sw - c->w - 2 * c->border;
-			if(abs(sy - ny) < SNAP)
-				ny = sy;
-			else if(abs((sy + sh) - (ny + c->h + 2 * c->border)) < SNAP)
-				ny = sy + sh - c->h - 2 * c->border;
-			if(!c->isfloating && (lt->arrange != floating) && (abs(nx - c->x) > SNAP || abs(ny - c->y) > SNAP))
-				togglefloating(NULL);
-			if((lt->arrange == floating) || c->isfloating)
+			if(abs(WX - nx) < SNAP)
+				nx = WX;
+			else if(abs((WX + WW) - (nx + c->w + 2 * c->border)) < SNAP)
+				nx = WX + WW - c->w - 2 * c->border;
+			if(abs(WY - ny) < SNAP)
+				ny = WY;
+			else if(abs((WY + WH) - (ny + c->h + 2 * c->border)) < SNAP)
+				ny = WY + WH - c->h - 2 * c->border;
+			if(!c->isfloating && (abs(nx - c->x) > SNAP || abs(ny - c->y) > SNAP))
+				togglefloating();
+			if(c->isfloating)
 				resize(c, nx, ny, c->w, c->h, False);
 			break;
 		}
@@ -1150,6 +1134,13 @@ quit(const char *arg) {
 }
 
 void
+raiseclient(const char *arg) {
+	if(sel)
+		XRaiseWindow(dpy, sel->win);
+}
+
+
+void
 reapply(const char *arg) {
 	static Bool zerotags[LENGTH(tags)] = { 0 };
 	Client *c;
@@ -1224,6 +1215,8 @@ resize(Client *c, int x, int y, int w, i
 		configure(c);
 		XSync(dpy, False);
 	}
+	if(c->x != MOX || c->y != MOY || c->w != MOW || c->h != MOH)
+		c->rh = 0;
 }
 
 void
@@ -1258,9 +1251,9 @@ resizemouse(Client *c) {
 				nw = 1;
 			if((nh = ev.xmotion.y - ocy - 2 * c->border + 1) <= 0)
 				nh = 1;
-			if(!c->isfloating && (lt->arrange != floating) && (abs(nw - c->w) > SNAP || abs(nh - c->h) > SNAP))
-				togglefloating(NULL);
-			if((lt->arrange == floating) || c->isfloating)
+			if(!c->isfloating && (abs(nw - c->w) > SNAP || abs(nh - c->h) > SNAP))
+				togglefloating();
+			if(c->isfloating)
 				resize(c, c->x, c->y, nw, nh, True);
 			break;
 		}
@@ -1276,21 +1269,19 @@ restack(void) {
 	drawbar();
 	if(!sel)
 		return;
-	if(sel->isfloating || (lt->arrange == floating))
+	if(sel->isfloating)
 		XRaiseWindow(dpy, sel->win);
-	if(lt->arrange != floating) {
-		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;
-		}
+	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;
 	}
 	XSync(dpy, False);
 	while(XCheckMaskEvent(dpy, EnterWindowMask, &ev));
@@ -1392,24 +1383,6 @@ setclientstate(Client *c, long state) {
 }
 
 void
-setlayout(const char *arg) {
-	unsigned int i;
-
-	if(!arg)
-		return;
-	for(i = 0; i < LENGTH(layouts); i++)
-		if(!strcmp(arg, layouts[i].symbol))
-			break;
-	if(i == LENGTH(layouts))
-		return;
-	lt = &layouts[i];
-	if(sel)
-		arrange();
-	else
-		drawbar();
-}
-
-void
 setup(void) {
 	unsigned int i;
 	XSetWindowAttributes wa;
@@ -1455,16 +1428,6 @@ setup(void) {
 	prevtags = emallocz(TAGSZ);
 	seltags[0] = prevtags[0] = True;
 
-	/* init layouts */
-	lt = &layouts[0];
-
-	/* init bar */
-	for(blw = i = 0; i < LENGTH(layouts); i++) {
-		i = textw(layouts[i].symbol);
-		if(i > blw)
-			blw = i;
-	}
-
 	wa.override_redirect = 1;
 	wa.background_pixmap = ParentRelative;
 	wa.event_mask = ButtonPressMask|ExposureMask;
@@ -1549,7 +1512,6 @@ tile(void) {
 	unsigned int i, n, nx, ny, nw, nh, mw, th;
 	Client *c, *mc;
 
-	dozoom = True;
 	nx = MX;
 	ny = MY;
 	nw = 0;
@@ -1557,7 +1519,7 @@ tile(void) {
 		n++;
 
 	/* window geoms */
-	mw = (n == 1) ? MOW : MW;
+	mw = (n == 1) ? MOW + 2 * BORDERPX : MW;
 	th = (n > 1) ? TH / (n - 1) : 0;
 	if(n > 1 && th < bh)
 		th = TH;
@@ -1589,16 +1551,29 @@ tile(void) {
 }
 
 void
-togglefloating(const char *arg) {
+togglefloating(void) {
 	if(!sel)
 		return;
 	sel->isfloating = !sel->isfloating;
 	if(sel->isfloating)
 		resize(sel, sel->x, sel->y, sel->w, sel->h, True);
+	else
+		sel->rh = 0;
 	arrange();
 }
 
 void
+togglemax(const char *arg) {
+	if(!sel || sel->rh != 0)
+		return;
+	sel->rx = sel->x;
+	sel->ry = sel->y;
+	sel->rw = sel->w;
+	sel->rh = sel->h;
+	resize(sel, MOX, MOY, MOW, MOH, RESIZEHINTS);
+}
+
+void
 toggletag(const char *arg) {
 	unsigned int i, j;
 
@@ -1796,9 +1771,13 @@ void
 zoom(const char *arg) {
 	Client *c = sel;
 
-	if(!sel || !dozoom || sel->isfloating)
+	if(!sel)
+		return;
+	if(sel->isfloating) {
+		togglefloating();
 		return;
-	if(c == nexttiled(clients))
+	}
+	if(c == nexttiled(clients) && c->rh == 0)
 		if(!(c = nexttiled(c->next)))
 			return;
 	detach(c);
