JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
setlayout and setgeom are now togglable again
[dwm.git] / dwm.c
diff --git a/dwm.c b/dwm.c
index 053984d..e1c8c20 100644 (file)
--- a/dwm.c
+++ b/dwm.c
@@ -259,7 +259,7 @@ applyrules(Client *c) {
        XGetClassHint(dpy, c->win, &ch);
        for(i = 0; i < LENGTH(rules); i++) {
                r = &rules[i];
-               if(r->title && strstr(c->name, r->title)
+               if((r->title && strstr(c->name, r->title))
                || (ch.res_class && r->class && strstr(ch.res_class, r->class))
                || (ch.res_name && r->instance && strstr(ch.res_name, r->instance)))
                {
@@ -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);
        }
 }
 
@@ -517,9 +523,11 @@ drawbar(void) {
        Client *c;
 
        dc.x = 0;
-       dc.w = bgw;
-       drawtext(geom->symbol, dc.norm, False);
-       dc.x += bgw;
+       if(bgw > 0) {
+               dc.w = bgw;
+               drawtext(geom->symbol, dc.norm, False);
+               dc.x += bgw;
+       }
        for(c = stack; c && !isvisible(c); c = c->snext);
        for(i = 0; i < LENGTH(tags); i++) {
                dc.w = textw(tags[i]);
@@ -533,9 +541,13 @@ drawbar(void) {
                }
                dc.x += dc.w;
        }
-       dc.w = blw;
-       drawtext(lt->symbol, dc.norm, False);
-       x = dc.x + dc.w;
+       if(blw > 0) {
+               dc.w = blw;
+               drawtext(lt->symbol, dc.norm, False);
+               x = dc.x + dc.w;
+       }
+       else
+               x = dc.x;
        dc.w = textw(stext);
        dc.x = bw - dc.w;
        if(dc.x < x) {
@@ -860,7 +872,7 @@ unsigned int
 idxoftag(const char *t) {
        unsigned int i;
 
-       for(i = 0; (i < LENGTH(tags)) && strcmp(tags[i], t); i++);
+       for(i = 0; (i < LENGTH(tags)) && t && strcmp(tags[i], t); i++);
        return (i < LENGTH(tags)) ? i : 0;
 }
 
@@ -1411,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();
@@ -1424,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)
@@ -1502,12 +1518,12 @@ setup(void) {
        lt = &layouts[0];
 
        /* init bar */
-       for(blw = i = 0; i < LENGTH(layouts); i++) {
+       for(blw = i = 0; LENGTH(layouts) > 1 && i < LENGTH(layouts); i++) {
                w = textw(layouts[i].symbol);
                if(w > blw)
                        blw = w;
        }
-       for(bgw = i = 0; i < LENGTH(geoms); i++) {
+       for(bgw = i = 0; LENGTH(geoms) > 1 && i < LENGTH(geoms); i++) {
                w = textw(geoms[i].symbol);
                if(w > bgw)
                        bgw = w;