[wiki] [sites] wiki updated

From: <hg_AT_suckless.org>
Date: Mon, 12 Sep 2011 12:33:34 +0200 (CEST)

changeset: 767:4307e8502725
tag: tip
user: Moritz Wilhelmy <moritz+hg_AT_wzff.de>
date: Mon Sep 12 12:35:44 2011 +0200
files: dwm.suckless.org/patches/README dwm.suckless.org/patches/dwm-5.7.2-pertag.diff dwm.suckless.org/patches/dwm-5.7.2-statuscolors.diff dwm.suckless.org/patches/dwm-5.8.2-statuscolors.diff dwm.suckless.org/patches/dwm-gap-5.7.2.diff dwm.suckless.org/patches/dwm-pertag-5.6.1.diff dwm.suckless.org/patches/dwm-uselessgap-5.8.diff dwm.suckless.org/patches/fancybar-5.6.1.diff dwm.suckless.org/patches/fancybar.md dwm.suckless.org/patches/flextile-5.8.1.diff dwm.suckless.org/patches/flextile.md dwm.suckless.org/patches/gapless_grid.md dwm.suckless.org/patches/historical/dwm-5.7.2-pertag.diff dwm.suckless.org/patches/historical/dwm-5.7.2-statuscolors.diff dwm.suckless.org/patches/historical/dwm-5.8.2-statuscolors.diff dwm.suckless.org/patches/historical/dwm-gap-5.7.2.diff dwm.suckless.org/patches/historical/dwm-pertag-5.6.1.diff dwm.suckless.org/patches/historical/dwm-uselessgap-5.8.diff dwm.suckless.org/patches/historical/fancybar-5.6.1.diff dwm.suckless.org/patches/historical/flextile-5.8.1.diff dwm.suckl
ess.org/patches/historical/gapless_grid.md dwm.suckless.org/patches/historical/index.md dwm.suckless.org/patches/pertag.md dwm.suckless.org/patches/statuscolors.md dwm.suckless.org/patches/uselessgap.md dwm.suckless.org/patches/warp.md
description:
moved old versions of patches to historical and updated links


