URI: 
       setlayout and setgeom are now togglable again - dwm - dynamic window manager
  HTML git clone https://git.parazyd.org/dwm
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit 20cd3360876f551c0f3b4c9c5a827a64b829e6ef
   DIR parent a6a216f28cbc49afaace269c2662382a351fda24
  HTML Author: Anselm R Garbe <garbeam@gmail.com>
       Date:   Mon, 24 Mar 2008 13:49:19 +0000
       
       setlayout and setgeom are now togglable again
       Diffstat:
         M config.def.h                        |      20 ++++++--------------
         M dwm.1                               |      14 ++++----------
         M dwm.c                               |      46 +++++++++++++++++++------------
       
       3 files changed, 38 insertions(+), 42 deletions(-)
       ---
   DIR diff --git a/config.def.h b/config.def.h
       @@ -22,15 +22,11 @@ Rule rules[] = {
        /*   func name  bx  by  bw  wx  wy  ww     wh  mx  my       mw  mh     tx  ty     tw  th  mox moy mow moh */
        DEFGEOM(single,  0,  0, sw,  0, bh, sw, sh-bh, wx, wy, 0.55*sw, wh, mx+mw, wy, ww-mw, wh,  wx, wy, ww, wh)
        DEFGEOM(dual,    0,  0,1280, 0, bh, ww, wh-bh, wx, wy, 1280,800-bh,  1280,  0, ww-mw, sh,  mx, my, mw, mh)
       -/* DEFGEOM(growmaster, bx, by, bw, wx, wy, ww, wh, mx, my, mw+20, mh, mx+mw, ty, tw-20, th, mox, moy, mow, moh) */
       -/* DEFGEOM(shrinkmaster, bx, by, bw, wx, wy, ww, wh, mx, my, mw-20, mh, mx+mw, ty, tw+20, th, mox, moy, mow, moh) */
        
        Geom geoms[] = {
                /* symbol        function */
       -        { "<>",                single },        /* first entry is default */
       -        { ")(",                dual },
       -/*        { "+|",                growmaster },*/
       -/*        { "|-",                shrinkmaster },*/
       +        { "[]",                single },        /* first entry is default */
       +        { "[][]",        dual },
        };
        
        /* layout(s) */
       @@ -49,22 +45,18 @@ Layout layouts[] = {
        #define MODKEY                        Mod1Mask
        Key keys[] = {
                /* modifier                        key                function        argument */
       -        { MODKEY,                        XK_a,                setgeom,        ")(" },
       -        { MODKEY,                        XK_d,                setgeom,        "<>" },
                { MODKEY,                        XK_p,                spawn,
                        "exec dmenu_run -fn '"FONT"' -nb '"NORMBGCOLOR"' -nf '"NORMFGCOLOR"' -sb '"SELBGCOLOR"' -sf '"SELFGCOLOR"'" },
       -        { MODKEY|ShiftMask,                XK_Return,        spawn, "exec uxterm" },
       +        { MODKEY|ShiftMask,                XK_Return,        spawn,                "exec uxterm" },
                { MODKEY,                        XK_j,                focusnext,        NULL },
                { MODKEY,                        XK_k,                focusprev,        NULL },
                { MODKEY,                        XK_r,                reapply,        NULL },
                { MODKEY,                        XK_Return,        zoom,                NULL },
                { MODKEY,                        XK_Tab,                viewprevtag,        NULL },
       -        { MODKEY,                        XK_m,                setlayout,        "[M]" },
       -        { MODKEY,                        XK_f,                setlayout,        "><>" },
       -        { MODKEY,                        XK_v,                setlayout,        "[]=" },
       -        { MODKEY,                        XK_h,                setlayout,        "[]|" },
       -        { MODKEY|ShiftMask,                XK_space,        togglefloating,        NULL },
                { MODKEY|ShiftMask,                XK_c,                killclient,        NULL },
       +        { MODKEY,                        XK_space,        setlayout,        NULL },
       +        { MODKEY|ShiftMask,                XK_space,        togglefloating,        NULL },
       +        { MODKEY|ControlMask,                XK_space,        setgeom,        NULL },
                { MODKEY,                        XK_0,                view,                NULL },
                { MODKEY,                        XK_1,                view,                tags[0] },
                { MODKEY,                        XK_2,                view,                tags[1] },
   DIR diff --git a/dwm.1 b/dwm.1
       @@ -57,17 +57,11 @@ click on a tag label adds/removes that tag to/from the focused window.
        Start
        .BR xterm.
        .TP
       -.B Mod1\-f
       -Applies floating layout.
       +.B Mod1\-space
       +Toggles between layouts.
        .TP
       -.B Mod1\-m
       -Applies monocle layout.
       -.TP
       -.B Mod1\-v
       -Applies vertical tiled layout.
       -.TP
       -.B Mod1\-h
       -Applies horizontal tiled layout.
       +.B Mod1\-Control\-space
       +Toggles between geometries.
        .TP
        .B Mod1\-j
        Focus next window.
   DIR diff --git a/dwm.c b/dwm.c
       @@ -322,6 +322,10 @@ buttonpress(XEvent *e) {
                XButtonPressedEvent *ev = &e->xbutton;
        
                if(ev->window == barwin) {
       +                if((ev->x < bgw) && ev->button == Button1) {
       +                        setgeom(NULL);
       +                        return;
       +                }
                        x = bgw;
                        for(i = 0; i < LENGTH(tags); i++) {
                                x += textw(tags[i]);
       @@ -341,6 +345,8 @@ buttonpress(XEvent *e) {
                                        return;
                                }
                        }
       +                if((ev->x < x + blw) && ev->button == Button1) 
       +                        setlayout(NULL);
                }
                else if((c = getclient(ev->window))) {
                        focus(c);
       @@ -426,7 +432,7 @@ configurenotify(XEvent *e) {
                if(ev->window == root && (ev->width != sw || ev->height != sh)) {
                        sw = ev->width;
                        sh = ev->height;
       -                setgeom(NULL);
       +                setgeom(geom->symbol);
                }
        }
        
       @@ -1417,12 +1423,18 @@ void
        setgeom(const char *arg) {
                unsigned int i;
        
       -        for(i = 0; arg && i < LENGTH(geoms); i++)
       -                if(!strcmp(geoms[i].symbol, arg))
       -                        break;
       -        if(i == LENGTH(geoms))
       -                return;
       -        geom = &geoms[i];
       +        if(!arg) {
       +                if(++geom == &geoms[LENGTH(geoms)])
       +                        geom = &geoms[0];
       +        }
       +        else {
       +                for(i = 0; i < LENGTH(geoms); i++)
       +                        if(!strcmp(geoms[i].symbol, arg))
       +                                break;
       +                if(i == LENGTH(geoms))
       +                        return;
       +                geom = &geoms[i];
       +        }
                geom->apply();
                updatebarpos();
                arrange();
       @@ -1430,20 +1442,18 @@ setgeom(const char *arg) {
        
        void
        setlayout(const char *arg) {
       -        static Layout *revert = 0;
                unsigned int i;
        
       -        if(!arg)
       -                return;
       -        for(i = 0; i < LENGTH(layouts); i++)
       -                if(!strcmp(arg, layouts[i].symbol))
       -                        break;
       -        if(i == LENGTH(layouts))
       -                return;
       -        if(revert && &layouts[i] == lt)
       -                lt = revert;
       +        if(!arg) {
       +                if(++lt == &layouts[LENGTH(layouts)])
       +                        lt = &layouts[0];
       +        }
                else {
       -                revert = lt;
       +                for(i = 0; i < LENGTH(layouts); i++)
       +                        if(!strcmp(arg, layouts[i].symbol))
       +                                break;
       +                if(i == LENGTH(layouts))
       +                        return;
                        lt = &layouts[i];
                }
                if(sel)