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 */