diff -r 61b77b61c3fb -r 4307e8502725 dwm.suckless.org/patches/README
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dwm.suckless.org/patches/README Mon Sep 12 12:35:44 2011 +0200
_AT_@ -0,0 +1,3 @@
+Once you finish a new version of a patch, please move the older patch into the
+historical directory and update the links to link inside historical, in order
+to keep the patches directory free from clutter.
diff -r 61b77b61c3fb -r 4307e8502725 dwm.suckless.org/patches/dwm-5.7.2-pertag.diff
--- a/dwm.suckless.org/patches/dwm-5.7.2-pertag.diff Mon Sep 12 10:45:45 2011 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
_AT_@ -1,184 +0,0 @@
-diff -r 2bcd25cce4ab dwm.c
---- a/dwm.c Sun Sep 27 20:20:14 2009 +0100
-+++ b/dwm.c Tue Oct 20 18:27:52 2009 -0300
-_AT_@ -120,26 +120,6 @@
- void (*arrange)(Monitor *);
- } Layout;
-
--struct Monitor {
-- char ltsymbol[16];
-- float mfact;
-- int num;
-- int by; /* bar geometry */
-- int mx, my, mw, mh; /* screen size */
-- int wx, wy, ww, wh; /* window area */
-- unsigned int seltags;
-- unsigned int sellt;
-- unsigned int tagset[2];
-- Bool showbar;
-- Bool topbar;
-- Client *clients;
-- Client *sel;
-- Client *stack;
-- Monitor *next;
-- Window barwin;
-- const Layout *lt[2];
--};
--
- typedef struct {
- 	const char *class;
- 	const char *instance;
-_AT_@ -273,6 +253,31 @@
- /* configuration, allows nested code to access above variables */
- #include "config.h"
- 
-+struct Monitor {
-+	char ltsymbol[16];
-+	float mfact;
-+	int num;
-+	int by;               /* bar geometry */
-+	int mx, my, mw, mh;   /* screen size */
-+	int wx, wy, ww, wh;   /* window area  */
-+	unsigned int seltags;
-+	unsigned int sellt;
-+	unsigned int tagset[2];
-+	Bool showbar;
-+	Bool topbar;
-+	Client *clients;
-+	Client *sel;
-+	Client *stack;
-+	Monitor *next;
-+	Window barwin;
-+	const Layout *lt[2];
-+	int curtag;
-+	int prevtag;
-+	const Layout *lts[LENGTH(tags) + 1];
-+	double mfacts[LENGTH(tags) + 1];
-+	Bool showbars[LENGTH(tags) + 1];
-+};
-+
- /* compile-time check if all tags fit into an unsigned int bit array. */
- struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; };
- 
-_AT_@ -1450,7 +1455,7 @@
- 	if(!arg || !arg->v || arg->v != selmon->lt[selmon->sellt])
- 		selmon->sellt ^= 1;
- 	if(arg && arg->v)
--		selmon->lt[selmon->sellt] = (Layout *)arg->v;
-+		selmon->lt[selmon->sellt] = selmon->lts[selmon->curtag] = (Layout *)arg->v;
- 	strncpy(selmon->ltsymbol, selmon->lt[selmon->sellt]->symbol, sizeof selmon->ltsymbol);
- 	if(selmon->sel)
- 		arrange(selmon);
-_AT_@ -1468,13 +1473,15 @@
- 	f = arg->f < 1.0 ? arg->f + selmon->mfact : arg->f - 1.0;
- 	if(f < 0.1 || f > 0.9)
- 		return;
--	selmon->mfact = f;
-+	selmon->mfact = selmon->mfacts[selmon->curtag] = f;
- 	arrange(selmon);
- }
- 
- void
- setup(void) {
- 	XSetWindowAttributes wa;
-+	Monitor *m;
-+	unsigned int i;
- 
- 	/* clean up any zombies immediately */
- 	sigchld(0);
-_AT_@ -1509,7 +1516,27 @@
- 	XSetLineAttributes(dpy, dc.gc, 1, LineSolid, CapButt, JoinMiter);
- 	if(!dc.font.set)
- 		XSetFont(dpy, dc.gc, dc.font.xfont->fid);
-+	/* init tags */
-+	for(m = mons; m; m = m->next)
-+		m->curtag = m->prevtag = 1;
-+	/* init mfacts */
-+	for(m = mons; m; m = m->next) {
-+		for(i=0; i < LENGTH(tags) + 1 ; i++) {
-+			m->mfacts[i] = m->mfact;
-+		}
-+	}
-+	/* init layouts */
-+	for(m = mons; m; m = m->next) {
-+		for(i=0; i < LENGTH(tags) + 1; i++) {
-+			m->lts[i] = &layouts[0];
-+		}
-+	}
- 	/* init bars */
-+	for(m = mons; m; m = m->next) {
-+		for(i=0; i < LENGTH(tags) + 1; i++) {
-+			m->showbars[i] = m->showbar;
-+		}
-+	}
- 	updatebars();
- 	updatestatus();
- 	/* EWMH support per view */
-_AT_@ -1620,7 +1647,7 @@
- 
- void
- togglebar(const Arg *arg) {
--	selmon->showbar = !selmon->showbar;
-+	selmon->showbar = selmon->showbars[selmon->curtag] = !selmon->showbar;
- 	updatebarpos(selmon);
- 	XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh);
- 	arrange(selmon);
-_AT_@ -1640,12 +1667,27 @@
- void
- toggletag(const Arg *arg) {
- 	unsigned int newtags;
-+	unsigned int i;
- 
- 	if(!selmon->sel)
- 		return;
- 	newtags = selmon->sel->tags ^ (arg->ui & TAGMASK);
- 	if(newtags) {
- 		selmon->sel->tags = newtags;
-+		if(newtags == ~0) {
-+			selmon->prevtag = selmon->curtag;
-+			selmon->curtag = 0;
-+		}
-+		if(!(newtags & 1 << (selmon->curtag - 1))) {
-+			selmon->prevtag = selmon->curtag;
-+			for (i=0; !(newtags & 1 << i); i++);
-+			selmon->curtag = i + 1;
-+		}
-+		selmon->sel->tags = newtags;
-+		selmon->lt[selmon->sellt] = selmon->lts[selmon->curtag];
-+		selmon->mfact = selmon->mfacts[selmon->curtag];
-+		if (selmon->showbar != selmon->showbars[selmon->curtag])
-+			togglebar(NULL);
- 		arrange(selmon);
- 	}
- }
-_AT_@ -1912,11 +1954,29 @@
- 
- void
- view(const Arg *arg) {
-+	unsigned int i;
-+
- 	if((arg->ui & TAGMASK) == selmon->tagset[selmon->seltags])
- 		return;
- 	selmon->seltags ^= 1; /* toggle sel tagset */
--	if(arg->ui & TAGMASK)
-+	if(arg->ui & TAGMASK) {
- 		selmon->tagset[selmon->seltags] = arg->ui & TAGMASK;
-+		selmon->prevtag = selmon->curtag;
-+		if(arg->ui == ~0)
-+			selmon->curtag = 0;
-+		else {
-+			for (i=0; !(arg->ui & 1 << i); i++);
-+			selmon->curtag = i + 1;
-+		}
-+	} else {
-+		selmon->prevtag= selmon->curtag ^ selmon->prevtag;
-+		selmon->curtag^= selmon->prevtag;
-+		selmon->prevtag= selmon->curtag ^ selmon->prevtag;
-+	}
-+	selmon->lt[selmon->sellt]= selmon->lts[selmon->curtag];
-+	selmon->mfact = selmon->mfacts[selmon->curtag];
-+	if(selmon->showbar != selmon->showbars[selmon->curtag])
-+		togglebar(NULL);
- 	arrange(selmon);
- }
- 
diff -r 61b77b61c3fb -r 4307e8502725 dwm.suckless.org/patches/dwm-5.7.2-statuscolors.diff
--- a/dwm.suckless.org/patches/dwm-5.7.2-statuscolors.diff	Mon Sep 12 10:45:45 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
_AT_@ -1,234 +0,0 @@
-diff -r 2bcd25cce4ab config.def.h
---- a/config.def.h	Sun Sep 27 20:20:14 2009 +0100
-+++ b/config.def.h	Mon Oct 05 22:01:49 2009 -0300
-_AT_@ -1,13 +1,16 @@
- /* See LICENSE file for copyright and license details. */
- 
- /* appearance */
-+#define NUMCOLORS         4             // need at least 3
-+static const char colors[NUMCOLORS][ColLast][8] = {
-+	// border   foreground  background
-+	{ "#cccccc", "#000000", "#cccccc" },  // 0 = normal
-+	{ "#0066ff", "#ffffff", "#0066ff" },  // 1 = selected
-+	{ "#0066ff", "#0066ff", "#ffffff" },  // 2 = urgent/warning
-+	{ "#ff0000", "#ffffff", "#ff0000" },  // 3 = error
-+	// add more here
-+};
- static const char font[]            = "-*-*-medium-*-*-*-14-*-*-*-*-*-*-*";
--static const char normbordercolor[] = "#cccccc";
--static const char normbgcolor[]     = "#cccccc";
--static const char normfgcolor[]     = "#000000";
--static const char selbordercolor[]  = "#0066ff";
--static const char selbgcolor[]      = "#0066ff";
--static const char selfgcolor[]      = "#ffffff";
- static const unsigned int borderpx  = 1;        /* border pixel of windows */
- static const unsigned int snap      = 32;       /* snap pixel */
- static const Bool showbar           = True;     /* False means no bar */
-_AT_@ -45,7 +48,7 @@
- #define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } }
- 
- /* commands */
--static const char *dmenucmd[] = { "dmenu_run", "-fn", font, "-nb", normbgcolor, "-nf", normfgcolor, "-sb", selbgcolor, "-sf", selfgcolor, NULL };
-+static const char *dmenucmd[] = { "dmenu_run", "-fn", font, "-nb", colors[0][ColBG], "-nf", colors[0][ColFG], "-sb", colors[1][ColBG], "-sf", colors[1][ColFG], NULL };
- static const char *termcmd[]  = { "uxterm", NULL };
- 
- static Key keys[] = {
-diff -r 2bcd25cce4ab dwm.c
---- a/dwm.c	Sun Sep 27 20:20:14 2009 +0100
-+++ b/dwm.c	Mon Oct 05 22:01:49 2009 -0300
-_AT_@ -48,6 +48,7 @@
- #define LENGTH(X)               (sizeof X / sizeof X[0])
- #define MAX(A, B)               ((A) > (B) ? (A) : (B))
- #define MIN(A, B)               ((A) < (B) ? (A) : (B))
-+#define MAXCOLORS               8
- #define MOUSEMASK               (BUTTONMASK|PointerMotionMask)
- #define WIDTH(X)                ((X)->w + 2 * (X)->bw)
- #define HEIGHT(X)               ((X)->h + 2 * (X)->bw)
-_AT_@ -95,8 +96,7 @@
- 
- typedef struct {
- 	int x, y, w, h;
--	unsigned long norm[ColLast];
--	unsigned long sel[ColLast];
-+    unsigned long colors[MAXCOLORS][ColLast];
- 	Drawable drawable;
- 	GC gc;
- 	struct {
-_AT_@ -172,8 +172,9 @@
- static Monitor *dirtomon(int dir);
- static void drawbar(Monitor *m);
- static void drawbars(void);
--static void drawsquare(Bool filled, Bool empty, Bool invert, unsigned long col[ColLast]);
--static void drawtext(const char *text, unsigned long col[ColLast], Bool invert);
-+static void drawcoloredtext(char *text);
-+static void drawsquare(Bool filled, Bool empty, unsigned long col[ColLast]);
-+static void drawtext(const char *text, unsigned long col[ColLast], Bool pad);
- static void enternotify(XEvent *e);
- static void expose(XEvent *e);
- static void focus(Client *c);
-_AT_@ -691,14 +692,13 @@
- 	dc.x = 0;
- 	for(i = 0; i < LENGTH(tags); i++) {
- 		dc.w = TEXTW(tags[i]);
--		col = m->tagset[m->seltags] & 1 << i ? dc.sel : dc.norm;
--		drawtext(tags[i], col, urg & 1 << i);
--		drawsquare(m == selmon && selmon->sel && selmon->sel->tags & 1 << i,
--		           occ & 1 << i, urg & 1 << i, col);
-+		col = dc.colors[ (m->tagset[m->seltags] & 1 << i ? 1:(urg & 1 << i ? 2:0))];
-+		drawtext(tags[i], col, True);
-+		drawsquare(m == selmon && selmon->sel && selmon->sel->tags & 1 << i, occ & 1 << i, col);
- 		dc.x += dc.w;
- 	}
- 	dc.w = blw = TEXTW(m->ltsymbol);
--	drawtext(m->ltsymbol, dc.norm, False);
-+	drawtext(m->ltsymbol, dc.colors[0], True);
- 	dc.x += dc.w;
- 	x = dc.x;
- 	if(m == selmon) { /* status is only drawn on selected monitor */
-_AT_@ -708,19 +708,19 @@
- 			dc.x = x;
- 			dc.w = m->ww - x;
- 		}
--		drawtext(stext, dc.norm, False);
-+		drawcoloredtext(stext);
- 	}
- 	else
- 		dc.x = m->ww;
- 	if((dc.w = dc.x - x) > bh) {
- 		dc.x = x;
- 		if(m->sel) {
--			col = m == selmon ? dc.sel : dc.norm;
--			drawtext(m->sel->name, col, False);
--			drawsquare(m->sel->isfixed, m->sel->isfloating, False, col);
-+			col = m == selmon ? dc.colors[1] : dc.colors[0];
-+			drawtext(m->sel->name, col, True);
-+			drawsquare(m->sel->isfixed, m->sel->isfloating, col);
- 		}
- 		else
--			drawtext(NULL, dc.norm, False);
-+			drawtext(NULL, dc.colors[0], False);
- 	}
- 	XCopyArea(dpy, dc.drawable, m->barwin, dc.gc, 0, 0, m->ww, bh, 0, 0);
- 	XSync(dpy, False);
-_AT_@ -735,12 +735,42 @@
- }
- 
- void
--drawsquare(Bool filled, Bool empty, Bool invert, unsigned long col[ColLast]) {
-+drawcoloredtext(char *text) {
-+	Bool first=True;
-+	char *buf = text, *ptr = buf, c = 1;
-+	unsigned long *col = dc.colors[0];
-+	int i, ox = dc.x;
-+
-+	while( *ptr ) {
-+		for( i = 0; *ptr < 0 || *ptr > NUMCOLORS; i++, ptr++);
-+		if( !*ptr ) break;
-+		c=*ptr;
-+		*ptr=0;
-+		if( i ) {
-+			dc.w = selmon->ww - dc.x;
-+			drawtext(buf, col, first);
-+			dc.x += textnw(buf, i) + textnw(&c,1);
-+			if( first ) dc.x += ( dc.font.ascent + dc.font.descent ) / 2;
-+			first = False;
-+		} else if( first ) {
-+			ox = dc.x += textnw(&c,1);
-+		}
-+		*ptr = c;
-+		col = dc.colors[ c-1 ];
-+		buf = ++ptr;
-+	}
-+	if( !first ) dc.x-=(dc.font.ascent+dc.font.descent)/2;
-+	drawtext(buf, col, True);
-+	dc.x = ox;
-+}
-+
-+void
-+drawsquare(Bool filled, Bool empty, unsigned long col[ColLast]) {
- 	int x;
- 	XGCValues gcv;
- 	XRectangle r = { dc.x, dc.y, dc.w, dc.h };
- 
--	gcv.foreground = col[invert ? ColBG : ColFG];
-+	gcv.foreground = col[ ColFG ];
- 	XChangeGC(dpy, dc.gc, GCForeground, &gcv);
- 	x = (dc.font.ascent + dc.font.descent + 2) / 4;
- 	r.x = dc.x + 1;
-_AT_@ -756,18 +786,18 @@
- }
- 
- void
--drawtext(const char *text, unsigned long col[ColLast], Bool invert) {
-+drawtext(const char *text, unsigned long col[ColLast], Bool pad) {
- 	char buf[256];
- 	int i, x, y, h, len, olen;
- 	XRectangle r = { dc.x, dc.y, dc.w, dc.h };
- 
--	XSetForeground(dpy, dc.gc, col[invert ? ColFG : ColBG]);
-+	XSetForeground(dpy, dc.gc, col[ ColBG ]);
- 	XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1);
- 	if(!text)
- 		return;
- 	olen = strlen(text);
--	h = dc.font.ascent + dc.font.descent;
--	y = dc.y + (dc.h / 2) - (h / 2) + dc.font.ascent;
-+	h = pad ? (dc.font.ascent + dc.font.descent) : 0;
-+	y = dc.y + ((dc.h + dc.font.ascent - dc.font.descent) / 2);
- 	x = dc.x + (h / 2);
- 	/* shorten text if necessary */
- 	for(len = MIN(olen, sizeof buf); len && textnw(text, len) > dc.w - h; len--);
-_AT_@ -776,7 +806,7 @@
- 	memcpy(buf, text, len);
- 	if(len < olen)
- 		for(i = len; i && i > len - 3; buf[--i] = '.');
--	XSetForeground(dpy, dc.gc, col[invert ? ColBG : ColFG]);
-+	XSetForeground(dpy, dc.gc, col[ ColFG ]);
- 	if(dc.font.set)
- 		XmbDrawString(dpy, dc.drawable, dc.font.set, dc.gc, x, y, buf, len);
- 	else
-_AT_@ -824,7 +854,7 @@
- 		detachstack(c);
- 		attachstack(c);
- 		grabbuttons(c, True);
--		XSetWindowBorder(dpy, c->win, dc.sel[ColBorder]);
-+		XSetWindowBorder(dpy, c->win, dc.colors[1][ColBorder]);
- 		XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime);
- 	}
- 	else
-_AT_@ -1132,7 +1162,7 @@
- 	}
- 	wc.border_width = c->bw;
- 	XConfigureWindow(dpy, w, CWBorderWidth, &wc);
--	XSetWindowBorder(dpy, w, dc.norm[ColBorder]);
-+	XSetWindowBorder(dpy, w, dc.colors[0][ColBorder]);
- 	configure(c); /* propagates border_width, if size doesn't change */
- 	updatesizehints(c);
- 	XSelectInput(dpy, w, EnterWindowMask|FocusChangeMask|PropertyChangeMask|StructureNotifyMask);
-_AT_@ -1498,12 +1528,11 @@
- 	cursor[CurResize] = XCreateFontCursor(dpy, XC_sizing);
- 	cursor[CurMove] = XCreateFontCursor(dpy, XC_fleur);
- 	/* init appearance */
--	dc.norm[ColBorder] = getcolor(normbordercolor);
--	dc.norm[ColBG] = getcolor(normbgcolor);
--	dc.norm[ColFG] = getcolor(normfgcolor);
--	dc.sel[ColBorder] = getcolor(selbordercolor);
--	dc.sel[ColBG] = getcolor(selbgcolor);
--	dc.sel[ColFG] = getcolor(selfgcolor);
-+	for(int i=0; i<NUMCOLORS; i++) {
-+		dc.colors[i][ColBorder] = getcolor( colors[i][ColBorder] );
-+		dc.colors[i][ColFG] = getcolor( colors[i][ColFG] );
-+		dc.colors[i][ColBG] = getcolor( colors[i][ColBG] );
-+	}
- 	dc.drawable = XCreatePixmap(dpy, root, DisplayWidth(dpy, screen), bh, DefaultDepth(dpy, screen));
- 	dc.gc = XCreateGC(dpy, root, 0, NULL);
- 	XSetLineAttributes(dpy, dc.gc, 1, LineSolid, CapButt, JoinMiter);
-_AT_@ -1665,7 +1694,7 @@
- 	if(!c)
- 		return;
- 	grabbuttons(c, False);
--	XSetWindowBorder(dpy, c->win, dc.norm[ColBorder]);
-+	XSetWindowBorder(dpy, c->win, dc.colors[0][ColBorder]);
- 	XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime);
- }
- 
diff -r 61b77b61c3fb -r 4307e8502725 dwm.suckless.org/patches/dwm-5.8.2-statuscolors.diff
--- a/dwm.suckless.org/patches/dwm-5.8.2-statuscolors.diff	Mon Sep 12 10:45:45 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
_AT_@ -1,232 +0,0 @@
---- a/config.def.h      2010-10-16 15:49:03.000000000 +0200
-+++ b/config.def.h      2010-10-16 15:51:35.000000000 +0200
-_AT_@ -1,13 +1,16 @@
- /* See LICENSE file for copyright and license details. */
- 
- /* appearance */
-+#define NUMCOLORS         4             // need at least 3
-+static const char colors[NUMCOLORS][ColLast][8] = {
-+   // border   foreground  background
-+   { "#cccccc", "#000000", "#cccccc" },  // 0 = normal
-+   { "#0066ff", "#ffffff", "#0066ff" },  // 1 = selected
-+   { "#0066ff", "#0066ff", "#ffffff" },  // 2 = urgent/warning
-+   { "#ff0000", "#ffffff", "#ff0000" },  // 3 = error
-+   // add more here
-+};
- static const char font[]            = "-*-terminus-medium-r-*-*-16-*-*-*-*-*-*-*";
--static const char normbordercolor[] = "#cccccc";
--static const char normbgcolor[]     = "#cccccc";
--static const char normfgcolor[]     = "#000000";
--static const char selbordercolor[]  = "#0066ff";
--static const char selbgcolor[]      = "#0066ff";
--static const char selfgcolor[]      = "#ffffff";
- static const unsigned int borderpx  = 1;        /* border pixel of windows */
- static const unsigned int snap      = 32;       /* snap pixel */
- static const Bool showbar           = True;     /* False means no bar */
-_AT_@ -45,7 +48,7 @@
- #define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } }
- 
- /* commands */
--static const char *dmenucmd[] = { "dmenu_run", "-fn", font, "-nb", normbgcolor, "-nf", normfgcolor, "-sb", selbgcolor, "-sf", selfgcolor, NULL };
-+static const char *dmenucmd[] = { "dmenu_run", "-fn", font, "-nb", colors[0][ColBG], "-nf", colors[0][ColFG],"-sb", colors[1][ColBG], "-sf", colors[1][ColFG], NULL };
- static const char *termcmd[]  = { "uxterm", NULL };
- 
- static Key keys[] = {
---- a//dwm.c	2010-06-04 12:39:15.000000000 +0200
-+++ b/dwm.c	2010-11-03 20:36:50.000000000 +0100
-_AT_@ -48,6 +48,7 @@
- #define LENGTH(X)               (sizeof X / sizeof X[0])
- #define MAX(A, B)               ((A) > (B) ? (A) : (B))
- #define MIN(A, B)               ((A) < (B) ? (A) : (B))
-+#define MAXCOLORS               8
- #define MOUSEMASK               (BUTTONMASK|PointerMotionMask)
- #define WIDTH(X)                ((X)->w + 2 * (X)->bw)
- #define HEIGHT(X)               ((X)->h + 2 * (X)->bw)
-_AT_@ -97,8 +98,7 @@
- 
- typedef struct {
- 	int x, y, w, h;
--	unsigned long norm[ColLast];
--	unsigned long sel[ColLast];
-+	unsigned long colors[MAXCOLORS][ColLast];
- 	Drawable drawable;
- 	GC gc;
- 	struct {
-_AT_@ -175,8 +175,9 @@
- static Monitor *dirtomon(int dir);
- static void drawbar(Monitor *m);
- static void drawbars(void);
--static void drawsquare(Bool filled, Bool empty, Bool invert, unsigned long col[ColLast]);
--static void drawtext(const char *text, unsigned long col[ColLast], Bool invert);
-+static void drawcoloredtext(char *text);
-+static void drawsquare(Bool filled, Bool empty, unsigned long col[ColLast]);
-+static void drawtext(const char *text, unsigned long col[ColLast], Bool pad);
- static void enternotify(XEvent *e);
- static void expose(XEvent *e);
- static void focus(Client *c);
-_AT_@ -696,14 +697,13 @@
- 	dc.x = 0;
- 	for(i = 0; i < LENGTH(tags); i++) {
- 		dc.w = TEXTW(tags[i]);
--		col = m->tagset[m->seltags] & 1 << i ? dc.sel : dc.norm;
--		drawtext(tags[i], col, urg & 1 << i);
--		drawsquare(m == selmon && selmon->sel && selmon->sel->tags & 1 << i,
--		           occ & 1 << i, urg & 1 << i, col);
-+		col = dc.colors[ (m->tagset[m->seltags] & 1 << i ? 1:(urg & 1 << i ? 2:0))];
-+		drawtext(tags[i], col, True);
-+		drawsquare(m == selmon && selmon->sel && selmon->sel->tags & 1 << i, occ & 1 << i, col);
- 		dc.x += dc.w;
- 	}
- 	dc.w = blw = TEXTW(m->ltsymbol);
--	drawtext(m->ltsymbol, dc.norm, False);
-+	drawtext(m->ltsymbol, dc.colors[0], True);
- 	dc.x += dc.w;
- 	x = dc.x;
- 	if(m == selmon) { /* status is only drawn on selected monitor */
-_AT_@ -713,19 +713,19 @@
- 			dc.x = x;
- 			dc.w = m->ww - x;
- 		}
--		drawtext(stext, dc.norm, False);
-+		drawcoloredtext(stext);
- 	}
- 	else
- 		dc.x = m->ww;
- 	if((dc.w = dc.x - x) > bh) {
- 		dc.x = x;
- 		if(m->sel) {
--			col = m == selmon ? dc.sel : dc.norm;
--			drawtext(m->sel->name, col, False);
--			drawsquare(m->sel->isfixed, m->sel->isfloating, False, col);
-+			col = m == selmon ? dc.colors[1] : dc.colors[0];
-+			drawtext(m->sel->name, col, True);
-+			drawsquare(m->sel->isfixed, m->sel->isfloating, col);
- 		}
- 		else
--			drawtext(NULL, dc.norm, False);
-+			drawtext(NULL, dc.colors[0], False);
- 	}
- 	XCopyArea(dpy, dc.drawable, m->barwin, dc.gc, 0, 0, m->ww, bh, 0, 0);
- 	XSync(dpy, False);
-_AT_@ -740,12 +740,42 @@
- }
- 
- void
--drawsquare(Bool filled, Bool empty, Bool invert, unsigned long col[ColLast]) {
-+drawcoloredtext(char *text) {
-+	Bool first=True;
-+	char *buf = text, *ptr = buf, c = 1;
-+	unsigned long *col = dc.colors[0];
-+	int i, ox = dc.x;
-+
-+	while( *ptr ) {
-+		for( i = 0; *ptr < 0 || *ptr > NUMCOLORS; i++, ptr++);
-+		if( !*ptr ) break;
-+		c=*ptr;
-+		*ptr=0;
-+		if( i ) {
-+			dc.w = selmon->ww - dc.x;
-+			drawtext(buf, col, first);
-+			dc.x += textnw(buf, i) + textnw(&c,1);
-+			if( first ) dc.x += ( dc.font.ascent + dc.font.descent ) / 2;
-+			first = False;
-+		} else if( first ) {
-+			ox = dc.x += textnw(&c,1);
-+		}
-+		*ptr = c;
-+		col = dc.colors[ c-1 ];
-+		buf = ++ptr;
-+	}
-+	if( !first ) dc.x-=(dc.font.ascent+dc.font.descent)/2;
-+	drawtext(buf, col, True);
-+	dc.x = ox;
-+}
-+
-+void
-+drawsquare(Bool filled, Bool empty, unsigned long col[ColLast]) {
- 	int x;
- 	XGCValues gcv;
- 	XRectangle r = { dc.x, dc.y, dc.w, dc.h };
- 
--	gcv.foreground = col[invert ? ColBG : ColFG];
-+	gcv.foreground = col[ ColFG ];
- 	XChangeGC(dpy, dc.gc, GCForeground, &gcv);
- 	x = (dc.font.ascent + dc.font.descent + 2) / 4;
- 	r.x = dc.x + 1;
-_AT_@ -761,18 +791,18 @@
- }
- 
- void
--drawtext(const char *text, unsigned long col[ColLast], Bool invert) {
-+drawtext(const char *text, unsigned long col[ColLast], Bool pad) {
- 	char buf[256];
- 	int i, x, y, h, len, olen;
- 	XRectangle r = { dc.x, dc.y, dc.w, dc.h };
- 
--	XSetForeground(dpy, dc.gc, col[invert ? ColFG : ColBG]);
-+	XSetForeground(dpy, dc.gc, col[ ColBG ]);
- 	XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1);
- 	if(!text)
- 		return;
- 	olen = strlen(text);
--	h = dc.font.ascent + dc.font.descent;
--	y = dc.y + (dc.h / 2) - (h / 2) + dc.font.ascent;
-+	h = pad ? (dc.font.ascent + dc.font.descent) : 0;
-+	y = dc.y + ((dc.h + dc.font.ascent - dc.font.descent) / 2);
- 	x = dc.x + (h / 2);
- 	/* shorten text if necessary */
- 	for(len = MIN(olen, sizeof buf); len && textnw(text, len) > dc.w - h; len--);
-_AT_@ -781,7 +811,7 @@
- 	memcpy(buf, text, len);
- 	if(len < olen)
- 		for(i = len; i && i > len - 3; buf[--i] = '.');
--	XSetForeground(dpy, dc.gc, col[invert ? ColBG : ColFG]);
-+	XSetForeground(dpy, dc.gc, col[ ColFG ]);
- 	if(dc.font.set)
- 		XmbDrawString(dpy, dc.drawable, dc.font.set, dc.gc, x, y, buf, len);
- 	else
-_AT_@ -830,7 +860,7 @@
- 		detachstack(c);
- 		attachstack(c);
- 		grabbuttons(c, True);
--		XSetWindowBorder(dpy, c->win, dc.sel[ColBorder]);
-+		XSetWindowBorder(dpy, c->win, dc.colors[1][ColBorder]);
- 		XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime);
- 	}
- 	else
-_AT_@ -1139,7 +1169,7 @@
- 	}
- 	wc.border_width = c->bw;
- 	XConfigureWindow(dpy, w, CWBorderWidth, &wc);
--	XSetWindowBorder(dpy, w, dc.norm[ColBorder]);
-+	XSetWindowBorder(dpy, w, dc.colors[0][ColBorder]);
- 	configure(c); /* propagates border_width, if size doesn't change */
- 	updatesizehints(c);
- 	XSelectInput(dpy, w, EnterWindowMask|FocusChangeMask|PropertyChangeMask|StructureNotifyMask);
-_AT_@ -1544,12 +1574,11 @@
- 	cursor[CurResize] = XCreateFontCursor(dpy, XC_sizing);
- 	cursor[CurMove] = XCreateFontCursor(dpy, XC_fleur);
- 	/* init appearance */
--	dc.norm[ColBorder] = getcolor(normbordercolor);
--	dc.norm[ColBG] = getcolor(normbgcolor);
--	dc.norm[ColFG] = getcolor(normfgcolor);
--	dc.sel[ColBorder] = getcolor(selbordercolor);
--	dc.sel[ColBG] = getcolor(selbgcolor);
--	dc.sel[ColFG] = getcolor(selfgcolor);
-+	for(int i=0; i<NUMCOLORS; i++) {
-+		dc.colors[i][ColBorder] = getcolor( colors[i][ColBorder] );
-+		dc.colors[i][ColFG] = getcolor( colors[i][ColFG] );
-+		dc.colors[i][ColBG] = getcolor( colors[i][ColBG] );
-+	}
- 	dc.drawable = XCreatePixmap(dpy, root, DisplayWidth(dpy, screen), bh, DefaultDepth(dpy, screen));
- 	dc.gc = XCreateGC(dpy, root, 0, NULL);
- 	XSetLineAttributes(dpy, dc.gc, 1, LineSolid, CapButt, JoinMiter);
-_AT_@ -1711,7 +1740,7 @@
- 	if(!c)
- 		return;
- 	grabbuttons(c, False);
--	XSetWindowBorder(dpy, c->win, dc.norm[ColBorder]);
-+	XSetWindowBorder(dpy, c->win, dc.colors[0][ColBorder]);
- 	if(setfocus)
- 		XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime);
- }
diff -r 61b77b61c3fb -r 4307e8502725 dwm.suckless.org/patches/dwm-gap-5.7.2.diff
--- a/dwm.suckless.org/patches/dwm-gap-5.7.2.diff	Mon Sep 12 10:45:45 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
_AT_@ -1,23 +0,0 @@
---- a/dwm.c	2009-09-17 10:48:57.000000000 +0200
-+++ b/dwm.c	2009-09-16 18:54:37.000000000 +0200
-_AT_@ -1270,10 +1270,10 @@
- 	XWindowChanges wc;
- 
- 	if(applysizehints(c, &x, &y, &w, &h, interact)) {
--		c->x = wc.x = x;
--		c->y = wc.y = y;
--		c->w = wc.width = w;
--		c->h = wc.height = h;
-+		c->x = wc.x = x + gappx;
-+		c->y = wc.y = y + gappx;
-+		c->w = wc.width = w - 2 * gappx ;
-+		c->h = wc.height = h - 2 * gappx ;
- 		wc.border_width = c->bw;
- 		XConfigureWindow(dpy, c->win, CWX|CWY|CWWidth|CWHeight|CWBorderWidth, &wc);
- 		configure(c);
-
-diff -r 72e52c5333ef config.def.h
---- a/config.def.h	Wed Nov 25 13:56:17 2009 +0000
-+++ b/config.def.h	Tue Dec 15 18:39:44 2009 +0100
-_AT_@ -7,14 +7,15 @@
-+static const unsigned int gappx     = 4;           /* gap pixel between windows */
diff -r 61b77b61c3fb -r 4307e8502725 dwm.suckless.org/patches/dwm-pertag-5.6.1.diff
--- a/dwm.suckless.org/patches/dwm-pertag-5.6.1.diff	Mon Sep 12 10:45:45 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
_AT_@ -1,184 +0,0 @@
---- dwm.c	2009-09-18 18:12:50.000000000 +0200
-+++ dwm.c.working	2009-09-18 18:14:04.000000000 +0200
-_AT_@ -131,6 +131,25 @@
- 	void            (*arrange) (Monitor *);
- }               Layout;
- 
-+struct Monitor {
-+	float           mfact;
-+	int             num;
-+	int             by;	/* bar geometry */
-+	int             mx, my, mw, mh;	/* screen size */
-+	int             wx, wy, ww, wh;	/* window area  */
-+	unsigned int    seltags;
-+	unsigned int    sellt;
-+	unsigned int    tagset[2];
-+	Bool            showbar;
-+	Bool            topbar;
-+	Client         *clients;
-+	Client         *sel;
-+	Client         *stack;
-+	Monitor        *next;
-+	Window          barwin;
-+	const Layout   *lt[2];
-+};
-+
- typedef struct {
- 	const char     *class;
- 	const char     *instance;
-_AT_@ -263,30 +282,6 @@
- /* configuration, allows nested code to access above variables */
- #include "config.h"
- 
--struct Monitor {
--	float           mfact;
--	int             num;
--	int             by;	/* bar geometry */
--	int             mx, my, mw, mh;	/* screen size */
--	int             wx, wy, ww, wh;	/* window area  */
--	unsigned int    seltags;
--	unsigned int    sellt;
--	unsigned int    tagset[2];
--	Bool            showbar;
--	Bool            topbar;
--	Client         *clients;
--	Client         *sel;
--	Client         *stack;
--	Monitor        *next;
--	Window          barwin;
--	const Layout   *lt[2];
--	int             curtag;
--	int             prevtag;
--	const Layout   *lts[LENGTH(tags) + 1];
--	double          mfacts[LENGTH(tags) + 1];
--	Bool            showbars[LENGTH(tags) + 1];
--};
--
- /* compile-time check if all tags fit into an unsigned int bit array. */
- struct NumTags {
- 	char            limitexceeded[LENGTH(tags) > 31 ? -1 : 1];
-_AT_@ -1484,7 +1479,7 @@
- 	if (!arg || !arg->v || arg->v != selmon->lt[selmon->sellt])
- 		selmon->sellt ^= 1;
- 	if (arg && arg->v)
--		selmon->lt[selmon->sellt] = selmon->lts[selmon->curtag] = (Layout *) arg->v;
-+		selmon->lt[selmon->sellt] = (Layout *) arg->v;
- 	if (selmon->sel)
- 		arrange();
- 	else
-_AT_@ -1502,7 +1497,7 @@
- 	f = arg->f < 1.0 ? arg->f + selmon->mfact : arg->f - 1.0;
- 	if (f < 0.1 || f > 0.9)
- 		return;
--	selmon->mfact = selmon->mfacts[selmon->curtag] = f;
-+	selmon->mfact = f;
- 	arrange();
- }
- 
-_AT_@ -1512,7 +1507,6 @@
- 	unsigned int    i;
- 	int             w;
- 	XSetWindowAttributes wa;
--	Monitor        *m;
- 
- 	/* clean up any zombies immediately */
- 	sigchld(0);
-_AT_@ -1547,31 +1541,11 @@
- 	XSetLineAttributes(dpy, dc.gc, 1, LineSolid, CapButt, JoinMiter);
- 	if (!dc.font.set)
- 		XSetFont(dpy, dc.gc, dc.font.xfont->fid);
--	/* init tags */
--	for (m = mons; m; m = m->next)
--		m->curtag = m->prevtag = 1;
--	/* init mfacts */
--	for (m = mons; m; m = m->next) {
--		for (i = 0; i < LENGTH(tags) + 1; i++) {
--			m->mfacts[i] = m->mfact;
--		}
--	}
--	/* init layouts */
--	for (m = mons; m; m = m->next) {
--		for (i = 0; i < LENGTH(tags) + 1; i++) {
--			m->lts[i] = &layouts[0];
--		}
--	}
- 	/* init bars */
- 	for (blw = i = 0; LENGTH(layouts) > 1 && i < LENGTH(layouts); i++) {
- 		w = TEXTW(layouts[i].symbol);
- 		blw = MAX(blw, w);
- 	}
--	for (m = mons; m; m = m->next) {
--		for (i = 0; i < LENGTH(tags) + 1; i++) {
--			m->showbars[i] = m->showbar;
--		}
--	}
- 	updatebars();
- 	updatestatus();
- 	/* EWMH support per view */
-_AT_@ -1689,7 +1663,7 @@
- void
- togglebar(const Arg * arg)
- {
--	selmon->showbar = selmon->showbars[selmon->curtag] = !selmon->showbar;
-+	selmon->showbar = !selmon->showbar;
- 	updatebarpos(selmon);
- 	XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh);
- 	arrange();
-_AT_@ -1710,27 +1684,13 @@
- void
- toggletag(const Arg * arg)
- {
--	unsigned int    i;
- 	unsigned int    newtags;
- 
- 	if (!selmon->sel)
- 		return;
- 	newtags = selmon->sel->tags ^ (arg->ui & TAGMASK);
- 	if (newtags) {
--		if (newtags == ~0) {
--			selmon->prevtag = selmon->curtag;
--			selmon->curtag = 0;
--		}
--		if (!(newtags & 1 << (selmon->curtag - 1))) {
--			selmon->prevtag = selmon->curtag;
--			for (i = 0; !(newtags & 1 << i); i++);
--			selmon->curtag = i + 1;
--		}
- 		selmon->sel->tags = newtags;
--		selmon->lt[selmon->sellt] = selmon->lts[selmon->curtag];
--		selmon->mfact = selmon->mfacts[selmon->curtag];
--		if (selmon->showbar != selmon->showbars[selmon->curtag])
--			togglebar(NULL);
- 		arrange();
- 	}
- }
-_AT_@ -1993,28 +1953,11 @@
- void
- view(const Arg * arg)
- {
--	unsigned int    i;
- 	if ((arg->ui & TAGMASK) == selmon->tagset[selmon->seltags])
- 		return;
- 	selmon->seltags ^= 1;	/* toggle sel tagset */
--	if (arg->ui & TAGMASK) {
-+	if (arg->ui & TAGMASK)
- 		selmon->tagset[selmon->seltags] = arg->ui & TAGMASK;
--		selmon->prevtag = selmon->curtag;
--		if (arg->ui == ~0)
--			selmon->curtag = 0;
--		else {
--			for (i = 0; !(arg->ui & 1 << i); i++);
--			selmon->curtag = i + 1;
--		}
--	} else {
--		selmon->prevtag = selmon->curtag ^ selmon->prevtag;
--		selmon->curtag ^= selmon->prevtag;
--		selmon->prevtag = selmon->curtag ^ selmon->prevtag;
--	}
--	selmon->lt[selmon->sellt] = selmon->lts[selmon->curtag];
--	selmon->mfact = selmon->mfacts[selmon->curtag];
--	if (selmon->showbar != selmon->showbars[selmon->curtag])
--		togglebar(NULL);
- 	arrange();
- }
- 
diff -r 61b77b61c3fb -r 4307e8502725 dwm.suckless.org/patches/dwm-uselessgap-5.8.diff
--- a/dwm.suckless.org/patches/dwm-uselessgap-5.8.diff	Mon Sep 12 10:45:45 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
_AT_@ -1,49 +0,0 @@
-diff -r 72e52c5333ef config.def.h
---- a/config.def.h	Wed Nov 25 13:56:17 2009 +0000
-+++ b/config.def.h	Thu Mar 11 16:32:24 2010 +0100
-_AT_@ -9,6 +9,7 @@
- static const char selbgcolor[]      = "#0066ff";
- static const char selfgcolor[]      = "#ffffff";
- static const unsigned int borderpx  = 1;        /* border pixel of windows */
-+static const unsigned int gappx     = 6;        /* gap pixel between windows */
- static const unsigned int snap      = 32;       /* snap pixel */
- static const Bool showbar           = True;     /* False means no bar */
- static const Bool topbar            = True;     /* False means bottom bar */
-diff -r 72e52c5333ef dwm.c
---- a/dwm.c	Wed Nov 25 13:56:17 2009 +0000
-+++ b/dwm.c	Thu Mar 11 16:32:24 2010 +0100
-_AT_@ -269,6 +269,7 @@
- static DC dc;
- static Monitor *mons = NULL, *selmon = NULL;
- static Window root;
-+static int globalborder ;
- 
- /* configuration, allows nested code to access above variables */
- #include "config.h"
-_AT_@ -1299,16 +1300,21 @@
- resize(Client *c, int x, int y, int w, int h, Bool interact) {
- 	XWindowChanges wc;
- 
-+	if(c->isfloating || selmon->lt[selmon->sellt]->arrange == NULL) { globalborder = 0 ; }
-+	else {
-+		if (selmon->lt[selmon->sellt]->arrange == monocle) { globalborder = 0 - borderpx ; }
-+		else { globalborder =  gappx ; }
-+	}
- 	if(applysizehints(c, &x, &y, &w, &h, interact)) {
--		c->x = wc.x = x;
--		c->y = wc.y = y;
--		c->w = wc.width = w;
--		c->h = wc.height = h;
-+		c->x = wc.x = x + globalborder;
-+		c->y = wc.y = y + globalborder;
-+		c->w = wc.width = w - 2 * globalborder ;
-+		c->h = wc.height = h - 2 * globalborder ;
- 		wc.border_width = c->bw;
- 		XConfigureWindow(dpy, c->win, CWX|CWY|CWWidth|CWHeight|CWBorderWidth, &wc);
- 		configure(c);
- 		XSync(dpy, False);
--	}
-+		}
- }
- 
- void
diff -r 61b77b61c3fb -r 4307e8502725 dwm.suckless.org/patches/fancybar-5.6.1.diff
--- a/dwm.suckless.org/patches/fancybar-5.6.1.diff	Mon Sep 12 10:45:45 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
_AT_@ -1,121 +0,0 @@
-diff -r e47a47bd3ed4 dwm.c
---- a/dwm.c	Tue Jul 21 10:57:54 2009 +0100
-+++ b/dwm.c	Mon Aug 24 18:28:57 2009 +0200
-_AT_@ -169,6 +169,7 @@
- static Monitor *dirtomon(int dir);
- static void drawbar(Monitor *m);
- static void drawbars(void);
-+static void drawvline(unsigned long col[ColLast]);
- static void drawsquare(Bool filled, Bool empty, Bool invert, unsigned long col[ColLast]);
- static void drawtext(const char *text, unsigned long col[ColLast], Bool invert);
- static void enternotify(XEvent *e);
-_AT_@ -648,10 +649,11 @@
- 
- void
- drawbar(Monitor *m) {
--	int x;
-+	int x, ow, mw = 0, extra, tw;
- 	unsigned int i, n = 0, occ = 0, urg = 0;
- 	unsigned long *col;
--	Client *c;
-+	Client *c, *firstvis, *lastvis = NULL;
-+	DC seldc;
- 
- 	for(c = m->clients; c; c = c->next) {
- 		if(ISVISIBLE(c))
-_AT_@ -689,16 +691,62 @@
- 	}
- 	else
- 		dc.x = m->ww;
--	if((dc.w = dc.x - x) > bh) {
--		dc.x = x;
--		if(m->sel) {
--			col = m == selmon ? dc.sel : dc.norm;
--			drawtext(m->sel->name, col, False);
--			drawsquare(m->sel->isfixed, m->sel->isfloating, False, col);
-+
-+	for(c = m->clients; c && !ISVISIBLE(c); c = c->next);
-+	firstvis = c;
-+
-+	col = m == selmon ? dc.sel : dc.norm;
-+	dc.w = dc.x - x;
-+	dc.x = x;
-+
-+	if(n > 0) {
-+		mw = dc.w / n;
-+		extra = 0;
-+		seldc = dc;
-+		i = 0;
-+
-+		while(c) {
-+			lastvis = c;
-+			tw = TEXTW(c->name);
-+			if(tw < mw) extra += (mw - tw); else i++;
-+			for(c = c->next; c && !ISVISIBLE(c); c = c->next);
- 		}
--		else
-+
-+		if(i > 0) mw += extra / i;
-+
-+		c = firstvis;
-+		x = dc.x;
-+	}
-+
-+	while(dc.w > bh) {
-+		if(c) {
-+			ow = dc.w;
-+			tw = TEXTW(c->name);
-+			dc.w = MIN(ow, tw);
-+
-+			if(dc.w > mw) dc.w = mw;
-+			if(m->sel == c) seldc = dc;
-+			if(c == lastvis) dc.w = ow;
-+
-+			drawtext(c->name, col, False);
-+			if(c != firstvis) drawvline(col);
-+			drawsquare(c->isfixed, c->isfloating, False, col);
-+
-+			dc.x += dc.w;
-+			dc.w = ow - dc.w;
-+			for(c = c->next; c && !ISVISIBLE(c); c = c->next);
-+		} else {
- 			drawtext(NULL, dc.norm, False);
-+			break;
-+		}
- 	}
-+
-+	if(m == selmon && m->sel && ISVISIBLE(m->sel)) {
-+		dc = seldc;
-+		drawtext(m->sel->name, col, True);
-+		drawsquare(m->sel->isfixed, m->sel->isfloating, True, col);
-+	}
-+
- 	XCopyArea(dpy, dc.drawable, m->barwin, dc.gc, 0, 0, m->ww, bh, 0, 0);
- 	XSync(dpy, False);
- }
-_AT_@ -709,6 +757,15 @@
- 
- 	for(m = mons; m; m = m->next)
- 		drawbar(m);
-+}
-+
-+void
-+drawvline(unsigned long col[ColLast]) {
-+	XGCValues gcv;
-+
-+	gcv.foreground = col[ColFG];
-+	XChangeGC(dpy, dc.gc, GCForeground, &gcv);
-+	XDrawLine(dpy, dc.drawable, dc.gc, dc.x, dc.y, dc.x, dc.y + (dc.font.ascent + dc.font.descent + 2));
- }
- 
- void
-_AT_@ -1235,8 +1292,7 @@
- 		}
- 		if(ev->atom == XA_WM_NAME || ev->atom == netatom[NetWMName]) {
- 			updatetitle(c);
--			if(c == selmon->sel)
--				drawbars();
-+			drawbars();
- 		}
- 	}
- }
diff -r 61b77b61c3fb -r 4307e8502725 dwm.suckless.org/patches/fancybar.md
--- a/dwm.suckless.org/patches/fancybar.md	Mon Sep 12 10:45:45 2011 +0100
+++ b/dwm.suckless.org/patches/fancybar.md	Mon Sep 12 12:35:44 2011 +0200
_AT_@ -12,7 +12,7 @@
 
 ## Download
 
