--- ../src/dwm-5.0.1/dwm.c	2008-06-19 10:11:38.000000000 +0200
+++ dwm.c	2008-07-02 13:02:36.000000000 +0200
@@ -54,6 +54,11 @@
 #define TAGMASK         ((int)((1LL << LENGTH(tags)) - 1))
 #define TEXTW(x)        (textnw(x, strlen(x)) + dc.font.height)
 
+/* wmii patch */
+#define WMIITAG         sizeof(int) * 8
+#define WMIICOL         10
+#define WMIIROW         10
+
 /* enums */
 enum { CurNormal, CurResize, CurMove, CurLast };        /* cursor */
 enum { ColBorder, ColFG, ColBG, ColLast };              /* color */
@@ -93,6 +98,13 @@
 	Client *next;
 	Client *snext;
 	Window win;
+
+	/* wmii patch */
+	int wcol[WMIITAG];
+	int wrow[WMIITAG];
+	int ww[WMIITAG];
+	int wh[WMIITAG];
+
 };
 
 typedef struct {
@@ -203,6 +215,20 @@
 static int xerrorstart(Display *dpy, XErrorEvent *ee);
 static void zoom(const Arg *arg);
 
+/* wmii patch */
+static void wappend(int,Client*,int);
+static void wnohole(int);
+static void wremove(int,Client*);
+static int wgettag(void);
+static void wmovenext(const Arg*);
+static void wmoveprev(const Arg*);
+static void wmoveup(const Arg*);
+static void wmovedown(const Arg*);
+static void warrange(int);
+static void wadd(int,Client*);
+static void wresize(int,Client*,int,int);
+static void wlayout(void);
+
 /* variables */
 static char stext[256];
 static int screen, sx, sy, sw, sh;
@@ -237,6 +263,11 @@
 static DC dc = {0};
 static Layout *lt = NULL;
 static Window root, barwin;
+
+/* wmii patch */
+Client* wtable[WMIITAG][WMIICOL][WMIIROW] = {{{ 0 }}};
+static int wresizing = 0;
+
 /* configuration, allows nested code to access above variables */
 #include "config.h"
 
@@ -896,6 +927,16 @@
 		eprint("fatal: could not calloc() %u bytes\n", sizeof(Client));
 	c->win = w;
 
+	/* wmii patch */
+	int i = 0;
+	for( ; i < WMIITAG ; i++ )
+	{
+		c->wcol[i] = -1;
+		c->wrow[i] = -1;
+		c->ww[i] = -1;
+		c->wh[i] = -1;
+	}
+
 	/* geometry */
 	c->x = wa->x;
 	c->y = wa->y;
@@ -1141,6 +1182,10 @@
 	restack();
 	ocx = c->x;
 	ocy = c->y;
+
+	/* wmii patch */
+	if ( !strcmp(lt->symbol,"WMII") && !c->isfloating ) { wresizing = 1; }
+
 	if(XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync,
 	None, cursor[CurResize], CurrentTime) != GrabSuccess)
 		return;
@@ -1153,6 +1198,10 @@
 					c->w + c->bw - 1, c->h + c->bw - 1);
 			XUngrabPointer(dpy, CurrentTime);
 			while(XCheckMaskEvent(dpy, EnterWindowMask, &ev));
+
+			/* wmii patch */
+			if ( wresizing ) { c->isfloating = False; wresizing = 0; wresize(wgettag(),c,c->w,c->h); }
+
 			return;
 		case ConfigureRequest:
 		case Expose:
@@ -1518,6 +1567,17 @@
 unmanage(Client *c) {
 	XWindowChanges wc;
 
+	/* wmii patch */
+	int i = 0;
+	for( ; i < WMIITAG ; i++ )
+	{
+		if ( (c->ww[i] != -1) || (c->wh[i] != -1) )
+		{
+			wremove(i,c);
+			wnohole(i);
+		}
+	}
+
 	wc.border_width = c->oldbw;
 	/* The server grab construct avoids race conditions. */
 	XGrabServer(dpy);
@@ -1724,3 +1784,206 @@
 	XCloseDisplay(dpy);
 	return 0;
 }
