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)))
{
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]);
return;
}
}
+ if((ev->x < x + blw) && ev->button == Button1)
+ setlayout(NULL);
}
else if((c = getclient(ev->window))) {
focus(c);
configurenotify(XEvent *e) {
XConfigureEvent *ev = &e->xconfigure;
- if(ev->window == root && (ev->width != sw || ev->height != sh))
- setgeom(NULL);
+ if(ev->window == root && (ev->width != sw || ev->height != sh)) {
+ sw = ev->width;
+ sh = ev->height;
+ setgeom(geom->symbol);
+ }
}
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]);
}
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) {
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;
}
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();
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)
void
setup(void) {
- unsigned int i;
+ unsigned int i, w;
XSetWindowAttributes wa;
/* init screen */
lt = &layouts[0];
/* init bar */
- for(blw = i = 0; i < LENGTH(layouts); i++) {
- i = textw(layouts[i].symbol);
- if(i > blw)
- blw = 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++) {
- i = textw(geoms[i].symbol);
- if(i > bgw)
- bgw = i;
+ for(bgw = i = 0; LENGTH(geoms) > 1 && i < LENGTH(geoms); i++) {
+ w = textw(geoms[i].symbol);
+ if(w > bgw)
+ bgw = w;
}
wa.override_redirect = 1;