- * [fancybar-5.6.1.diff](fancybar-5.6.1.diff) (dwm 5.6.1) (20090824)
+ * [fancybar-5.6.1.diff](historical/fancybar-5.6.1.diff) (dwm 5.6.1) (20090824)
  * [fancybar-r1496.diff](fancybar-r1496.diff) (dwm 5.7) (20090922)
 
 ## Author
diff -r 61b77b61c3fb -r 4307e8502725 dwm.suckless.org/patches/flextile-5.8.1.diff
--- a/dwm.suckless.org/patches/flextile-5.8.1.diff	Mon Sep 12 10:45:45 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
_AT_@ -1,418 +0,0 @@
-diff -up ../dwm-5.8.1-0/config.def.h ./config.def.h
---- ../dwm-5.8.1-0/config.def.h	2010-05-29 13:49:12.000000000 +0200
-+++ ./config.def.h	2010-05-31 15:18:43.686311000 +0200
-_AT_@ -25,6 +25,11 @@ static const Rule rules[] = {
- /* layout(s) */
- static const float mfact      = 0.55; /* factor of master area size [0.05..0.95] */
- static const Bool resizehints = True; /* True means respect size hints in tiled resizals */
-+static const int layoutaxis[] = {
-+	1,    /* layout axis: 1 = x, 2 = y; negative values mirror the layout, setting the master area to the right / bottom instead of left / top */
-+	2,    /* master axis: 1 = x (from left to right), 2 = y (from top to bottom), 3 = z (monocle) */
-+	2,    /* stack axis:  1 = x (from left to right), 2 = y (from top to bottom), 3 = z (monocle) */
-+};
- 
- static const Layout layouts[] = {
- 	/* symbol     arrange function */
-_AT_@ -81,6 +86,12 @@ static Key keys[] = {
- 	TAGKEYS(                        XK_8,                      7)
- 	TAGKEYS(                        XK_9,                      8)
- 	{ MODKEY|ShiftMask,             XK_q,      quit,           {0} },
-+	{ MODKEY|ControlMask,           XK_t,      rotatelayoutaxis, {.i = 0} },    /* 0 = layout axis */
-+	{ MODKEY|ControlMask,           XK_Tab,    rotatelayoutaxis, {.i = 1} },    /* 1 = master axis */
-+	{ MODKEY|ControlMask|ShiftMask, XK_Tab,    rotatelayoutaxis, {.i = 2} },    /* 2 = stack axis */
-+	{ MODKEY|ControlMask,           XK_Return, mirrorlayout,     {0} },
-+	{ MODKEY|ControlMask,           XK_j,      shiftmastersplit, {.i = -1} },   /* reduce the number of tiled clients in the master area */
-+	{ MODKEY|ControlMask,           XK_k,      shiftmastersplit, {.i = +1} },   /* increase the number of tiled clients in the master area */
- };
- 
- /* button definitions */
-diff -up ../dwm-5.8.1-0/dwm.c ./dwm.c
---- ../dwm-5.8.1-0/dwm.c	2010-05-29 13:49:12.000000000 +0200
-+++ ./dwm.c	2010-05-31 16:02:14.553316000 +0200
-_AT_@ -120,26 +120,6 @@ typedef struct {
- 	void (*arrange)(Monitor *);
- } Layout;
- 
--struct Monitor {
--	char ltsymbol[16];
--	float mfact;
--	int num;
--	int by;               /* bar geometry */
--	int mx, my, mw, mh;   /* screen size */
--	int wx, wy, ww, wh;   /* window area  */
--	unsigned int seltags;
--	unsigned int sellt;
--	unsigned int tagset[2];
--	Bool showbar;
--	Bool topbar;
--	Client *clients;
--	Client *sel;
--	Client *stack;
--	Monitor *next;
--	Window barwin;
--	const Layout *lt[2];
--};
--
- typedef struct {
- 	const char *class;
- 	const char *instance;
-_AT_@ -193,6 +173,7 @@ static void killclient(const Arg *arg);
- static void manage(Window w, XWindowAttributes *wa);
- static void mappingnotify(XEvent *e);
- static void maprequest(XEvent *e);
-+static void mirrorlayout(const Arg *arg);
- static void monocle(Monitor *m);
- static void movemouse(const Arg *arg);
- static Client *nexttiled(Client *c);
-_AT_@ -202,6 +183,7 @@ static void quit(const Arg *arg);
- static void resize(Client *c, int x, int y, int w, int h, Bool interact);
- static void resizemouse(const Arg *arg);
- static void restack(Monitor *m);
-+static void rotatelayoutaxis(const Arg *arg);
- static void run(void);
- static void scan(void);
- static void sendmon(Client *c, Monitor *m);
-_AT_@ -209,6 +191,7 @@ static void setclientstate(Client *c, lo
- static void setlayout(const Arg *arg);
- static void setmfact(const Arg *arg);
- static void setup(void);
-+static void shiftmastersplit(const Arg *arg);
- static void showhide(Client *c);
- static void sigchld(int unused);
- static void spawn(const Arg *arg);
-_AT_@ -275,6 +258,34 @@ static Window root;
- 
- /* compile-time check if all tags fit into an unsigned int bit array. */
- struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; };
-+struct Monitor {
-+	char ltsymbol[16];
-+	float mfact;
-+	double mfacts[LENGTH(tags) + 1];
-+	int ltaxis[3];
-+	int ltaxes[LENGTH(tags) + 1][3];
-+	int num;
-+	int curtag;
-+	int prevtag;
-+	int by;               /* bar geometry */
-+	int mx, my, mw, mh;   /* screen size */
-+	int wx, wy, ww, wh;   /* window area  */
-+	unsigned int msplit;
-+	unsigned int msplits[LENGTH(tags) + 1];
-+	unsigned int seltags;
-+	unsigned int sellt;
-+	unsigned int tagset[2];
-+	Bool showbar;
-+	Bool showbars[LENGTH(tags) + 1];
-+	Bool topbar;
-+	Client *clients;
-+	Client *sel;
-+	Client *stack;
-+	Monitor *next;
-+	Window barwin;
-+	const Layout *lt[2];
-+	const Layout *lts[LENGTH(tags) + 1];
-+};
- 
- /* function implementations */
- void
-_AT_@ -616,6 +627,10 @@ createmon(void) {
- 	m->lt[0] = &layouts[0];
- 	m->lt[1] = &layouts[1 % LENGTH(layouts)];
- 	strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol);
-+	m->ltaxis[0] = layoutaxis[0];
-+	m->ltaxis[1] = layoutaxis[1];
-+	m->ltaxis[2] = layoutaxis[2];
-+	m->msplit = 1;
- 	return m;
- }
- 
-_AT_@ -1173,6 +1188,15 @@ maprequest(XEvent *e) {
- }
- 
- void
-+mirrorlayout(const Arg *arg) {
-+	if(!selmon->lt[selmon->sellt]->arrange)
-+		return;
-+	selmon->ltaxis[0] *= -1;
-+	selmon->ltaxes[selmon->curtag][0] = selmon->ltaxis[0];
-+	arrange(selmon);
-+}
-+
-+void
- monocle(Monitor *m) {
- 	unsigned int n = 0;
- 	Client *c;
-_AT_@ -1387,6 +1411,21 @@ restack(Monitor *m) {
- }
- 
- void
-+rotatelayoutaxis(const Arg *arg) {
-+	if(!selmon->lt[selmon->sellt]->arrange)
-+		return;
-+	if(arg->i == 0) {
-+		if(selmon->ltaxis[0] > 0)
-+			selmon->ltaxis[0] = selmon->ltaxis[0] + 1 > 2 ? 1 : selmon->ltaxis[0] + 1;
-+		else
-+			selmon->ltaxis[0] = selmon->ltaxis[0] - 1 < -2 ? -1 : selmon->ltaxis[0] - 1;
-+	} else
-+		selmon->ltaxis[arg->i] = selmon->ltaxis[arg->i] + 1 > 3 ? 1 : selmon->ltaxis[arg->i] + 1;
-+	selmon->ltaxes[selmon->curtag][arg->i] = selmon->ltaxis[arg->i];
-+	arrange(selmon);
-+}
-+
-+void
- run(void) {
- 	XEvent ev;
- 	/* main event loop */
-_AT_@ -1451,7 +1490,7 @@ setlayout(const Arg *arg) {
- 	if(!arg || !arg->v || arg->v != selmon->lt[selmon->sellt])
- 		selmon->sellt ^= 1;
- 	if(arg && arg->v)
--		selmon->lt[selmon->sellt] = (Layout *)arg->v;
-+		selmon->lt[selmon->sellt] = selmon->lts[selmon->curtag] = (Layout *)arg->v;
- 	strncpy(selmon->ltsymbol, selmon->lt[selmon->sellt]->symbol, sizeof selmon->ltsymbol);
- 	if(selmon->sel)
- 		arrange(selmon);
-_AT_@ -1469,14 +1508,16 @@ setmfact(const Arg *arg) {
- 	f = arg->f < 1.0 ? arg->f + selmon->mfact : arg->f - 1.0;
- 	if(f < 0.1 || f > 0.9)
- 		return;
--	selmon->mfact = f;
-+	selmon->mfact = selmon->mfacts[selmon->curtag] = f;
- 	arrange(selmon);
- }
- 
- void
- setup(void) {
- 	XSetWindowAttributes wa;
--
-+	Monitor *m;
-+	unsigned int i;
-+ 
- 	/* clean up any zombies immediately */
- 	sigchld(0);
- 
-_AT_@ -1511,7 +1552,19 @@ setup(void) {
- 	XSetLineAttributes(dpy, dc.gc, 1, LineSolid, CapButt, JoinMiter);
- 	if(!dc.font.set)
- 		XSetFont(dpy, dc.gc, dc.font.xfont->fid);
--	/* init bars */
-+	/* init tags, bars, layouts, axes, msplits and mfacts */
-+	for(m = mons; m; m = m->next) {
-+		m->curtag = m->prevtag = 1;
-+		for(i=0; i < LENGTH(tags) + 1; i++) {
-+			m->showbars[i] = m->showbar;
-+			m->lts[i] = &layouts[0];
-+			m->mfacts[i] = m->mfact;
-+			m->ltaxes[i][0] = m->ltaxis[0];
-+			m->ltaxes[i][1] = m->ltaxis[1];
-+			m->ltaxes[i][2] = m->ltaxis[2];
-+			m->msplits[i] = m->msplit;
-+		}
-+	}
- 	updatebars();
- 	updatestatus();
- 	/* EWMH support per view */
-_AT_@ -1528,6 +1581,19 @@ setup(void) {
- }
- 
- void
-+shiftmastersplit(const Arg *arg) {
-+	unsigned int n;
-+	Client *c;
-+
-+	for(n = 0, c = nexttiled(selmon->clients); c; c = nexttiled(c->next), n++);
-+	if(!arg || !selmon->lt[selmon->sellt]->arrange || selmon->msplit + arg->i < 1 || selmon->msplit + arg->i > n)
-+		return;
-+	selmon->msplit += arg->i;
-+	selmon->msplits[selmon->curtag] = selmon->msplit;
-+	arrange(selmon);
-+}
-+
-+void
- showhide(Client *c) {
- 	if(!c)
- 		return;
-_AT_@ -1592,37 +1658,95 @@ textnw(const char *text, unsigned int le
- 
- void
- tile(Monitor *m) {
--	int x, y, h, w, mw;
--	unsigned int i, n;
-+	char sym1 = 61, sym2 = 93, sym3 = 61, sym;
-+	int x1 = m->wx, y1 = m->wy, h1 = m->wh, w1 = m->ww, X1 = x1 + w1, Y1 = y1 + h1;
-+	int x2 = m->wx, y2 = m->wy, h2 = m->wh, w2 = m->ww, X2 = x2 + w2, Y2 = y2 + h2;
-+	unsigned int i, n, n1, n2;
- 	Client *c;
- 
- 	for(n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++);
-+	if(m->msplit > n)
-+		m->msplit = (n == 0) ? 1 : n;
-+	if(n == 0 && m->ltaxis[1] != 3)
-+		return;
-+	/* layout symbol */
-+	if(abs(m->ltaxis[0]) == m->ltaxis[1])    /* explicitly: ((abs(m->ltaxis[0]) == 1 && m->ltaxis[1] == 1) || (abs(m->ltaxis[0]) == 2 && m->ltaxis[1] == 2)) */
-+		sym1 = 124;
-+	if(abs(m->ltaxis[0]) == m->ltaxis[2])
-+		sym3 = 124;
-+	if(m->ltaxis[1] == 3)
-+		sym1 = (n == 0) ? 0 : m->msplit;
-+	if(m->ltaxis[2] == 3)
-+		sym3 = (n == 0) ? 0 : n - m->msplit;
-+	if(m->ltaxis[0] < 0) {
-+		sym = sym1;
-+		sym1 = sym3;
-+		sym2 = 91;
-+		sym3 = sym;
-+	}
-+	if(m->msplit == 1) {
-+		if(m->ltaxis[0] > 0)
-+			sym1 = 91;
-+		else
-+			sym3 = 93;
-+	}
-+	if(m->msplit > 1 && m->ltaxis[1] == 3 && m->ltaxis[2] == 3)
-+		snprintf(m->ltsymbol, sizeof m->ltsymbol, "%d%c%d", sym1, sym2, sym3);
-+	else if((m->msplit > 1 && m->ltaxis[1] == 3 && m->ltaxis[0] > 0) || (m->ltaxis[2] == 3 && m->ltaxis[0] < 0))
-+		snprintf(m->ltsymbol, sizeof m->ltsymbol, "%d%c%c", sym1, sym2, sym3);
-+	else if((m->ltaxis[2] == 3 && m->ltaxis[0] > 0) || (m->msplit > 1 && m->ltaxis[1] == 3 && m->ltaxis[0] < 0))
-+		snprintf(m->ltsymbol, sizeof m->ltsymbol, "%c%c%d", sym1, sym2, sym3);
-+	else
-+		snprintf(m->ltsymbol, sizeof m->ltsymbol, "%c%c%c", sym1, sym2, sym3);
- 	if(n == 0)
- 		return;
-+	/* master and stack area */
-+	if(abs(m->ltaxis[0]) == 1 && n > m->msplit) {
-+		w1 *= m->mfact;
-+		w2 -= w1;
-+		x1 += (m->ltaxis[0] < 0) ? w2 : 0;
-+		x2 += (m->ltaxis[0] < 0) ? 0 : w1;
-+		X1 = x1 + w1;
-+		X2 = x2 + w2;
-+	} else if(abs(m->ltaxis[0]) == 2 && n > m->msplit) {
-+		h1 *= m->mfact;
-+		h2 -= h1;
-+		y1 += (m->ltaxis[0] < 0) ? h2 : 0;
-+		y2 += (m->ltaxis[0] < 0) ? 0 : h1;
-+		Y1 = y1 + h1;
-+		Y2 = y2 + h2;
-+	}
- 	/* master */
--	c = nexttiled(m->clients);
--	mw = m->mfact * m->ww;
--	resize(c, m->wx, m->wy, (n == 1 ? m->ww : mw) - 2 * c->bw, m->wh - 2 * c->bw, False);
--	if(--n == 0)
--		return;
--	/* tile stack */
--	x = (m->wx + mw > c->x + c->w) ? c->x + c->w + 2 * c->bw : m->wx + mw;
--	y = m->wy;
--	w = (m->wx + mw > c->x + c->w) ? m->wx + m->ww - x : m->ww - mw;
--	h = m->wh / n;
--	if(h < bh)
--		h = m->wh;
--	for(i = 0, c = nexttiled(c->next); c; c = nexttiled(c->next), i++) {
--		resize(c, x, y, w - 2 * c->bw, /* remainder */ ((i + 1 == n)
--		       ? m->wy + m->wh - y - 2 * c->bw : h - 2 * c->bw), False);
--		if(h != m->wh)
--			y = c->y + HEIGHT(c);
-+	n1 = (m->ltaxis[1] != 1 || w1 / m->msplit < bh) ? 1 : m->msplit;
-+	n2 = (m->ltaxis[1] != 2 || h1 / m->msplit < bh) ? 1 : m->msplit;
-+	for(i = 0, c = nexttiled(m->clients); i < m->msplit; c = nexttiled(c->next), i++) {
-+		resize(c, x1, y1, 
-+			(m->ltaxis[1] == 1 && i + 1 == m->msplit) ? X1 - x1 - 2 * c->bw : w1 / n1 - 2 * c->bw, 
-+			(m->ltaxis[1] == 2 && i + 1 == m->msplit) ? Y1 - y1 - 2 * c->bw : h1 / n2 - 2 * c->bw, False);
-+		if(n1 > 1)
-+			x1 = c->x + WIDTH(c);
-+		if(n2 > 1)
-+			y1 = c->y + HEIGHT(c);
-+	}
-+	/* stack */
-+	if(n > m->msplit) {
-+		n1 = (m->ltaxis[2] != 1 || w2 / (n - m->msplit) < bh) ? 1 : n - m->msplit;
-+		n2 = (m->ltaxis[2] != 2 || h2 / (n - m->msplit) < bh) ? 1 : n - m->msplit;
-+		for(i = 0; c; c = nexttiled(c->next), i++) {
-+			resize(c, x2, y2, 
-+				(m->ltaxis[2] == 1 && i + 1 == n - m->msplit) ? X2 - x2 - 2 * c->bw : w2 / n1 - 2 * c->bw, 
-+				(m->ltaxis[2] == 2 && i + 1 == n - m->msplit) ? Y2 - y2 - 2 * c->bw : h2 / n2 - 2 * c->bw, False);
-+			if(n1 > 1)
-+				x2 = c->x + WIDTH(c);
-+			if(n2 > 1)
-+				y2 = c->y + HEIGHT(c);
-+		}
- 	}
- }
- 
- void
- togglebar(const Arg *arg) {
--	selmon->showbar = !selmon->showbar;
-+	selmon->showbar = selmon->showbars[selmon->curtag] = !selmon->showbar;
- 	updatebarpos(selmon);
- 	XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh);
- 	arrange(selmon);
-_AT_@ -1642,12 +1766,31 @@ togglefloating(const Arg *arg) {
- void
- toggletag(const Arg *arg) {
- 	unsigned int newtags;
-+	unsigned int i;
- 
- 	if(!selmon->sel)
- 		return;
- 	newtags = selmon->sel->tags ^ (arg->ui & TAGMASK);
- 	if(newtags) {
- 		selmon->sel->tags = newtags;
-+		if(newtags == ~0) {
-+			selmon->prevtag = selmon->curtag;
-+			selmon->curtag = 0;
-+		}
-+		if(!(newtags & 1 << (selmon->curtag - 1))) {
-+			selmon->prevtag = selmon->curtag;
-+			for (i=0; !(newtags & 1 << i); i++);
-+			selmon->curtag = i + 1;
-+		}
-+		selmon->sel->tags = newtags;
-+		selmon->lt[selmon->sellt] = selmon->lts[selmon->curtag];
-+		selmon->mfact = selmon->mfacts[selmon->curtag];
-+		if (selmon->showbar != selmon->showbars[selmon->curtag])
-+			togglebar(NULL);
-+		selmon->ltaxis[0] = selmon->ltaxes[selmon->curtag][0];
-+		selmon->ltaxis[1] = selmon->ltaxes[selmon->curtag][1];
-+		selmon->ltaxis[2] = selmon->ltaxes[selmon->curtag][2];
-+		selmon->msplit = selmon->msplits[selmon->curtag];
- 		arrange(selmon);
- 	}
- }
-_AT_@ -1914,11 +2057,33 @@ updatewmhints(Client *c) {
- 
- void
- view(const Arg *arg) {
-+	unsigned int i;
-+
- 	if((arg->ui & TAGMASK) == selmon->tagset[selmon->seltags])
- 		return;
- 	selmon->seltags ^= 1; /* toggle sel tagset */
--	if(arg->ui & TAGMASK)
-+	if(arg->ui & TAGMASK) {
- 		selmon->tagset[selmon->seltags] = arg->ui & TAGMASK;
-+		selmon->prevtag = selmon->curtag;
-+		if(arg->ui == ~0)
-+			selmon->curtag = 0;
-+		else {
-+			for (i=0; !(arg->ui & 1 << i); i++);
-+			selmon->curtag = i + 1;
-+		}
-+	} else {
-+		selmon->prevtag = selmon->curtag ^ selmon->prevtag;
-+		selmon->curtag ^= selmon->prevtag;
-+		selmon->prevtag = selmon->curtag ^ selmon->prevtag;
-+	}
-+	selmon->lt[selmon->sellt] = selmon->lts[selmon->curtag];
-+	selmon->mfact = selmon->mfacts[selmon->curtag];
-+	if(selmon->showbar != selmon->showbars[selmon->curtag])
-+		togglebar(NULL);
-+	selmon->ltaxis[0] = selmon->ltaxes[selmon->curtag][0];
-+	selmon->ltaxis[1] = selmon->ltaxes[selmon->curtag][1];
-+	selmon->ltaxis[2] = selmon->ltaxes[selmon->curtag][2];
-+	selmon->msplit = selmon->msplits[selmon->curtag];
- 	arrange(selmon);
- }
- 
diff -r 61b77b61c3fb -r 4307e8502725 dwm.suckless.org/patches/flextile.md
--- a/dwm.suckless.org/patches/flextile.md	Mon Sep 12 10:45:45 2011 +0100
+++ b/dwm.suckless.org/patches/flextile.md	Mon Sep 12 12:35:44 2011 +0200
_AT_@ -57,10 +57,10 @@
 
 ## Download ##
 
- * [flextile-5.8.1.diff][1] (14k) (20100531, joten (at) freenet (dot) de)
- * [flextile-5.8.2.diff][2] (13k, +164 SLOC) (20100611, joten (at) freenet (dot) de) updated by Pascal Wittmann `<mail at pascal-wittmann dot de>`
+ * [flextile-5.8.2.diff][5.8.2] (13k, +164 SLOC) (20100611, joten (at) freenet (dot) de) updated by Pascal Wittmann `<mail at pascal-wittmann dot de>`
+ * [flextile-5.8.1.diff][5.8.1] (14k) (20100531, joten (at) freenet (dot) de)
 
 
-[1]: http://dwm.suckless.org/patches/flextile-5.8.1.diff
-[2]: http://dwm.suckless.org/patches/flextile-5.8.2.diff
+[5.8.2]: flextile-5.8.2.diff
+[5.8.1]: historical/flextile-5.8.1.diff
 
diff -r 61b77b61c3fb -r 4307e8502725 dwm.suckless.org/patches/gapless_grid.md
--- a/dwm.suckless.org/patches/gapless_grid.md	Mon Sep 12 10:45:45 2011 +0100
+++ b/dwm.suckless.org/patches/gapless_grid.md	Mon Sep 12 12:35:44 2011 +0200
_AT_@ -27,4 +27,5 @@
 ## Download
 
 * [gaplessgrid.c](gaplessgrid.c) (dwm 5.6.1) (20090908)
-* see [historical patches](historical) for older versions
+* [dwm-r1437-gaplessgrid.diff](historical/dwm-r1437-gaplessgrid.diff) (1.9k) (20090704)
+* [dwm-5.2-gaplessgrid.diff](historical/dwm-5.2-gaplessgrid.diff) (1.9k) (20081020)
diff -r 61b77b61c3fb -r 4307e8502725 dwm.suckless.org/patches/historical/dwm-5.7.2-pertag.diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwm.suckless.org/patches/historical/dwm-5.7.2-pertag.diff	Mon Sep 12 12:35:44 2011 +0200
_AT_@ -0,0 +1,184 @@
+diff -r 2bcd25cce4ab dwm.c
+--- a/dwm.c	Sun Sep 27 20:20:14 2009 +0100
++++ b/dwm.c	Tue Oct 20 18:27:52 2009 -0300
+_AT_@ -120,26 +120,6 @@
+ 	void (*arrange)(Monitor *);
+ } Layout;
+ 
+-struct Monitor {
+-	char ltsymbol[16];
+-	float mfact;
+-	int num;
+-	int by;               /* bar geometry */
+-	int mx, my, mw, mh;   /* screen size */
+-	int wx, wy, ww, wh;   /* window area  */
+-	unsigned int seltags;
+-	unsigned int sellt;
+-	unsigned int tagset[2];
+-	Bool showbar;
+-	Bool topbar;
+-	Client *clients;
+-	Client *sel;
+-	Client *stack;
+-	Monitor *next;
+-	Window barwin;
+-	const Layout *lt[2];
+-};
+-
+ typedef struct {
+ 	const char *class;
+ 	const char *instance;
+_AT_@ -273,6 +253,31 @@
+ /* configuration, allows nested code to access above variables */
+ #include "config.h"
+ 
++struct Monitor {
++	char ltsymbol[16];
++	float mfact;
++	int num;
++	int by;               /* bar geometry */
++	int mx, my, mw, mh;   /* screen size */
++	int wx, wy, ww, wh;   /* window area  */
++	unsigned int seltags;
++	unsigned int sellt;
++	unsigned int tagset[2];
++	Bool showbar;
++	Bool topbar;
++	Client *clients;
++	Client *sel;
++	Client *stack;
++	Monitor *next;
++	Window barwin;
++	const Layout *lt[2];
++	int curtag;
++	int prevtag;
++	const Layout *lts[LENGTH(tags) + 1];
++	double mfacts[LENGTH(tags) + 1];
++	Bool showbars[LENGTH(tags) + 1];
++};
++
+ /* compile-time check if all tags fit into an unsigned int bit array. */
+ struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; };
+ 
+_AT_@ -1450,7 +1455,7 @@
+ 	if(!arg || !arg->v || arg->v != selmon->lt[selmon->sellt])
+ 		selmon->sellt ^= 1;
+ 	if(arg && arg->v)
+-		selmon->lt[selmon->sellt] = (Layout *)arg->v;
++		selmon->lt[selmon->sellt] = selmon->lts[selmon->curtag] = (Layout *)arg->v;
+ 	strncpy(selmon->ltsymbol, selmon->lt[selmon->sellt]->symbol, sizeof selmon->ltsymbol);
+ 	if(selmon->sel)
+ 		arrange(selmon);
+_AT_@ -1468,13 +1473,15 @@
+ 	f = arg->f < 1.0 ? arg->f + selmon->mfact : arg->f - 1.0;
+ 	if(f < 0.1 || f > 0.9)
+ 		return;
+-	selmon->mfact = f;
++	selmon->mfact = selmon->mfacts[selmon->curtag] = f;
+ 	arrange(selmon);
+ }
+ 
+ void
+ setup(void) {
+ 	XSetWindowAttributes wa;
++	Monitor *m;
++	unsigned int i;
+ 
+ 	/* clean up any zombies immediately */
+ 	sigchld(0);
+_AT_@ -1509,7 +1516,27 @@
+ 	XSetLineAttributes(dpy, dc.gc, 1, LineSolid, CapButt, JoinMiter);
+ 	if(!dc.font.set)
+ 		XSetFont(dpy, dc.gc, dc.font.xfont->fid);
++	/* init tags */
++	for(m = mons; m; m = m->next)
++		m->curtag = m->prevtag = 1;
++	/* init mfacts */
++	for(m = mons; m; m = m->next) {
++		for(i=0; i < LENGTH(tags) + 1 ; i++) {
++			m->mfacts[i] = m->mfact;
++		}
++	}
++	/* init layouts */
++	for(m = mons; m; m = m->next) {
++		for(i=0; i < LENGTH(tags) + 1; i++) {
++			m->lts[i] = &layouts[0];
++		}
++	}
+ 	/* init bars */
++	for(m = mons; m; m = m->next) {
++		for(i=0; i < LENGTH(tags) + 1; i++) {
++			m->showbars[i] = m->showbar;
++		}
++	}
+ 	updatebars();
+ 	updatestatus();
+ 	/* EWMH support per view */
+_AT_@ -1620,7 +1647,7 @@
+ 
+ void
+ togglebar(const Arg *arg) {
+-	selmon->showbar = !selmon->showbar;
++	selmon->showbar = selmon->showbars[selmon->curtag] = !selmon->showbar;
+ 	updatebarpos(selmon);
+ 	XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh);
+ 	arrange(selmon);
+_AT_@ -1640,12 +1667,27 @@
+ void
+ toggletag(const Arg *arg) {
+ 	unsigned int newtags;
++	unsigned int i;
+ 
+ 	if(!selmon->sel)
+ 		return;
+ 	newtags = selmon->sel->tags ^ (arg->ui & TAGMASK);
+ 	if(newtags) {
+ 		selmon->sel->tags = newtags;
++		if(newtags == ~0) {
++			selmon->prevtag = selmon->curtag;
++			selmon->curtag = 0;
++		}
++		if(!(newtags & 1 << (selmon->curtag - 1))) {
++			selmon->prevtag = selmon->curtag;
++			for (i=0; !(newtags & 1 << i); i++);
++			selmon->curtag = i + 1;
++		}
++		selmon->sel->tags = newtags;
++		selmon->lt[selmon->sellt] = selmon->lts[selmon->curtag];
++		selmon->mfact = selmon->mfacts[selmon->curtag];
++		if (selmon->showbar != selmon->showbars[selmon->curtag])
++			togglebar(NULL);
+ 		arrange(selmon);
+ 	}
+ }
+_AT_@ -1912,11 +1954,29 @@
+ 
+ void
+ view(const Arg *arg) {
++	unsigned int i;
++
+ 	if((arg->ui & TAGMASK) == selmon->tagset[selmon->seltags])
+ 		return;
+ 	selmon->seltags ^= 1; /* toggle sel tagset */
+-	if(arg->ui & TAGMASK)
++	if(arg->ui & TAGMASK) {
+ 		selmon->tagset[selmon->seltags] = arg->ui & TAGMASK;
++		selmon->prevtag = selmon->curtag;
++		if(arg->ui == ~0)
++			selmon->curtag = 0;
++		else {
++			for (i=0; !(arg->ui & 1 << i); i++);
++			selmon->curtag = i + 1;
++		}
++	} else {
++		selmon->prevtag= selmon->curtag ^ selmon->prevtag;
++		selmon->curtag^= selmon->prevtag;
++		selmon->prevtag= selmon->curtag ^ selmon->prevtag;
++	}
++	selmon->lt[selmon->sellt]= selmon->lts[selmon->curtag];
++	selmon->mfact = selmon->mfacts[selmon->curtag];
++	if(selmon->showbar != selmon->showbars[selmon->curtag])
++		togglebar(NULL);
+ 	arrange(selmon);
+ }
+ 
diff -r 61b77b61c3fb -r 4307e8502725 dwm.suckless.org/patches/historical/dwm-5.7.2-statuscolors.diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwm.suckless.org/patches/historical/dwm-5.7.2-statuscolors.diff	Mon Sep 12 12:35:44 2011 +0200
_AT_@ -0,0 +1,234 @@
+diff -r 2bcd25cce4ab config.def.h
+--- a/config.def.h	Sun Sep 27 20:20:14 2009 +0100
++++ b/config.def.h	Mon Oct 05 22:01:49 2009 -0300
+_AT_@ -1,13 +1,16 @@
+ /* See LICENSE file for copyright and license details. */
+ 
+ /* appearance */
++#define NUMCOLORS         4             // need at least 3
++static const char colors[NUMCOLORS][ColLast][8] = {
++	// border   foreground  background
++	{ "#cccccc", "#000000", "#cccccc" },  // 0 = normal
++	{ "#0066ff", "#ffffff", "#0066ff" },  // 1 = selected
++	{ "#0066ff", "#0066ff", "#ffffff" },  // 2 = urgent/warning
++	{ "#ff0000", "#ffffff", "#ff0000" },  // 3 = error
++	// add more here
++};
+ static const char font[]            = "-*-*-medium-*-*-*-14-*-*-*-*-*-*-*";
+-static const char normbordercolor[] = "#cccccc";
+-static const char normbgcolor[]     = "#cccccc";
+-static const char normfgcolor[]     = "#000000";
+-static const char selbordercolor[]  = "#0066ff";
+-static const char selbgcolor[]      = "#0066ff";
+-static const char selfgcolor[]      = "#ffffff";
+ static const unsigned int borderpx  = 1;        /* border pixel of windows */
+ static const unsigned int snap      = 32;       /* snap pixel */
+ static const Bool showbar           = True;     /* False means no bar */
+_AT_@ -45,7 +48,7 @@
+ #define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } }
+ 
+ /* commands */
+-static const char *dmenucmd[] = { "dmenu_run", "-fn", font, "-nb", normbgcolor, "-nf", normfgcolor, "-sb", selbgcolor, "-sf", selfgcolor, NULL };
++static const char *dmenucmd[] = { "dmenu_run", "-fn", font, "-nb", colors[0][ColBG], "-nf", colors[0][ColFG], "-sb", colors[1][ColBG], "-sf", colors[1][ColFG], NULL };
+ static const char *termcmd[]  = { "uxterm", NULL };
+ 
+ static Key keys[] = {
+diff -r 2bcd25cce4ab dwm.c
+--- a/dwm.c	Sun Sep 27 20:20:14 2009 +0100
++++ b/dwm.c	Mon Oct 05 22:01:49 2009 -0300
+_AT_@ -48,6 +48,7 @@
+ #define LENGTH(X)               (sizeof X / sizeof X[0])
+ #define MAX(A, B)               ((A) > (B) ? (A) : (B))
+ #define MIN(A, B)               ((A) < (B) ? (A) : (B))
++#define MAXCOLORS               8
+ #define MOUSEMASK               (BUTTONMASK|PointerMotionMask)
+ #define WIDTH(X)                ((X)->w + 2 * (X)->bw)
+ #define HEIGHT(X)               ((X)->h + 2 * (X)->bw)
+_AT_@ -95,8 +96,7 @@
+ 
+ typedef struct {
+ 	int x, y, w, h;
+-	unsigned long norm[ColLast];
+-	unsigned long sel[ColLast];
++    unsigned long colors[MAXCOLORS][ColLast];
+ 	Drawable drawable;
+ 	GC gc;
+ 	struct {
+_AT_@ -172,8 +172,9 @@
+ static Monitor *dirtomon(int dir);
+ static void drawbar(Monitor *m);
+ static void drawbars(void);
+-static void drawsquare(Bool filled, Bool empty, Bool invert, unsigned long col[ColLast]);
+-static void drawtext(const char *text, unsigned long col[ColLast], Bool invert);
++static void drawcoloredtext(char *text);
++static void drawsquare(Bool filled, Bool empty, unsigned long col[ColLast]);
++static void drawtext(const char *text, unsigned long col[ColLast], Bool pad);
+ static void enternotify(XEvent *e);
+ static void expose(XEvent *e);
+ static void focus(Client *c);
+_AT_@ -691,14 +692,13 @@
+ 	dc.x = 0;
+ 	for(i = 0; i < LENGTH(tags); i++) {
+ 		dc.w = TEXTW(tags[i]);
+-		col = m->tagset[m->seltags] & 1 << i ? dc.sel : dc.norm;
+-		drawtext(tags[i], col, urg & 1 << i);
+-		drawsquare(m == selmon && selmon->sel && selmon->sel->tags & 1 << i,
+-		           occ & 1 << i, urg & 1 << i, col);
++		col = dc.colors[ (m->tagset[m->seltags] & 1 << i ? 1:(urg & 1 << i ? 2:0))];
++		drawtext(tags[i], col, True);
++		drawsquare(m == selmon && selmon->sel && selmon->sel->tags & 1 << i, occ & 1 << i, col);
+ 		dc.x += dc.w;
+ 	}
+ 	dc.w = blw = TEXTW(m->ltsymbol);
+-	drawtext(m->ltsymbol, dc.norm, False);
++	drawtext(m->ltsymbol, dc.colors[0], True);
+ 	dc.x += dc.w;
+ 	x = dc.x;
+ 	if(m == selmon) { /* status is only drawn on selected monitor */
+_AT_@ -708,19 +708,19 @@
+ 			dc.x = x;
+ 			dc.w = m->ww - x;
+ 		}
+-		drawtext(stext, dc.norm, False);
++		drawcoloredtext(stext);
+ 	}
+ 	else
+ 		dc.x = m->ww;
+ 	if((dc.w = dc.x - x) > bh) {
+ 		dc.x = x;
+ 		if(m->sel) {
+-			col = m == selmon ? dc.sel : dc.norm;
+-			drawtext(m->sel->name, col, False);
+-			drawsquare(m->sel->isfixed, m->sel->isfloating, False, col);
++			col = m == selmon ? dc.colors[1] : dc.colors[0];
++			drawtext(m->sel->name, col, True);
++			drawsquare(m->sel->isfixed, m->sel->isfloating, col);
+ 		}
+ 		else
+-			drawtext(NULL, dc.norm, False);
++			drawtext(NULL, dc.colors[0], False);
+ 	}
+ 	XCopyArea(dpy, dc.drawable, m->barwin, dc.gc, 0, 0, m->ww, bh, 0, 0);
+ 	XSync(dpy, False);
+_AT_@ -735,12 +735,42 @@
+ }
+ 
+ void
+-drawsquare(Bool filled, Bool empty, Bool invert, unsigned long col[ColLast]) {
++drawcoloredtext(char *text) {
++	Bool first=True;
++	char *buf = text, *ptr = buf, c = 1;
++	unsigned long *col = dc.colors[0];
++	int i, ox = dc.x;
++
++	while( *ptr ) {
++		for( i = 0; *ptr < 0 || *ptr > NUMCOLORS; i++, ptr++);
++		if( !*ptr ) break;
++		c=*ptr;
++		*ptr=0;
++		if( i ) {
++			dc.w = selmon->ww - dc.x;
++			drawtext(buf, col, first);
++			dc.x += textnw(buf, i) + textnw(&c,1);
++			if( first ) dc.x += ( dc.font.ascent + dc.font.descent ) / 2;
++			first = False;
++		} else if( first ) {
++			ox = dc.x += textnw(&c,1);
++		}
++		*ptr = c;
++		col = dc.colors[ c-1 ];
++		buf = ++ptr;
++	}
++	if( !first ) dc.x-=(dc.font.ascent+dc.font.descent)/2;
++	drawtext(buf, col, True);
++	dc.x = ox;
++}
++
++void
++drawsquare(Bool filled, Bool empty, unsigned long col[ColLast]) {
+ 	int x;
+ 	XGCValues gcv;
+ 	XRectangle r = { dc.x, dc.y, dc.w, dc.h };
+ 
+-	gcv.foreground = col[invert ? ColBG : ColFG];
++	gcv.foreground = col[ ColFG ];
+ 	XChangeGC(dpy, dc.gc, GCForeground, &gcv);
+ 	x = (dc.font.ascent + dc.font.descent + 2) / 4;
+ 	r.x = dc.x + 1;
+_AT_@ -756,18 +786,18 @@
+ }
+ 
+ void
+-drawtext(const char *text, unsigned long col[ColLast], Bool invert) {
++drawtext(const char *text, unsigned long col[ColLast], Bool pad) {
+ 	char buf[256];
+ 	int i, x, y, h, len, olen;
+ 	XRectangle r = { dc.x, dc.y, dc.w, dc.h };
+ 
+-	XSetForeground(dpy, dc.gc, col[invert ? ColFG : ColBG]);
++	XSetForeground(dpy, dc.gc, col[ ColBG ]);
+ 	XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1);
+ 	if(!text)
+ 		return;
+ 	olen = strlen(text);
+-	h = dc.font.ascent + dc.font.descent;
+-	y = dc.y + (dc.h / 2) - (h / 2) + dc.font.ascent;
++	h = pad ? (dc.font.ascent + dc.font.descent) : 0;
++	y = dc.y + ((dc.h + dc.font.ascent - dc.font.descent) / 2);
+ 	x = dc.x + (h / 2);
+ 	/* shorten text if necessary */
+ 	for(len = MIN(olen, sizeof buf); len && textnw(text, len) > dc.w - h; len--);
+_AT_@ -776,7 +806,7 @@
+ 	memcpy(buf, text, len);
+ 	if(len < olen)
+ 		for(i = len; i && i > len - 3; buf[--i] = '.');
+-	XSetForeground(dpy, dc.gc, col[invert ? ColBG : ColFG]);
++	XSetForeground(dpy, dc.gc, col[ ColFG ]);
+ 	if(dc.font.set)
+ 		XmbDrawString(dpy, dc.drawable, dc.font.set, dc.gc, x, y, buf, len);
+ 	else
+_AT_@ -824,7 +854,7 @@
+ 		detachstack(c);
+ 		attachstack(c);
+ 		grabbuttons(c, True);
+-		XSetWindowBorder(dpy, c->win, dc.sel[ColBorder]);
++		XSetWindowBorder(dpy, c->win, dc.colors[1][ColBorder]);
+ 		XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime);
+ 	}
+ 	else
+_AT_@ -1132,7 +1162,7 @@
+ 	}
+ 	wc.border_width = c->bw;
+ 	XConfigureWindow(dpy, w, CWBorderWidth, &wc);
+-	XSetWindowBorder(dpy, w, dc.norm[ColBorder]);
++	XSetWindowBorder(dpy, w, dc.colors[0][ColBorder]);
+ 	configure(c); /* propagates border_width, if size doesn't change */
+ 	updatesizehints(c);
+ 	XSelectInput(dpy, w, EnterWindowMask|FocusChangeMask|PropertyChangeMask|StructureNotifyMask);
+_AT_@ -1498,12 +1528,11 @@
+ 	cursor[CurResize] = XCreateFontCursor(dpy, XC_sizing);
+ 	cursor[CurMove] = XCreateFontCursor(dpy, XC_fleur);
+ 	/* init appearance */
+-	dc.norm[ColBorder] = getcolor(normbordercolor);
+-	dc.norm[ColBG] = getcolor(normbgcolor);
+-	dc.norm[ColFG] = getcolor(normfgcolor);
+-	dc.sel[ColBorder] = getcolor(selbordercolor);
+-	dc.sel[ColBG] = getcolor(selbgcolor);
+-	dc.sel[ColFG] = getcolor(selfgcolor);
++	for(int i=0; i<NUMCOLORS; i++) {
++		dc.colors[i][ColBorder] = getcolor( colors[i][ColBorder] );
++		dc.colors[i][ColFG] = getcolor( colors[i][ColFG] );
++		dc.colors[i][ColBG] = getcolor( colors[i][ColBG] );
++	}
+ 	dc.drawable = XCreatePixmap(dpy, root, DisplayWidth(dpy, screen), bh, DefaultDepth(dpy, screen));
+ 	dc.gc = XCreateGC(dpy, root, 0, NULL);
+ 	XSetLineAttributes(dpy, dc.gc, 1, LineSolid, CapButt, JoinMiter);
+_AT_@ -1665,7 +1694,7 @@
+ 	if(!c)
+ 		return;
+ 	grabbuttons(c, False);
+-	XSetWindowBorder(dpy, c->win, dc.norm[ColBorder]);
++	XSetWindowBorder(dpy, c->win, dc.colors[0][ColBorder]);
+ 	XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime);
+ }
+ 
diff -r 61b77b61c3fb -r 4307e8502725 dwm.suckless.org/patches/historical/dwm-5.8.2-statuscolors.diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwm.suckless.org/patches/historical/dwm-5.8.2-statuscolors.diff	Mon Sep 12 12:35:44 2011 +0200
_AT_@ -0,0 +1,232 @@
+--- a/config.def.h      2010-10-16 15:49:03.000000000 +0200
++++ b/config.def.h      2010-10-16 15:51:35.000000000 +0200
+_AT_@ -1,13 +1,16 @@
+ /* See LICENSE file for copyright and license details. */
+ 
+ /* appearance */
++#define NUMCOLORS         4             // need at least 3
++static const char colors[NUMCOLORS][ColLast][8] = {
++   // border   foreground  background
++   { "#cccccc", "#000000", "#cccccc" },  // 0 = normal
++   { "#0066ff", "#ffffff", "#0066ff" },  // 1 = selected
++   { "#0066ff", "#0066ff", "#ffffff" },  // 2 = urgent/warning
++   { "#ff0000", "#ffffff", "#ff0000" },  // 3 = error
++   // add more here
++};
+ static const char font[]            = "-*-terminus-medium-r-*-*-16-*-*-*-*-*-*-*";
+-static const char normbordercolor[] = "#cccccc";
+-static const char normbgcolor[]     = "#cccccc";
+-static const char normfgcolor[]     = "#000000";
+-static const char selbordercolor[]  = "#0066ff";
+-static const char selbgcolor[]      = "#0066ff";
+-static const char selfgcolor[]      = "#ffffff";
+ static const unsigned int borderpx  = 1;        /* border pixel of windows */
+ static const unsigned int snap      = 32;       /* snap pixel */
+ static const Bool showbar           = True;     /* False means no bar */
+_AT_@ -45,7 +48,7 @@
+ #define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } }
+ 
+ /* commands */
+-static const char *dmenucmd[] = { "dmenu_run", "-fn", font, "-nb", normbgcolor, "-nf", normfgcolor, "-sb", selbgcolor, "-sf", selfgcolor, NULL };
++static const char *dmenucmd[] = { "dmenu_run", "-fn", font, "-nb", colors[0][ColBG], "-nf", colors[0][ColFG],"-sb", colors[1][ColBG], "-sf", colors[1][ColFG], NULL };
+ static const char *termcmd[]  = { "uxterm", NULL };
+ 
+ static Key keys[] = {
+--- a//dwm.c	2010-06-04 12:39:15.000000000 +0200
++++ b/dwm.c	2010-11-03 20:36:50.000000000 +0100
+_AT_@ -48,6 +48,7 @@
+ #define LENGTH(X)               (sizeof X / sizeof X[0])
+ #define MAX(A, B)               ((A) > (B) ? (A) : (B))
+ #define MIN(A, B)               ((A) < (B) ? (A) : (B))
++#define MAXCOLORS               8
+ #define MOUSEMASK               (BUTTONMASK|PointerMotionMask)
+ #define WIDTH(X)                ((X)->w + 2 * (X)->bw)
+ #define HEIGHT(X)               ((X)->h + 2 * (X)->bw)
+_AT_@ -97,8 +98,7 @@
+ 
+ typedef struct {
+ 	int x, y, w, h;
+-	unsigned long norm[ColLast];
+-	unsigned long sel[ColLast];
++	unsigned long colors[MAXCOLORS][ColLast];
+ 	Drawable drawable;
+ 	GC gc;
+ 	struct {
+_AT_@ -175,8 +175,9 @@
+ static Monitor *dirtomon(int dir);
+ static void drawbar(Monitor *m);
+ static void drawbars(void);
+-static void drawsquare(Bool filled, Bool empty, Bool invert, unsigned long col[ColLast]);
+-static void drawtext(const char *text, unsigned long col[ColLast], Bool invert);
++static void drawcoloredtext(char *text);
++static void drawsquare(Bool filled, Bool empty, unsigned long col[ColLast]);
++static void drawtext(const char *text, unsigned long col[ColLast], Bool pad);
+ static void enternotify(XEvent *e);
+ static void expose(XEvent *e);
+ static void focus(Client *c);
+_AT_@ -696,14 +697,13 @@
+ 	dc.x = 0;
+ 	for(i = 0; i < LENGTH(tags); i++) {
+ 		dc.w = TEXTW(tags[i]);
+-		col = m->tagset[m->seltags] & 1 << i ? dc.sel : dc.norm;
+-		drawtext(tags[i], col, urg & 1 << i);
+-		drawsquare(m == selmon && selmon->sel && selmon->sel->tags & 1 << i,
+-		           occ & 1 << i, urg & 1 << i, col);
++		col = dc.colors[ (m->tagset[m->seltags] & 1 << i ? 1:(urg & 1 << i ? 2:0))];
++		drawtext(tags[i], col, True);
++		drawsquare(m == selmon && selmon->sel && selmon->sel->tags & 1 << i, occ & 1 << i, col);
+ 		dc.x += dc.w;
+ 	}
+ 	dc.w = blw = TEXTW(m->ltsymbol);
+-	drawtext(m->ltsymbol, dc.norm, False);
++	drawtext(m->ltsymbol, dc.colors[0], True);
+ 	dc.x += dc.w;
+ 	x = dc.x;
+ 	if(m == selmon) { /* status is only drawn on selected monitor */
+_AT_@ -713,19 +713,19 @@
+ 			dc.x = x;
+ 			dc.w = m->ww - x;
+ 		}
+-		drawtext(stext, dc.norm, False);
++		drawcoloredtext(stext);
+ 	}
+ 	else
+ 		dc.x = m->ww;
+ 	if((dc.w = dc.x - x) > bh) {
+ 		dc.x = x;
+ 		if(m->sel) {
+-			col = m == selmon ? dc.sel : dc.norm;
+-			drawtext(m->sel->name, col, False);
+-			drawsquare(m->sel->isfixed, m->sel->isfloating, False, col);
++			col = m == selmon ? dc.colors[1] : dc.colors[0];
++			drawtext(m->sel->name, col, True);
++			drawsquare(m->sel->isfixed, m->sel->isfloating, col);
+ 		}
+ 		else
+-			drawtext(NULL, dc.norm, False);
++			drawtext(NULL, dc.colors[0], False);
+ 	}
+ 	XCopyArea(dpy, dc.drawable, m->barwin, dc.gc, 0, 0, m->ww, bh, 0, 0);
+ 	XSync(dpy, False);
+_AT_@ -740,12 +740,42 @@
+ }
+ 
+ void
+-drawsquare(Bool filled, Bool empty, Bool invert, unsigned long col[ColLast]) {
++drawcoloredtext(char *text) {
++	Bool first=True;
++	char *buf = text, *ptr = buf, c = 1;
++	unsigned long *col = dc.colors[0];
++	int i, ox = dc.x;
++
++	while( *ptr ) {
++		for( i = 0; *ptr < 0 || *ptr > NUMCOLORS; i++, ptr++);
++		if( !*ptr ) break;
++		c=*ptr;
++		*ptr=0;
++		if( i ) {
++			dc.w = selmon->ww - dc.x;
++			drawtext(buf, col, first);
++			dc.x += textnw(buf, i) + textnw(&c,1);
++			if( first ) dc.x += ( dc.font.ascent + dc.font.descent ) / 2;
++			first = False;
++		} else if( first ) {
++			ox = dc.x += textnw(&c,1);
++		}
++		*ptr = c;
++		col = dc.colors[ c-1 ];
++		buf = ++ptr;
++	}
++	if( !first ) dc.x-=(dc.font.ascent+dc.font.descent)/2;
++	drawtext(buf, col, True);
++	dc.x = ox;
++}
++
++void
++drawsquare(Bool filled, Bool empty, unsigned long col[ColLast]) {
+ 	int x;
+ 	XGCValues gcv;
+ 	XRectangle r = { dc.x, dc.y, dc.w, dc.h };
+ 
+-	gcv.foreground = col[invert ? ColBG : ColFG];
++	gcv.foreground = col[ ColFG ];
+ 	XChangeGC(dpy, dc.gc, GCForeground, &gcv);
+ 	x = (dc.font.ascent + dc.font.descent + 2) / 4;
+ 	r.x = dc.x + 1;
+_AT_@ -761,18 +791,18 @@
+ }
+ 
+ void
+-drawtext(const char *text, unsigned long col[ColLast], Bool invert) {
++drawtext(const char *text, unsigned long col[ColLast], Bool pad) {
+ 	char buf[256];
+ 	int i, x, y, h, len, olen;
+ 	XRectangle r = { dc.x, dc.y, dc.w, dc.h };
+ 
+-	XSetForeground(dpy, dc.gc, col[invert ? ColFG : ColBG]);
++	XSetForeground(dpy, dc.gc, col[ ColBG ]);
+ 	XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1);
+ 	if(!text)
+ 		return;
+ 	olen = strlen(text);
+-	h = dc.font.ascent + dc.font.descent;
+-	y = dc.y + (dc.h / 2) - (h / 2) + dc.font.ascent;
++	h = pad ? (dc.font.ascent + dc.font.descent) : 0;
++	y = dc.y + ((dc.h + dc.font.ascent - dc.font.descent) / 2);
+ 	x = dc.x + (h / 2);
+ 	/* shorten text if necessary */
+ 	for(len = MIN(olen, sizeof buf); len && textnw(text, len) > dc.w - h; len--);
+_AT_@ -781,7 +811,7 @@
+ 	memcpy(buf, text, len);
+ 	if(len < olen)
+ 		for(i = len; i && i > len - 3; buf[--i] = '.');
+-	XSetForeground(dpy, dc.gc, col[invert ? ColBG : ColFG]);
++	XSetForeground(dpy, dc.gc, col[ ColFG ]);
+ 	if(dc.font.set)
+ 		XmbDrawString(dpy, dc.drawable, dc.font.set, dc.gc, x, y, buf, len);
+ 	else
+_AT_@ -830,7 +860,7 @@
+ 		detachstack(c);
+ 		attachstack(c);
+ 		grabbuttons(c, True);
+-		XSetWindowBorder(dpy, c->win, dc.sel[ColBorder]);
++		XSetWindowBorder(dpy, c->win, dc.colors[1][ColBorder]);
+ 		XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime);
+ 	}
+ 	else
+_AT_@ -1139,7 +1169,7 @@
+ 	}
+ 	wc.border_width = c->bw;
+ 	XConfigureWindow(dpy, w, CWBorderWidth, &wc);
+-	XSetWindowBorder(dpy, w, dc.norm[ColBorder]);
++	XSetWindowBorder(dpy, w, dc.colors[0][ColBorder]);
+ 	configure(c); /* propagates border_width, if size doesn't change */
+ 	updatesizehints(c);
+ 	XSelectInput(dpy, w, EnterWindowMask|FocusChangeMask|PropertyChangeMask|StructureNotifyMask);
+_AT_@ -1544,12 +1574,11 @@
+ 	cursor[CurResize] = XCreateFontCursor(dpy, XC_sizing);
+ 	cursor[CurMove] = XCreateFontCursor(dpy, XC_fleur);
+ 	/* init appearance */
+-	dc.norm[ColBorder] = getcolor(normbordercolor);
+-	dc.norm[ColBG] = getcolor(normbgcolor);
+-	dc.norm[ColFG] = getcolor(normfgcolor);
+-	dc.sel[ColBorder] = getcolor(selbordercolor);
+-	dc.sel[ColBG] = getcolor(selbgcolor);
+-	dc.sel[ColFG] = getcolor(selfgcolor);
++	for(int i=0; i<NUMCOLORS; i++) {
++		dc.colors[i][ColBorder] = getcolor( colors[i][ColBorder] );
++		dc.colors[i][ColFG] = getcolor( colors[i][ColFG] );
++		dc.colors[i][ColBG] = getcolor( colors[i][ColBG] );
++	}
+ 	dc.drawable = XCreatePixmap(dpy, root, DisplayWidth(dpy, screen), bh, DefaultDepth(dpy, screen));
+ 	dc.gc = XCreateGC(dpy, root, 0, NULL);
+ 	XSetLineAttributes(dpy, dc.gc, 1, LineSolid, CapButt, JoinMiter);
+_AT_@ -1711,7 +1740,7 @@
+ 	if(!c)
+ 		return;
+ 	grabbuttons(c, False);
+-	XSetWindowBorder(dpy, c->win, dc.norm[ColBorder]);
++	XSetWindowBorder(dpy, c->win, dc.colors[0][ColBorder]);
+ 	if(setfocus)
+ 		XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime);
+ }
diff -r 61b77b61c3fb -r 4307e8502725 dwm.suckless.org/patches/historical/dwm-gap-5.7.2.diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwm.suckless.org/patches/historical/dwm-gap-5.7.2.diff	Mon Sep 12 12:35:44 2011 +0200
_AT_@ -0,0 +1,23 @@
+--- a/dwm.c	2009-09-17 10:48:57.000000000 +0200
++++ b/dwm.c	2009-09-16 18:54:37.000000000 +0200
+_AT_@ -1270,10 +1270,10 @@
+ 	XWindowChanges wc;
+ 
+ 	if(applysizehints(c, &x, &y, &w, &h, interact)) {
+-		c->x = wc.x = x;
+-		c->y = wc.y = y;
+-		c->w = wc.width = w;
+-		c->h = wc.height = h;
++		c->x = wc.x = x + gappx;
++		c->y = wc.y = y + gappx;
++		c->w = wc.width = w - 2 * gappx ;
++		c->h = wc.height = h - 2 * gappx ;
+ 		wc.border_width = c->bw;
+ 		XConfigureWindow(dpy, c->win, CWX|CWY|CWWidth|CWHeight|CWBorderWidth, &wc);
+ 		configure(c);
+
+diff -r 72e52c5333ef config.def.h
+--- a/config.def.h	Wed Nov 25 13:56:17 2009 +0000
++++ b/config.def.h	Tue Dec 15 18:39:44 2009 +0100
+_AT_@ -7,14 +7,15 @@
++static const unsigned int gappx     = 4;           /* gap pixel between windows */
diff -r 61b77b61c3fb -r 4307e8502725 dwm.suckless.org/patches/historical/dwm-pertag-5.6.1.diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwm.suckless.org/patches/historical/dwm-pertag-5.6.1.diff	Mon Sep 12 12:35:44 2011 +0200
_AT_@ -0,0 +1,184 @@
+--- dwm.c	2009-09-18 18:12:50.000000000 +0200
++++ dwm.c.working	2009-09-18 18:14:04.000000000 +0200
+_AT_@ -131,6 +131,25 @@
+ 	void            (*arrange) (Monitor *);
+ }               Layout;
+ 
++struct Monitor {
++	float           mfact;
++	int             num;
++	int             by;	/* bar geometry */
++	int             mx, my, mw, mh;	/* screen size */
++	int             wx, wy, ww, wh;	/* window area  */
++	unsigned int    seltags;
++	unsigned int    sellt;
++	unsigned int    tagset[2];
++	Bool            showbar;
++	Bool            topbar;
++	Client         *clients;
++	Client         *sel;
++	Client         *stack;
++	Monitor        *next;
++	Window          barwin;
++	const Layout   *lt[2];
++};
++
+ typedef struct {
+ 	const char     *class;
+ 	const char     *instance;
+_AT_@ -263,30 +282,6 @@
+ /* configuration, allows nested code to access above variables */
+ #include "config.h"
+ 
+-struct Monitor {
+-	float           mfact;
+-	int             num;
+-	int             by;	/* bar geometry */
+-	int             mx, my, mw, mh;	/* screen size */
+-	int             wx, wy, ww, wh;	/* window area  */
+-	unsigned int    seltags;
+-	unsigned int    sellt;
+-	unsigned int    tagset[2];
+-	Bool            showbar;
+-	Bool            topbar;
+-	Client         *clients;
+-	Client         *sel;
+-	Client         *stack;
+-	Monitor        *next;
+-	Window          barwin;
+-	const Layout   *lt[2];
+-	int             curtag;
+-	int             prevtag;
+-	const Layout   *lts[LENGTH(tags) + 1];
+-	double          mfacts[LENGTH(tags) + 1];
+-	Bool            showbars[LENGTH(tags) + 1];
+-};
+-
+ /* compile-time check if all tags fit into an unsigned int bit array. */
+ struct NumTags {
+ 	char            limitexceeded[LENGTH(tags) > 31 ? -1 : 1];
+_AT_@ -1484,7 +1479,7 @@
+ 	if (!arg || !arg->v || arg->v != selmon->lt[selmon->sellt])
+ 		selmon->sellt ^= 1;
+ 	if (arg && arg->v)
+-		selmon->lt[selmon->sellt] = selmon->lts[selmon->curtag] = (Layout *) arg->v;
++		selmon->lt[selmon->sellt] = (Layout *) arg->v;
+ 	if (selmon->sel)
+ 		arrange();
+ 	else
+_AT_@ -1502,7 +1497,7 @@
+ 	f = arg->f < 1.0 ? arg->f + selmon->mfact : arg->f - 1.0;
+ 	if (f < 0.1 || f > 0.9)
+ 		return;
+-	selmon->mfact = selmon->mfacts[selmon->curtag] = f;
++	selmon->mfact = f;
+ 	arrange();
+ }
+ 
+_AT_@ -1512,7 +1507,6 @@
+ 	unsigned int    i;
+ 	int             w;
+ 	XSetWindowAttributes wa;
+-	Monitor        *m;
+ 
+ 	/* clean up any zombies immediately */
+ 	sigchld(0);
+_AT_@ -1547,31 +1541,11 @@
+ 	XSetLineAttributes(dpy, dc.gc, 1, LineSolid, CapButt, JoinMiter);
+ 	if (!dc.font.set)
+ 		XSetFont(dpy, dc.gc, dc.font.xfont->fid);
+-	/* init tags */
+-	for (m = mons; m; m = m->next)
+-		m->curtag = m->prevtag = 1;
+-	/* init mfacts */
+-	for (m = mons; m; m = m->next) {
+-		for (i = 0; i < LENGTH(tags) + 1; i++) {
+-			m->mfacts[i] = m->mfact;
+-		}
+-	}
+-	/* init layouts */
+-	for (m = mons; m; m = m->next) {
+-		for (i = 0; i < LENGTH(tags) + 1; i++) {
+-			m->lts[i] = &layouts[0];
+-		}
+-	}
+ 	/* init bars */
+ 	for (blw = i = 0; LENGTH(layouts) > 1 && i < LENGTH(layouts); i++) {
+ 		w = TEXTW(layouts[i].symbol);
+ 		blw = MAX(blw, w);
+ 	}
+-	for (m = mons; m; m = m->next) {
+-		for (i = 0; i < LENGTH(tags) + 1; i++) {
+-			m->showbars[i] = m->showbar;
+-		}
+-	}
+ 	updatebars();
+ 	updatestatus();
+ 	/* EWMH support per view */
+_AT_@ -1689,7 +1663,7 @@
+ void
+ togglebar(const Arg * arg)
+ {
+-	selmon->showbar = selmon->showbars[selmon->curtag] = !selmon->showbar;
++	selmon->showbar = !selmon->showbar;
+ 	updatebarpos(selmon);
+ 	XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh);
+ 	arrange();
+_AT_@ -1710,27 +1684,13 @@
+ void
+ toggletag(const Arg * arg)
+ {
+-	unsigned int    i;
+ 	unsigned int    newtags;
+ 
+ 	if (!selmon->sel)
+ 		return;
+ 	newtags = selmon->sel->tags ^ (arg->ui & TAGMASK);
+ 	if (newtags) {
+-		if (newtags == ~0) {
+-			selmon->prevtag = selmon->curtag;
+-			selmon->curtag = 0;
+-		}
+-		if (!(newtags & 1 << (selmon->curtag - 1))) {
+-			selmon->prevtag = selmon->curtag;
+-			for (i = 0; !(newtags & 1 << i); i++);
+-			selmon->curtag = i + 1;
+-		}
+ 		selmon->sel->tags = newtags;
+-		selmon->lt[selmon->sellt] = selmon->lts[selmon->curtag];
+-		selmon->mfact = selmon->mfacts[selmon->curtag];
+-		if (selmon->showbar != selmon->showbars[selmon->curtag])
+-			togglebar(NULL);
+ 		arrange();
+ 	}
+ }
+_AT_@ -1993,28 +1953,11 @@
+ void
+ view(const Arg * arg)
+ {
+-	unsigned int    i;
+ 	if ((arg->ui & TAGMASK) == selmon->tagset[selmon->seltags])
+ 		return;
+ 	selmon->seltags ^= 1;	/* toggle sel tagset */
+-	if (arg->ui & TAGMASK) {
++	if (arg->ui & TAGMASK)
+ 		selmon->tagset[selmon->seltags] = arg->ui & TAGMASK;
+-		selmon->prevtag = selmon->curtag;
+-		if (arg->ui == ~0)
+-			selmon->curtag = 0;
+-		else {
+-			for (i = 0; !(arg->ui & 1 << i); i++);
+-			selmon->curtag = i + 1;
+-		}
+-	} else {
+-		selmon->prevtag = selmon->curtag ^ selmon->prevtag;
+-		selmon->curtag ^= selmon->prevtag;
+-		selmon->prevtag = selmon->curtag ^ selmon->prevtag;
+-	}
+-	selmon->lt[selmon->sellt] = selmon->lts[selmon->curtag];
+-	selmon->mfact = selmon->mfacts[selmon->curtag];
+-	if (selmon->showbar != selmon->showbars[selmon->curtag])
+-		togglebar(NULL);
+ 	arrange();
+ }
+ 
diff -r 61b77b61c3fb -r 4307e8502725 dwm.suckless.org/patches/historical/dwm-uselessgap-5.8.diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwm.suckless.org/patches/historical/dwm-uselessgap-5.8.diff	Mon Sep 12 12:35:44 2011 +0200
_AT_@ -0,0 +1,49 @@
+diff -r 72e52c5333ef config.def.h
+--- a/config.def.h	Wed Nov 25 13:56:17 2009 +0000
++++ b/config.def.h	Thu Mar 11 16:32:24 2010 +0100
+_AT_@ -9,6 +9,7 @@
+ static const char selbgcolor[]      = "#0066ff";
+ static const char selfgcolor[]      = "#ffffff";
+ static const unsigned int borderpx  = 1;        /* border pixel of windows */
++static const unsigned int gappx     = 6;        /* gap pixel between windows */
+ static const unsigned int snap      = 32;       /* snap pixel */
+ static const Bool showbar           = True;     /* False means no bar */
+ static const Bool topbar            = True;     /* False means bottom bar */
+diff -r 72e52c5333ef dwm.c
+--- a/dwm.c	Wed Nov 25 13:56:17 2009 +0000
++++ b/dwm.c	Thu Mar 11 16:32:24 2010 +0100
+_AT_@ -269,6 +269,7 @@
+ static DC dc;
+ static Monitor *mons = NULL, *selmon = NULL;
+ static Window root;
++static int globalborder ;
+ 
+ /* configuration, allows nested code to access above variables */
+ #include "config.h"
+_AT_@ -1299,16 +1300,21 @@
+ resize(Client *c, int x, int y, int w, int h, Bool interact) {
+ 	XWindowChanges wc;
+ 
++	if(c->isfloating || selmon->lt[selmon->sellt]->arrange == NULL) { globalborder = 0 ; }
++	else {
++		if (selmon->lt[selmon->sellt]->arrange == monocle) { globalborder = 0 - borderpx ; }
++		else { globalborder =  gappx ; }
++	}
+ 	if(applysizehints(c, &x, &y, &w, &h, interact)) {
+-		c->x = wc.x = x;
+-		c->y = wc.y = y;
+-		c->w = wc.width = w;
+-		c->h = wc.height = h;
++		c->x = wc.x = x + globalborder;
++		c->y = wc.y = y + globalborder;
++		c->w = wc.width = w - 2 * globalborder ;
++		c->h = wc.height = h - 2 * globalborder ;
+ 		wc.border_width = c->bw;
+ 		XConfigureWindow(dpy, c->win, CWX|CWY|CWWidth|CWHeight|CWBorderWidth, &wc);
+ 		configure(c);
+ 		XSync(dpy, False);
+-	}
++		}
+ }
+ 
+ void
diff -r 61b77b61c3fb -r 4307e8502725 dwm.suckless.org/patches/historical/fancybar-5.6.1.diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwm.suckless.org/patches/historical/fancybar-5.6.1.diff	Mon Sep 12 12:35:44 2011 +0200
_AT_@ -0,0 +1,121 @@
+diff -r e47a47bd3ed4 dwm.c
+--- a/dwm.c	Tue Jul 21 10:57:54 2009 +0100
++++ b/dwm.c	Mon Aug 24 18:28:57 2009 +0200
+_AT_@ -169,6 +169,7 @@
+ static Monitor *dirtomon(int dir);
+ static void drawbar(Monitor *m);
+ static void drawbars(void);
++static void drawvline(unsigned long col[ColLast]);
+ static void drawsquare(Bool filled, Bool empty, Bool invert, unsigned long col[ColLast]);
+ static void drawtext(const char *text, unsigned long col[ColLast], Bool invert);
+ static void enternotify(XEvent *e);
+_AT_@ -648,10 +649,11 @@
+ 
+ void
+ drawbar(Monitor *m) {
+-	int x;
++	int x, ow, mw = 0, extra, tw;
+ 	unsigned int i, n = 0, occ = 0, urg = 0;
+ 	unsigned long *col;
+-	Client *c;
++	Client *c, *firstvis, *lastvis = NULL;
++	DC seldc;
+ 
+ 	for(c = m->clients; c; c = c->next) {
+ 		if(ISVISIBLE(c))
+_AT_@ -689,16 +691,62 @@
+ 	}
+ 	else
+ 		dc.x = m->ww;
+-	if((dc.w = dc.x - x) > bh) {
+-		dc.x = x;
+-		if(m->sel) {
+-			col = m == selmon ? dc.sel : dc.norm;
+-			drawtext(m->sel->name, col, False);
+-			drawsquare(m->sel->isfixed, m->sel->isfloating, False, col);
++
++	for(c = m->clients; c && !ISVISIBLE(c); c = c->next);
++	firstvis = c;
++
++	col = m == selmon ? dc.sel : dc.norm;
++	dc.w = dc.x - x;
++	dc.x = x;
++
++	if(n > 0) {
++		mw = dc.w / n;
++		extra = 0;
++		seldc = dc;
++		i = 0;
++
++		while(c) {
++			lastvis = c;
++			tw = TEXTW(c->name);
++			if(tw < mw) extra += (mw - tw); else i++;
++			for(c = c->next; c && !ISVISIBLE(c); c = c->next);
+ 		}
+-		else
++
++		if(i > 0) mw += extra / i;
++
++		c = firstvis;
++		x = dc.x;
++	}
++
++	while(dc.w > bh) {
++		if(c) {
++			ow = dc.w;
++			tw = TEXTW(c->name);
++			dc.w = MIN(ow, tw);
++
++			if(dc.w > mw) dc.w = mw;
++			if(m->sel == c) seldc = dc;
++			if(c == lastvis) dc.w = ow;
++
++			drawtext(c->name, col, False);
++			if(c != firstvis) drawvline(col);
++			drawsquare(c->isfixed, c->isfloating, False, col);
++
++			dc.x += dc.w;
++			dc.w = ow - dc.w;
++			for(c = c->next; c && !ISVISIBLE(c); c = c->next);
++		} else {
+ 			drawtext(NULL, dc.norm, False);
++			break;
++		}
+ 	}
++
++	if(m == selmon && m->sel && ISVISIBLE(m->sel)) {
++		dc = seldc;
++		drawtext(m->sel->name, col, True);
++		drawsquare(m->sel->isfixed, m->sel->isfloating, True, col);
++	}
++
+ 	XCopyArea(dpy, dc.drawable, m->barwin, dc.gc, 0, 0, m->ww, bh, 0, 0);
+ 	XSync(dpy, False);
+ }
+_AT_@ -709,6 +757,15 @@
+ 
+ 	for(m = mons; m; m = m->next)
+ 		drawbar(m);
++}
++
++void
++drawvline(unsigned long col[ColLast]) {
++	XGCValues gcv;
++
++	gcv.foreground = col[ColFG];
++	XChangeGC(dpy, dc.gc, GCForeground, &gcv);
++	XDrawLine(dpy, dc.drawable, dc.gc, dc.x, dc.y, dc.x, dc.y + (dc.font.ascent + dc.font.descent + 2));
+ }
+ 
+ void
+_AT_@ -1235,8 +1292,7 @@
+ 		}
+ 		if(ev->atom == XA_WM_NAME || ev->atom == netatom[NetWMName]) {
+ 			updatetitle(c);
+-			if(c == selmon->sel)
+-				drawbars();
++			drawbars();
+ 		}
+ 	}
+ }
diff -r 61b77b61c3fb -r 4307e8502725 dwm.suckless.org/patches/historical/flextile-5.8.1.diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwm.suckless.org/patches/historical/flextile-5.8.1.diff	Mon Sep 12 12:35:44 2011 +0200
_AT_@ -0,0 +1,418 @@
+diff -up ../dwm-5.8.1-0/config.def.h ./config.def.h
+--- ../dwm-5.8.1-0/config.def.h	2010-05-29 13:49:12.000000000 +0200
++++ ./config.def.h	2010-05-31 15:18:43.686311000 +0200
+_AT_@ -25,6 +25,11 @@ static const Rule rules[] = {
+ /* layout(s) */
+ static const float mfact      = 0.55; /* factor of master area size [0.05..0.95] */
+ static const Bool resizehints = True; /* True means respect size hints in tiled resizals */
++static const int layoutaxis[] = {
++	1,    /* layout axis: 1 = x, 2 = y; negative values mirror the layout, setting the master area to the right / bottom instead of left / top */
++	2,    /* master axis: 1 = x (from left to right), 2 = y (from top to bottom), 3 = z (monocle) */
++	2,    /* stack axis:  1 = x (from left to right), 2 = y (from top to bottom), 3 = z (monocle) */
++};
+ 
+ static const Layout layouts[] = {
+ 	/* symbol     arrange function */
+_AT_@ -81,6 +86,12 @@ static Key keys[] = {
+ 	TAGKEYS(                        XK_8,                      7)
+ 	TAGKEYS(                        XK_9,                      8)
+ 	{ MODKEY|ShiftMask,             XK_q,      quit,           {0} },
++	{ MODKEY|ControlMask,           XK_t,      rotatelayoutaxis, {.i = 0} },    /* 0 = layout axis */
++	{ MODKEY|ControlMask,           XK_Tab,    rotatelayoutaxis, {.i = 1} },    /* 1 = master axis */
++	{ MODKEY|ControlMask|ShiftMask, XK_Tab,    rotatelayoutaxis, {.i = 2} },    /* 2 = stack axis */
++	{ MODKEY|ControlMask,           XK_Return, mirrorlayout,     {0} },
++	{ MODKEY|ControlMask,           XK_j,      shiftmastersplit, {.i = -1} },   /* reduce the number of tiled clients in the master area */
++	{ MODKEY|ControlMask,           XK_k,      shiftmastersplit, {.i = +1} },   /* increase the number of tiled clients in the master area */
+ };
+ 
+ /* button definitions */
+diff -up ../dwm-5.8.1-0/dwm.c ./dwm.c
+--- ../dwm-5.8.1-0/dwm.c	2010-05-29 13:49:12.000000000 +0200
++++ ./dwm.c	2010-05-31 16:02:14.553316000 +0200
+_AT_@ -120,26 +120,6 @@ typedef struct {
+ 	void (*arrange)(Monitor *);
+ } Layout;
+ 
+-struct Monitor {
+-	char ltsymbol[16];
+-	float mfact;
+-	int num;
+-	int by;               /* bar geometry */
+-	int mx, my, mw, mh;   /* screen size */
+-	int wx, wy, ww, wh;   /* window area  */
+-	unsigned int seltags;
+-	unsigned int sellt;
+-	unsigned int tagset[2];
+-	Bool showbar;
+-	Bool topbar;
+-	Client *clients;
+-	Client *sel;
+-	Client *stack;
+-	Monitor *next;
+-	Window barwin;
+-	const Layout *lt[2];
+-};
+-
+ typedef struct {
+ 	const char *class;
+ 	const char *instance;
+_AT_@ -193,6 +173,7 @@ static void killclient(const Arg *arg);
+ static void manage(Window w, XWindowAttributes *wa);
+ static void mappingnotify(XEvent *e);
+ static void maprequest(XEvent *e);
++static void mirrorlayout(const Arg *arg);
+ static void monocle(Monitor *m);
+ static void movemouse(const Arg *arg);
+ static Client *nexttiled(Client *c);
+_AT_@ -202,6 +183,7 @@ static void quit(const Arg *arg);
+ static void resize(Client *c, int x, int y, int w, int h, Bool interact);
+ static void resizemouse(const Arg *arg);
+ static void restack(Monitor *m);
++static void rotatelayoutaxis(const Arg *arg);
+ static void run(void);
+ static void scan(void);
+ static void sendmon(Client *c, Monitor *m);
+_AT_@ -209,6 +191,7 @@ static void setclientstate(Client *c, lo
+ static void setlayout(const Arg *arg);
+ static void setmfact(const Arg *arg);
+ static void setup(void);
++static void shiftmastersplit(const Arg *arg);
+ static void showhide(Client *c);
+ static void sigchld(int unused);
+ static void spawn(const Arg *arg);
+_AT_@ -275,6 +258,34 @@ static Window root;
+ 
+ /* compile-time check if all tags fit into an unsigned int bit array. */
+ struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; };
++struct Monitor {
++	char ltsymbol[16];
++	float mfact;
++	double mfacts[LENGTH(tags) + 1];
++	int ltaxis[3];
++	int ltaxes[LENGTH(tags) + 1][3];
++	int num;
++	int curtag;
++	int prevtag;
++	int by;               /* bar geometry */
++	int mx, my, mw, mh;   /* screen size */
++	int wx, wy, ww, wh;   /* window area  */
++	unsigned int msplit;
++	unsigned int msplits[LENGTH(tags) + 1];
++	unsigned int seltags;
++	unsigned int sellt;
++	unsigned int tagset[2];
++	Bool showbar;
++	Bool showbars[LENGTH(tags) + 1];
++	Bool topbar;
++	Client *clients;
++	Client *sel;
++	Client *stack;
++	Monitor *next;
++	Window barwin;
++	const Layout *lt[2];
++	const Layout *lts[LENGTH(tags) + 1];
++};
+ 
+ /* function implementations */
+ void
+_AT_@ -616,6 +627,10 @@ createmon(void) {
+ 	m->lt[0] = &layouts[0];
+ 	m->lt[1] = &layouts[1 % LENGTH(layouts)];
+ 	strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol);
++	m->ltaxis[0] = layoutaxis[0];
++	m->ltaxis[1] = layoutaxis[1];
++	m->ltaxis[2] = layoutaxis[2];
++	m->msplit = 1;
+ 	return m;
+ }
+ 
+_AT_@ -1173,6 +1188,15 @@ maprequest(XEvent *e) {
+ }
+ 
+ void
++mirrorlayout(const Arg *arg) {
++	if(!selmon->lt[selmon->sellt]->arrange)
++		return;
++	selmon->ltaxis[0] *= -1;
++	selmon->ltaxes[selmon->curtag][0] = selmon->ltaxis[0];
++	arrange(selmon);
++}
++
++void
+ monocle(Monitor *m) {
+ 	unsigned int n = 0;
+ 	Client *c;
+_AT_@ -1387,6 +1411,21 @@ restack(Monitor *m) {
+ }
+ 
+ void
++rotatelayoutaxis(const Arg *arg) {
++	if(!selmon->lt[selmon->sellt]->arrange)
++		return;
++	if(arg->i == 0) {
++		if(selmon->ltaxis[0] > 0)
++			selmon->ltaxis[0] = selmon->ltaxis[0] + 1 > 2 ? 1 : selmon->ltaxis[0] + 1;
++		else
++			selmon->ltaxis[0] = selmon->ltaxis[0] - 1 < -2 ? -1 : selmon->ltaxis[0] - 1;
++	} else
++		selmon->ltaxis[arg->i] = selmon->ltaxis[arg->i] + 1 > 3 ? 1 : selmon->ltaxis[arg->i] + 1;
++	selmon->ltaxes[selmon->curtag][arg->i] = selmon->ltaxis[arg->i];
++	arrange(selmon);
++}
++
++void
+ run(void) {
+ 	XEvent ev;
+ 	/* main event loop */
+_AT_@ -1451,7 +1490,7 @@ setlayout(const Arg *arg) {
+ 	if(!arg || !arg->v || arg->v != selmon->lt[selmon->sellt])
+ 		selmon->sellt ^= 1;
+ 	if(arg && arg->v)
+-		selmon->lt[selmon->sellt] = (Layout *)arg->v;
++		selmon->lt[selmon->sellt] = selmon->lts[selmon->curtag] = (Layout *)arg->v;
+ 	strncpy(selmon->ltsymbol, selmon->lt[selmon->sellt]->symbol, sizeof selmon->ltsymbol);
+ 	if(selmon->sel)
+ 		arrange(selmon);
+_AT_@ -1469,14 +1508,16 @@ setmfact(const Arg *arg) {
+ 	f = arg->f < 1.0 ? arg->f + selmon->mfact : arg->f - 1.0;
+ 	if(f < 0.1 || f > 0.9)
+ 		return;
+-	selmon->mfact = f;
++	selmon->mfact = selmon->mfacts[selmon->curtag] = f;
+ 	arrange(selmon);
+ }
+ 
+ void
+ setup(void) {
+ 	XSetWindowAttributes wa;
+-
++	Monitor *m;
++	unsigned int i;
++ 
+ 	/* clean up any zombies immediately */
+ 	sigchld(0);
+ 
+_AT_@ -1511,7 +1552,19 @@ setup(void) {
+ 	XSetLineAttributes(dpy, dc.gc, 1, LineSolid, CapButt, JoinMiter);
+ 	if(!dc.font.set)
+ 		XSetFont(dpy, dc.gc, dc.font.xfont->fid);
+-	/* init bars */
++	/* init tags, bars, layouts, axes, msplits and mfacts */
++	for(m = mons; m; m = m->next) {
++		m->curtag = m->prevtag = 1;
++		for(i=0; i < LENGTH(tags) + 1; i++) {
++			m->showbars[i] = m->showbar;
++			m->lts[i] = &layouts[0];
++			m->mfacts[i] = m->mfact;
++			m->ltaxes[i][0] = m->ltaxis[0];
++			m->ltaxes[i][1] = m->ltaxis[1];
++			m->ltaxes[i][2] = m->ltaxis[2];
++			m->msplits[i] = m->msplit;
++		}
++	}
+ 	updatebars();
+ 	updatestatus();
+ 	/* EWMH support per view */
+_AT_@ -1528,6 +1581,19 @@ setup(void) {
+ }
+ 
+ void
++shiftmastersplit(const Arg *arg) {
++	unsigned int n;
++	Client *c;
++
++	for(n = 0, c = nexttiled(selmon->clients); c; c = nexttiled(c->next), n++);
++	if(!arg || !selmon->lt[selmon->sellt]->arrange || selmon->msplit + arg->i < 1 || selmon->msplit + arg->i > n)
++		return;
++	selmon->msplit += arg->i;
++	selmon->msplits[selmon->curtag] = selmon->msplit;
++	arrange(selmon);
++}
++
++void
+ showhide(Client *c) {
+ 	if(!c)
+ 		return;
+_AT_@ -1592,37 +1658,95 @@ textnw(const char *text, unsigned int le
+ 
+ void
+ tile(Monitor *m) {
+-	int x, y, h, w, mw;
+-	unsigned int i, n;
++	char sym1 = 61, sym2 = 93, sym3 = 61, sym;
++	int x1 = m->wx, y1 = m->wy, h1 = m->wh, w1 = m->ww, X1 = x1 + w1, Y1 = y1 + h1;
++	int x2 = m->wx, y2 = m->wy, h2 = m->wh, w2 = m->ww, X2 = x2 + w2, Y2 = y2 + h2;
++	unsigned int i, n, n1, n2;
+ 	Client *c;
+ 
+ 	for(n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++);
++	if(m->msplit > n)
++		m->msplit = (n == 0) ? 1 : n;
++	if(n == 0 && m->ltaxis[1] != 3)
++		return;
++	/* layout symbol */
++	if(abs(m->ltaxis[0]) == m->ltaxis[1])    /* explicitly: ((abs(m->ltaxis[0]) == 1 && m->ltaxis[1] == 1) || (abs(m->ltaxis[0]) == 2 && m->ltaxis[1] == 2)) */
++		sym1 = 124;
++	if(abs(m->ltaxis[0]) == m->ltaxis[2])
++		sym3 = 124;
++	if(m->ltaxis[1] == 3)
++		sym1 = (n == 0) ? 0 : m->msplit;
++	if(m->ltaxis[2] == 3)
++		sym3 = (n == 0) ? 0 : n - m->msplit;
++	if(m->ltaxis[0] < 0) {
++		sym = sym1;
++		sym1 = sym3;
++		sym2 = 91;
++		sym3 = sym;
++	}
++	if(m->msplit == 1) {
++		if(m->ltaxis[0] > 0)
++			sym1 = 91;
++		else
++			sym3 = 93;
++	}
++	if(m->msplit > 1 && m->ltaxis[1] == 3 && m->ltaxis[2] == 3)
++		snprintf(m->ltsymbol, sizeof m->ltsymbol, "%d%c%d", sym1, sym2, sym3);
++	else if((m->msplit > 1 && m->ltaxis[1] == 3 && m->ltaxis[0] > 0) || (m->ltaxis[2] == 3 && m->ltaxis[0] < 0))
++		snprintf(m->ltsymbol, sizeof m->ltsymbol, "%d%c%c", sym1, sym2, sym3);
++	else if((m->ltaxis[2] == 3 && m->ltaxis[0] > 0) || (m->msplit > 1 && m->ltaxis[1] == 3 && m->ltaxis[0] < 0))
++		snprintf(m->ltsymbol, sizeof m->ltsymbol, "%c%c%d", sym1, sym2, sym3);
++	else
++		snprintf(m->ltsymbol, sizeof m->ltsymbol, "%c%c%c", sym1, sym2, sym3);
+ 	if(n == 0)
+ 		return;
++	/* master and stack area */
++	if(abs(m->ltaxis[0]) == 1 && n > m->msplit) {
++		w1 *= m->mfact;
++		w2 -= w1;
++		x1 += (m->ltaxis[0] < 0) ? w2 : 0;
++		x2 += (m->ltaxis[0] < 0) ? 0 : w1;
++		X1 = x1 + w1;
++		X2 = x2 + w2;
++	} else if(abs(m->ltaxis[0]) == 2 && n > m->msplit) {
++		h1 *= m->mfact;
++		h2 -= h1;
++		y1 += (m->ltaxis[0] < 0) ? h2 : 0;
++		y2 += (m->ltaxis[0] < 0) ? 0 : h1;
++		Y1 = y1 + h1;
++		Y2 = y2 + h2;
++	}
+ 	/* master */
+-	c = nexttiled(m->clients);
+-	mw = m->mfact * m->ww;
+-	resize(c, m->wx, m->wy, (n == 1 ? m->ww : mw) - 2 * c->bw, m->wh - 2 * c->bw, False);
+-	if(--n == 0)
+-		return;
+-	/* tile stack */
+-	x = (m->wx + mw > c->x + c->w) ? c->x + c->w + 2 * c->bw : m->wx + mw;
+-	y = m->wy;
+-	w = (m->wx + mw > c->x + c->w) ? m->wx + m->ww - x : m->ww - mw;
+-	h = m->wh / n;
+-	if(h < bh)
+-		h = m->wh;
+-	for(i = 0, c = nexttiled(c->next); c; c = nexttiled(c->next), i++) {
+-		resize(c, x, y, w - 2 * c->bw, /* remainder */ ((i + 1 == n)
+-		       ? m->wy + m->wh - y - 2 * c->bw : h - 2 * c->bw), False);
+-		if(h != m->wh)
+-			y = c->y + HEIGHT(c);
++	n1 = (m->ltaxis[1] != 1 || w1 / m->msplit < bh) ? 1 : m->msplit;
++	n2 = (m->ltaxis[1] != 2 || h1 / m->msplit < bh) ? 1 : m->msplit;
++	for(i = 0, c = nexttiled(m->clients); i < m->msplit; c = nexttiled(c->next), i++) {
++		resize(c, x1, y1, 
++			(m->ltaxis[1] == 1 && i + 1 == m->msplit) ? X1 - x1 - 2 * c->bw : w1 / n1 - 2 * c->bw, 
++			(m->ltaxis[1] == 2 && i + 1 == m->msplit) ? Y1 - y1 - 2 * c->bw : h1 / n2 - 2 * c->bw, False);
++		if(n1 > 1)
++			x1 = c->x + WIDTH(c);
++		if(n2 > 1)
++			y1 = c->y + HEIGHT(c);
++	}
++	/* stack */
++	if(n > m->msplit) {
++		n1 = (m->ltaxis[2] != 1 || w2 / (n - m->msplit) < bh) ? 1 : n - m->msplit;
++		n2 = (m->ltaxis[2] != 2 || h2 / (n - m->msplit) < bh) ? 1 : n - m->msplit;
++		for(i = 0; c; c = nexttiled(c->next), i++) {
++			resize(c, x2, y2, 
++				(m->ltaxis[2] == 1 && i + 1 == n - m->msplit) ? X2 - x2 - 2 * c->bw : w2 / n1 - 2 * c->bw, 
++				(m->ltaxis[2] == 2 && i + 1 == n - m->msplit) ? Y2 - y2 - 2 * c->bw : h2 / n2 - 2 * c->bw, False);
++			if(n1 > 1)
++				x2 = c->x + WIDTH(c);
++			if(n2 > 1)
++				y2 = c->y + HEIGHT(c);
++		}
+ 	}
+ }
+ 
+ void
+ togglebar(const Arg *arg) {
+-	selmon->showbar = !selmon->showbar;
++	selmon->showbar = selmon->showbars[selmon->curtag] = !selmon->showbar;
+ 	updatebarpos(selmon);
+ 	XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh);
+ 	arrange(selmon);
+_AT_@ -1642,12 +1766,31 @@ togglefloating(const Arg *arg) {
+ void
+ toggletag(const Arg *arg) {
+ 	unsigned int newtags;
++	unsigned int i;
+ 
+ 	if(!selmon->sel)
+ 		return;
+ 	newtags = selmon->sel->tags ^ (arg->ui & TAGMASK);
+ 	if(newtags) {
+ 		selmon->sel->tags = newtags;
++		if(newtags == ~0) {
++			selmon->prevtag = selmon->curtag;
++			selmon->curtag = 0;
++		}
++		if(!(newtags & 1 << (selmon->curtag - 1))) {
++			selmon->prevtag = selmon->curtag;
++			for (i=0; !(newtags & 1 << i); i++);
++			selmon->curtag = i + 1;
++		}
++		selmon->sel->tags = newtags;
++		selmon->lt[selmon->sellt] = selmon->lts[selmon->curtag];
++		selmon->mfact = selmon->mfacts[selmon->curtag];
++		if (selmon->showbar != selmon->showbars[selmon->curtag])
++			togglebar(NULL);
++		selmon->ltaxis[0] = selmon->ltaxes[selmon->curtag][0];
++		selmon->ltaxis[1] = selmon->ltaxes[selmon->curtag][1];
++		selmon->ltaxis[2] = selmon->ltaxes[selmon->curtag][2];
++		selmon->msplit = selmon->msplits[selmon->curtag];
+ 		arrange(selmon);
+ 	}
+ }
+_AT_@ -1914,11 +2057,33 @@ updatewmhints(Client *c) {
+ 
+ void
+ view(const Arg *arg) {
++	unsigned int i;
++
+ 	if((arg->ui & TAGMASK) == selmon->tagset[selmon->seltags])
+ 		return;
+ 	selmon->seltags ^= 1; /* toggle sel tagset */
+-	if(arg->ui & TAGMASK)
++	if(arg->ui & TAGMASK) {
+ 		selmon->tagset[selmon->seltags] = arg->ui & TAGMASK;
++		selmon->prevtag = selmon->curtag;
++		if(arg->ui == ~0)
++			selmon->curtag = 0;
++		else {
++			for (i=0; !(arg->ui & 1 << i); i++);
++			selmon->curtag = i + 1;
++		}
++	} else {
++		selmon->prevtag = selmon->curtag ^ selmon->prevtag;
++		selmon->curtag ^= selmon->prevtag;
++		selmon->prevtag = selmon->curtag ^ selmon->prevtag;
++	}
++	selmon->lt[selmon->sellt] = selmon->lts[selmon->curtag];
++	selmon->mfact = selmon->mfacts[selmon->curtag];
++	if(selmon->showbar != selmon->showbars[selmon->curtag])
++		togglebar(NULL);
++	selmon->ltaxis[0] = selmon->ltaxes[selmon->curtag][0];
++	selmon->ltaxis[1] = selmon->ltaxes[selmon->curtag][1];
++	selmon->ltaxis[2] = selmon->ltaxes[selmon->curtag][2];
++	selmon->msplit = selmon->msplits[selmon->curtag];
+ 	arrange(selmon);
+ }
+ 
diff -r 61b77b61c3fb -r 4307e8502725 dwm.suckless.org/patches/historical/gapless_grid.md
--- a/dwm.suckless.org/patches/historical/gapless_grid.md	Mon Sep 12 10:45:45 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
_AT_@ -1,34 +0,0 @@
-# GAPLESS GRID LAYOUT #
-
-## Description ##
-
-This patch is similar to [gridmode][1] (in fact it is an altered version) in that it provides a layout for dwm, which arranges the windows in a grid. Though instead of using a regular grid, which in case leaves empty cells (e. g. with 3 windows there are 4 cells, one cell is empty), it uses the same number of columns, but adjusts the number of rows (at first x rows and (x+1) rows, when needed) leaving no empty cells.
-
-
-## Usage ##
-
-Download the patch and apply it according to the [general instructions](.). The patch will make the following changes:
-
- - gaplessgrid.c: adding the file
- - config.def.h: adding the include-line for 'gaplessgrid.c'
- - config.def.h: adding the layout '"###", gaplessgrid'
-
-Comment: There may be problems applying the patch, if another layout has been added before.
-
-
-## Configuration ##
-
- * Transfer the changes made by the patch in 'config.def.h' to 'config.h', if needed.
- * Add a key definition like '{ MODKEY, XK_g, setlayout, {.v = &layouts[3]} },'.
-
-
-## Download ##
-
- * [dwm-5.2-gaplessgrid.diff][2] (1.9k) (20081020)
- * [dwm-r1437-gaplessgrid.diff][3] (1.9k) (20090704)
-
-
-[1]: /dwm/patches/gridmode.html
-[2]: http://dwm.suckless.org/patches/dwm-5.2-gaplessgrid.diff
-[3]: http://dwm.suckless.org/patches/dwm-r1437-gaplessgrid.diff
-
diff -r 61b77b61c3fb -r 4307e8502725 dwm.suckless.org/patches/historical/index.md
--- a/dwm.suckless.org/patches/historical/index.md	Mon Sep 12 10:45:45 2011 +0100
+++ b/dwm.suckless.org/patches/historical/index.md	Mon Sep 12 12:35:44 2011 +0200
_AT_@ -1,10 +1,17 @@
-This section contains patches for old versions of dwm.
+This section contains patches for old versions of dwm, which have not yet been
+ported to less newer versions.
 
 old offsite patches
 -------------------
-* [dwm-meillo](http://prog.marmaro.de/dwm-meillo/)
+* [dwm-meillo](http://marmaro.de/prog/dwm-meillo/)
 * [dwm-mitch](http://www.cgarbs.de/dwm-mitch.en.html)
 * [fnegronidwm](http://sharesource.org/project/fnegronidwm/wiki/)
+* [dwm-gtx](http://s01.de/~tox/hg/dwm/) - Gottox' old dwm fork from earlier days
 * [patches written by InfinityX](http://flash.metawaredesign.co.uk/4/)
 * [display date](http://henry.precheur.org/2009/5/20/dwm%2C_display_date_patch_updated.html)
 * [DWM-Hacked](http://sourceforge.net/projects/dwm-hacked/)
+
+more unofficial patches
+-----------------------
+
+* Take a look at [bitbucket](https://bitbucket.org/repo/all/followers?name=dwm) to see who else has forked dwm and abandoned their fork, so it fits in this historical section!
diff -r 61b77b61c3fb -r 4307e8502725 dwm.suckless.org/patches/pertag.md
--- a/dwm.suckless.org/patches/pertag.md	Mon Sep 12 10:45:45 2011 +0100
+++ b/dwm.suckless.org/patches/pertag.md	Mon Sep 12 12:35:44 2011 +0200
_AT_@ -34,7 +34,7 @@
 [5]: http://v4hn.de/patches/dwm-5.1-pertag.diff
 [6]: historical/dwm-5.2-pertag.diff
 [7]: historical/dwm-5.4-pertag.diff
-[8]: dwm-pertag-5.6.1.diff
-[9]: dwm-5.7.2-pertag.diff
+[8]: historical/dwm-pertag-5.6.1.diff
+[9]: historical/dwm-5.7.2-pertag.diff
 [10]: dwm-5.8.2-pertag.diff
 [11]: dwm-5.8.2-pertag_without_bar.diff
diff -r 61b77b61c3fb -r 4307e8502725 dwm.suckless.org/patches/statuscolors.md
--- a/dwm.suckless.org/patches/statuscolors.md	Mon Sep 12 10:45:45 2011 +0100
+++ b/dwm.suckless.org/patches/statuscolors.md	Mon Sep 12 12:35:44 2011 +0200
_AT_@ -56,6 +56,6 @@
 
 ## Download ##
 
- * [dwm-5.7.2-statuscolors.diff](dwm-5.7.2-statuscolors.diff)
- * [dwm-5.8.2-statuscolors.diff](dwm-5.8.2-statuscolors.diff)
+ * [dwm-5.7.2-statuscolors.diff](historical/dwm-5.7.2-statuscolors.diff)
+ * [dwm-5.8.2-statuscolors.diff](historical/dwm-5.8.2-statuscolors.diff)
  * [dwm-5.9-statuscolors.diff](dwm-5.9-statuscolors.diff)
diff -r 61b77b61c3fb -r 4307e8502725 dwm.suckless.org/patches/uselessgap.md
--- a/dwm.suckless.org/patches/uselessgap.md	Mon Sep 12 10:45:45 2011 +0100
+++ b/dwm.suckless.org/patches/uselessgap.md	Mon Sep 12 12:35:44 2011 +0200
_AT_@ -33,15 +33,15 @@
 
 ## Download
 
- * [dwm-5.9-uselessgap.diff](dwm-5.9-uselessgap.diff) (0.7K) (20110107 updated. Thanks Jordan for your bug report)
+ * [dwm-5.9-uselessgap.diff](dwm-5.9-uselessgap.diff) (1.8k) (20110107 updated. Thanks Jordan for your bug report)
    
 	Update to use the new resizeclient() function instead of resize()
  
- * [dwm-uselessgap-5.8.diff](dwm-uselessgap-5.8.diff) (0.7K) (20100225 updated. Thanks Guillaume for your bug report)
+ * [dwm-uselessgap-5.8.diff](historical/dwm-uselessgap-5.8.diff) (1.7k) (20100225 updated. Thanks Guillaume for your bug report)
    
 	Fix floating clients bug and remove all borders in monocle mode.
  
- * [dwm-gap-5.7.2.diff](dwm-gap-5.7.2.diff) (0.7K) (20091215)
+ * [dwm-gap-5.7.2.diff](historical/dwm-gap-5.7.2.diff) (0.7k) (20091215)
 
 ## Author
 
diff -r 61b77b61c3fb -r 4307e8502725 dwm.suckless.org/patches/warp.md
--- a/dwm.suckless.org/patches/warp.md	Mon Sep 12 10:45:45 2011 +0100
+++ b/dwm.suckless.org/patches/warp.md	Mon Sep 12 12:35:44 2011 +0200
_AT_@ -21,4 +21,4 @@
 Contributor
 -----------
 
-* Moritz Wilhelmy (n0nsense) `<`moritz plus dwm at wzff dot de`>`
+* Moritz Wilhelmy (n0nsense) `<`moritz plus dwm at wzff dot de`>` - did the port to newer dwm
Received on Mon Sep 12 2011 - 12:33:34 CEST

This archive was generated by hypermail 2.3.0 : Thu Sep 13 2012 - 19:31:50 CEST