+
+/* wmii patch */
+void wappend(int wtag,Client* client,int col)
+{
+	int i = 0;
+	for( ; (i < WMIIROW) && wtable[wtag][col][i] ; i++ );
+	if ( i == WMIIROW) { return; }
+	wtable[wtag][col][i] = client;
+	client->wcol[wtag] = col;
+	client->wrow[wtag] = i;
+	client->wh[wtag] = -1;
+	client->ww[wtag] = -1;
+}
+
+void wnohole(int wtag)
+{
+	int i = 0,ni = 0;
+	for( ; i < WMIICOL ; i++ )
+	{
+		int j = 0,nj = 0;
+		for( ; j < WMIIROW ; j++ )
+		{
+			if ( wtable[wtag][i][j] )
+			{
+				wtable[wtag][ni][nj] = wtable[wtag][i][j];
+				wtable[wtag][ni][nj]->wcol[wtag] = ni;
+				wtable[wtag][ni][nj]->wrow[wtag] = nj;
+				if ( (i != ni) || (j != nj) ) { wtable[wtag][i][j] = 0; }
+				nj++;
+			}
+		}
+		if ( nj > 0 ) { ni++; }
+	}
+}
+
+void wremove(int wtag,Client* client)
+{
+	if ( (client->wcol[wtag] == -1) && (client->wrow[wtag] == -1) ) { return; }
+	wtable[wtag][client->wcol[wtag]][client->wrow[wtag]] = 0;
+	client->wcol[wtag] = -1;
+	client->wrow[wtag] = -1;
+	client->wh[wtag] = -1;
+	client->ww[wtag] = -1;
+}
+
+int wgettag(void)
+{
+	int i = 0;
+	for( ; (i <= sizeof(int)) && !(tagset[seltags] & (1 << i)) ; i++ );
+	return i;
+}
+
+void wmovenext(const Arg* arg)
+{
+	int wtag = wgettag();
+	if ( !sel || sel->isfloating || (sel->wcol[wtag] == WMIICOL - 1) ) { return; }
+	int col = sel->wcol[wtag];
+	wremove(wtag,sel);
+	wappend(wtag,sel,col + 1);
+	wnohole(wtag);
+	warrange(wtag);
+}
+
+void wmoveprev(const Arg* arg)
+{
+	int wtag = wgettag();
+	if ( !sel || sel->isfloating || (sel->wcol[wtag] == 0) ) { return; }
+	int col = sel->wcol[wtag];
+	wremove(wtag,sel);
+	wappend(wtag,sel,col - 1);
+	wnohole(wtag);
+	warrange(wtag);
+}
+
+void wmoveup(const Arg* arg)
+{
+	int wtag = wgettag();
+	if ( !sel || sel->isfloating || (sel->wrow[wtag] == 0) ) { return; }
+	int row = sel->wrow[wtag];
+	Client* p = wtable[wtag][sel->wcol[wtag]][row - 1];
+	wtable[wtag][sel->wcol[wtag]][row] = p;
+	wtable[wtag][sel->wcol[wtag]][row - 1] = sel;
+	p->wrow[wtag]++;
+	sel->wrow[wtag]--;
+	warrange(wtag);
+}
+
+void wmovedown(const Arg* arg)
+{
+	int wtag = wgettag();
+	if ( !sel || sel->isfloating || (sel->wrow[wtag] == WMIIROW - 1)  || 
+			(wtable[wtag][sel->wcol[wtag]][sel->wrow[wtag] + 1] == 0) ) { return; }
+	int row = sel->wrow[wtag];
+	Client* n = wtable[wtag][sel->wcol[wtag]][row + 1];
+	wtable[wtag][sel->wcol[wtag]][row] = n;
+	wtable[wtag][sel->wcol[wtag]][row + 1] = sel;
+	n->wrow[wtag]--;
+	sel->wrow[wtag]++;
+	warrange(wtag);
+}
+
+void warrange(int wtag)
+{
+	if ( strcmp(lt->symbol,"WMII") ) { return; }
+	int total = 0,old = 0,max = 0;
+	int i = 0;
+	for( ; (i < WMIICOL) && wtable[wtag][i][0] ; i++ )
+	{
+		total++;
+		int w = wtable[wtag][i][0]->ww[wtag];
+		if ( w != -1 ) { old++; max += w; }
+	}
+	for( i = 0 ; (i < WMIICOL) && wtable[wtag][i][0] ; i++ )
+	{
+		int w = wtable[wtag][i][0]->ww[wtag];
+		if ( w != -1 ) { w = w * old * ww / total / max; }
+		else { w = ww / total; }
+		int j = 0;
+		for( ; (j < WMIIROW) && wtable[wtag][i][j] ; j++ ) { wtable[wtag][i][j]->ww[wtag] = w; }
+	}
+	for( i = 0 ; (i < WMIICOL) && wtable[wtag][i][0] ; i++ )
+	{
+		total = 0;
+		old = 0;
+		max = 0;
+		int j = 0;
+		for( ; (j < WMIIROW) && wtable[wtag][i][j] ; j++ )
+		{
+			total++;
+			int h = wtable[wtag][i][j]->wh[wtag];
+			if ( h != -1 ) { old++; max += h; }
+		}
+		for( j = 0 ; (j < WMIIROW) && wtable[wtag][i][j] ; j++ )
+		{
+			int h = wtable[wtag][i][j]->wh[wtag];
+			if ( h != -1 ) { h = h * old * wh / total / max; }
+			else { h = wh / total; }
+			wtable[wtag][i][j]->wh[wtag] = h;
+		}
+	}
+	int x = wx;
+	for( i = 0 ; (i < WMIICOL) && wtable[wtag][i][0] ; i++ )
+	{
+		int j = 0,y = wy;
+		for( ; (j < WMIIROW) && wtable[wtag][i][j] ; j++ )
+		{
+			Client* t = wtable[wtag][i][j];
+			resize(t,x + t->bw,y + t->bw,t->ww[wtag] - 2 * t->bw,t->wh[wtag] - 2 * t->bw,resizehints);
+			y += wtable[wtag][i][j]->wh[wtag];
+		}
+		x += wtable[wtag][i][0]->ww[wtag];
+	}
+}
+
+void wadd(int wtag,Client* client)
+{
+	int i = 0;
+	for( ; (i < WMIICOL - 1) && wtable[wtag][i + 1][0] ; i++ );
+	wappend(wtag,client,i + ( i == 0 && wtable[wtag][0][0] ? 1  : 0 ));
+}
+
+void wresize(int wtag,Client* client,int w,int h)
+{
+	int i = 0,old = 0,oldw = client->ww[wtag],oldh = client->wh[wtag];
+	client->ww[wtag] = w; client->wh[wtag] = h;
+	for( ; i < client->wcol[wtag] ; i++) { old += wtable[wtag][i][0]->ww[wtag]; }
+	i = client->wcol[wtag] + 1;
+	for( ; (i < WMIICOL) && wtable[wtag][i][0] ; i++ )
+	{
+		wtable[wtag][i][0]->ww[wtag] = wtable[wtag][i][0]->ww[wtag] * (sw - old - w)  / (sw - old - oldw);
+	}
+	int j = 0;
+	i = client->wcol[wtag];
+	old = 0;
+	for( ; j < client->wrow[wtag] ; j++ ) { old += wtable[wtag][i][j]->wh[wtag]; }
+	j = client->wrow[wtag] + 1;
+	for( ; (j < WMIIROW) && wtable[wtag][i][j] ; j++ )
+	{
+		wtable[wtag][i][j]->wh[wtag] = wtable[wtag][i][j]->wh[wtag] * (sh - bh - old - h) / (sh - bh - old - oldh);
+	}
+	warrange(wtag);
+}
+
+void wlayout(void)
+{
+	if ( wresizing ) { return; }
+	int wtag = wgettag();
+	Client* c = clients;
+	for( ; c ; c = c->next )
+	{
+		if ( c->tags & (1 << wtag) )
+		{
+			if ( (c->wcol[wtag] == -1) && !c->isfloating ) { wadd(wtag,c); }
+			if ( (c->wcol[wtag] != -1) && c->isfloating ) { wremove(wtag,c); wnohole(wtag); }
+		}
+		else
+		{
+			if ( c->wcol[wtag] != -1 ) { wremove(wtag,c); wnohole(wtag); }
+		}
+	}
+	warrange(wtag);
+}
+
