diff -r 4f66942cc63b config.default.h
--- a/config.default.h	Tue Aug 14 19:38:10 2007 +0200
+++ b/config.default.h	Wed Aug 15 12:46:16 2007 +0200
@@ -30,7 +30,6 @@ static Layout layout[] = { \
 static Layout layout[] = { \
 	/* symbol		function */ \
 	{ "[]=",		tile }, /* first entry is default */ \
-	{ "><>",		floating }, \
 };
 #define MWFACT			0.6	/* master width factor [0.1 .. 0.9] */
 #define SNAP			32	/* snap pixel */
@@ -43,6 +42,7 @@ static Key key[] = { \
 	{ MODKEY|ShiftMask,		XK_Return,	spawn,		"exec xterm" }, \
 	{ MODKEY,			XK_p,		spawn, 		"exe=`dmenu_path | dmenu` && exec $exe" }, \
 	{ MODKEY,			XK_space,	setlayout,	NULL }, \
+	{ MODKEY|ControlMask,		XK_space,	floating,	"<><" }, \
 	{ MODKEY,			XK_b,		togglebar,	NULL }, \
 	{ MODKEY,			XK_j,		focusclient,	"1" }, \
 	{ MODKEY,			XK_k,		focusclient,	"-1" }, \
diff -r 4f66942cc63b dwm.h
--- a/dwm.h	Tue Aug 14 19:38:10 2007 +0200
+++ b/dwm.h	Wed Aug 15 12:46:16 2007 +0200
@@ -74,6 +74,11 @@ typedef struct {
 	} font;
 } DC; /* draw context */
 
+typedef struct {
+	const char *symbol;
+	void (*arrange)(const char *);
+} Layout;
+
 extern const char *tags[];			/* all tags */
 extern char stext[256];				/* status text */
 extern int screen, sx, sy, sw, sh;		/* screen geometry */
@@ -88,6 +93,7 @@ extern DC dc;					/* global draw context
 extern DC dc;					/* global draw context */
 extern Display *dpy;
 extern Window root, barwin;
+extern Layout *lt;
 
 /* client.c */
 void attach(Client *c);			/* attaches c to global client list */
@@ -115,6 +121,7 @@ void grabkeys(void);			/* grab all keys 
 
 /* layout.c */
 void arrange(void);			/* arranges all windows depending on the layout in use */
+void floating(const char *arg);		/* arranges all windows floating */
 void focusclient(const char *arg);	/* focuses next(1)/previous(-1) visible client */
 const char *getsymbol(void);		/* returns symbol of enabled layout */
 Bool isfloating(void);			/* returns True if floating layout is enabled */
diff -r 4f66942cc63b layout.c
--- a/layout.c	Tue Aug 14 19:38:10 2007 +0200
+++ b/layout.c	Wed Aug 15 12:46:17 2007 +0200
@@ -4,28 +4,16 @@
 
 /* static */
 
-typedef struct {
-	const char *symbol;
-	void (*arrange)(void);
-} Layout;
 
 unsigned int blw = 0;
-static Layout *lt = NULL;
-
-static void
-floating(void) { /* default floating layout */
-	Client *c;
-
-	for(c = clients; c; c = c->next)
-		if(isvisible(c))
-			resize(c, c->x, c->y, c->w, c->h, True);
-}
 
 static unsigned int nlayouts = 0;
 
 LAYOUTS
 
 /* extern */
+
+Layout *lt = NULL;
 
 void
 arrange(void) {
@@ -36,9 +24,24 @@ arrange(void) {
 			unban(c);
 		else
 			ban(c);
-	lt->arrange();
+	lt->arrange(NULL);
 	focus(NULL);
 	restack();
+}
+
+void
+floating(const char *arg) { /* default floating layout */
+	Client *c;
+	static Layout this = { NULL, floating };
+
+	if(arg) {
+		this.symbol = arg;
+		lt = &this;
+		return arrange();
+	}
+	for(c = clients; c; c = c->next)
+		if(isvisible(c))
+			resize(c, c->x, c->y, c->w, c->h, True);
 }
 
 void
@@ -132,19 +135,9 @@ restack(void) {
 
 void
 setlayout(const char *arg) {
-	int i;
-
-	if(!arg) {
-		lt++;
-		if(lt == layout + nlayouts)
-			lt = layout;
-	}
-	else {
-		i = atoi(arg);
-		if(i < 0 || i >= nlayouts)
-			return;
-		lt = &layout[i];
-	}
+	lt++;
+	if(lt >= layout + nlayouts || lt <= layout)
+		lt = layout;
 	if(sel)
 		arrange();
 	else
diff -r 4f66942cc63b tile.c
--- a/tile.c	Tue Aug 14 19:38:10 2007 +0200
+++ b/tile.c	Wed Aug 15 12:46:17 2007 +0200
@@ -24,9 +24,16 @@ addtomwfact(const char *arg) {
 }
 
 void
-tile(void) {
+tile(const char *arg) {
 	unsigned int i, n, nx, ny, nw, nh, mw, th;
 	Client *c;
+	static Layout this = { NULL, floating };
+
+	if(arg) {
+		this.symbol = arg;
+		lt = &this;
+		return arrange();
+	}
 
 	for(n = 0, c = nexttiled(clients); c; c = nexttiled(c->next))
 		n++;
diff -r 4f66942cc63b tile.h
--- a/tile.h	Tue Aug 14 19:38:10 2007 +0200
+++ b/tile.h	Wed Aug 15 12:46:17 2007 +0200
@@ -2,5 +2,5 @@
 
 /* tile.c */
 void addtomwfact(const char *arg);	/* adds arg value [0.1 .. 0.9] to master width factor */
-void tile(void);			/* arranges all windows tiled */
+void tile(const char *arg);		/* arranges all windows tiled */
 void zoom(const char *arg);		/* zooms the focused client to master area, arg is ignored */
