X-Git-Url: https://jasonwoof.com/gitweb/?a=blobdiff_plain;f=dwm.c;h=5d93d34200b8914224f66ce887afbce3f4c3cfb3;hb=33b1960220f468ff2888e8ba3517e9a62ed99974;hp=6d3cf80bc77cc47949a5a7fd85b4f0d25453c1b8;hpb=f2e98f48fb3cb7558d705ba581767caccb4ea7be;p=dwm.git diff --git a/dwm.c b/dwm.c index 6d3cf80..5d93d34 100644 --- a/dwm.c +++ b/dwm.c @@ -96,11 +96,12 @@ typedef struct { const char *symbol; void (*arrange)(void); Bool isfloating; -} Layout; /* TODO: layout should keep an auxilliary pointer to its Geometry, - instead of having all those layout specific vars globally */ +} Layout; typedef struct { - const char *prop; + const char *class; + const char *instance; + const char *title; const char *tag; Bool isfloating; } Rule; @@ -117,6 +118,7 @@ void cleanup(void); void configure(Client *c); void configurenotify(XEvent *e); void configurerequest(XEvent *e); +unsigned int counttiled(void); void destroynotify(XEvent *e); void detach(Client *c); void detachstack(Client *c); @@ -134,6 +136,7 @@ void focusnext(const char *arg); void focusprev(const char *arg); Client *getclient(Window w); unsigned long getcolor(const char *colstr); +double getdouble(const char *s); long getstate(Window w); Bool gettextprop(Window w, Atom atom, char *text, unsigned int size); void grabbuttons(Client *c, Bool focused); @@ -161,7 +164,7 @@ void restack(void); void run(void); void scan(void); void setclientstate(Client *c, long state); -void setdefaultgeoms(void); +void setgeom(const char *arg); void setlayout(const char *arg); void setup(void); void spawn(const char *arg); @@ -170,7 +173,8 @@ unsigned int textnw(const char *text, unsigned int len); unsigned int textw(const char *text); void tileh(void); void tilehstack(unsigned int n); -unsigned int tilemaster(void); +Client *tilemaster(unsigned int n); +void tileresize(Client *c, int x, int y, int w, int h); void tilev(void); void tilevstack(unsigned int n); void togglefloating(const char *arg); @@ -223,7 +227,6 @@ Display *dpy; DC dc = {0}; Layout *lt = NULL; Window root, barwin; -void (*setgeoms)(void) = setdefaultgeoms; /* configuration, allows nested code to access above variables */ #include "config.h" @@ -243,9 +246,9 @@ applyrules(Client *c) { XGetClassHint(dpy, c->win, &ch); for(i = 0; i < LENGTH(rules); i++) { r = &rules[i]; - if(strstr(c->name, r->prop) - || (ch.res_class && strstr(ch.res_class, r->prop)) - || (ch.res_name && strstr(ch.res_name, r->prop))) + if(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))) { c->isfloating = r->isfloating; if(r->tag) { @@ -408,7 +411,7 @@ configurenotify(XEvent *e) { XConfigureEvent *ev = &e->xconfigure; if(ev->window == root && (ev->width != sw || ev->height != sh)) { - setgeoms(); + setgeom(NULL); updatebarpos(); arrange(); } @@ -458,6 +461,15 @@ configurerequest(XEvent *e) { XSync(dpy, False); } +unsigned int +counttiled(void) { + unsigned int n; + Client *c; + + for(n = 0, c = nexttiled(clients); c; c = nexttiled(c->next), n++); + return n; +} + void destroynotify(XEvent *e) { Client *c; @@ -1041,7 +1053,7 @@ maprequest(XEvent *e) { } void -monocle(void) { +monocle(void) { Client *c; for(c = clients; c; c = c->next) @@ -1379,44 +1391,95 @@ setclientstate(Client *c, long state) { PropModeReplace, (unsigned char *)data, 2); } -void -setdefaultgeoms(void) { - - /* screen dimensions */ - sx = 0; - sy = 0; - sw = DisplayWidth(dpy, screen); - sh = DisplayHeight(dpy, screen); - - /* bar position */ - bx = sx; - by = sy; - bw = sw; - bh = dc.font.height + 2; - - /* window area */ - wx = sx; - wy = sy + bh; - ww = sw; - wh = sh - bh; +/** + * Idea: + * + * having a geom syntax as follows, which is interpreted as integer. + * + * [-,+][<0..n>|] + * + * + * B = bar height, W = DisplayWidth(), H = DisplayHeight() + * + * -/+/* /: is relative to current + * + * Then we would come down with ,,,,... + * + * "0 0 W B 0 0 W W N E B,W,B, + * + * + */ - /* master area */ - mx = wx; - my = wy; - mw = ((float)sw) * 0.55; - mh = wh; +double +getdouble(const char *s) { + char *endp; + double result = 0; + + fprintf(stderr, "getdouble '%s'\n", s); + switch(*s) { + default: + result = strtod(s, &endp); + if(s == endp || *endp != 0) + result = strtol(s, &endp, 0); + break; + case 'B': result = dc.font.height + 2; break; + case 'W': result = sw; break; + case 'H': result = sh; break; + } + fprintf(stderr, "getdouble returns '%f'\n", result); + return result; +} - /* tile area */ - tx = wx; - ty = wy; - tw = ww - mw; - th = wh; +void +setgeom(const char *arg) { + static const char *lastArg = NULL; + char op, *s, *e, *p; + double val; + int i, *map[] = { &bx, &by, &bw, &bh, + &wx, &wy, &ww, &wh, + &mx, &my, &mw, &mh, + &tx, &ty, &tw, &th, + &mox, &moy, &mow, &moh }; - /* monocle area */ - mox = wx; - moy = wy; - mow = ww; - moh = wh; + if(!arg) + arg = lastArg; + else + lastArg = arg; + if(!lastArg) + return; + strncpy(buf, arg, sizeof buf); + for(i = 0, e = s = buf; e && *e; e++) + if(*e == ' ') { + *e = 0; + fprintf(stderr, "next geom arg='%s'\n", s); + op = 0; + /* check if there is an operator */ + for(p = s; *p && *p != '-' && *p != '+' && *p != '*' && *p != ':'; p++); + if(*p) { + op = *p; + *p = 0; + } + val = getdouble(s); + fprintf(stderr, "val1: %d\n", val); + if(p > s) { /* intermediate operand, e.g. H-B */ + *(map[i]) = val; + s = ++p; + val = getdouble(s); + fprintf(stderr, "val2: %d\n", val); + } + switch(op) { + default: *(map[i]) = val; break; + case '-': *(map[i]) -= val; break; + case '+': *(map[i]) += val; break; + case '*': *(map[i]) *= val; break; + case ':': if(val != 0) *(map[i]) /= val; break; + } + fprintf(stderr, "map[i]='%d'\n", val); + s = ++e; + i++; + } + updatebarpos(); + arrange(); } void @@ -1453,8 +1516,12 @@ setup(void) { root = RootWindow(dpy, screen); initfont(FONT); - /* apply default geometries */ - setgeoms(); + /* apply default dimensions */ + sx = 0; + sy = 0; + sw = DisplayWidth(dpy, screen); + sh = DisplayHeight(dpy, screen); + setgeom(GEOMETRY); /* init atoms */ wmatom[WMProtocols] = XInternAtom(dpy, "WM_PROTOCOLS", False); @@ -1579,89 +1646,76 @@ textw(const char *text) { } void -tileresize(Client *c, int x, int y, int w, int h) { - resize(c, x, y, w, h, RESIZEHINTS); - if((RESIZEHINTS) && ((c->h < bh) || (c->h > h) || (c->w < bh) || (c->w > w))) - /* client doesn't accept size constraints */ - resize(c, x, y, w, h, False); -} - -void tileh(void) { - tilehstack(tilemaster()); -} - -void -tilehstack(unsigned int n) { - int i, x, w; + int x, w; + unsigned int i, n = counttiled(); Client *c; if(n == 0) return; + c = tilemaster(n); + if(--n == 0) + return; x = tx; w = tw / n; if(w < bh) w = tw; - for(i = 0, c = nexttiled(clients); c; c = nexttiled(c->next), i++) - if(i > 0) { - if(i > 1 && i == n) /* remainder */ - tileresize(c, x, ty, (tx + tw) - x - 2 * c->border, - th - 2 * c->border); - else - tileresize(c, x, ty, w - 2 * c->border, - th - 2 * c->border); - if(w != tw) - x = c->x + c->w + 2 * c->border; - } + for(i = 0, c = nexttiled(c->next); c; c = nexttiled(c->next), i++) { + if(i + 1 == n) /* remainder */ + tileresize(c, x, ty, (tx + tw) - x - 2 * c->border, th - 2 * c->border); + else + tileresize(c, x, ty, w - 2 * c->border, th - 2 * c->border); + if(w != tw) + x = c->x + c->w + 2 * c->border; + } } -unsigned int -tilemaster(void) { - unsigned int n; - Client *c, *mc; +Client * +tilemaster(unsigned int n) { + Client *c = nexttiled(clients); - for(n = 0, mc = c = nexttiled(clients); c; c = nexttiled(c->next)) - n++; - if(n == 0) - return 0; if(n == 1) - tileresize(mc, mox, moy, mow - 2 * mc->border, moh - 2 * mc->border); + tileresize(c, mox, moy, mow - 2 * c->border, moh - 2 * c->border); else - tileresize(mc, mx, my, mw - 2 * mc->border, mh - 2 * mc->border); - return n - 1; + tileresize(c, mx, my, mw - 2 * c->border, mh - 2 * c->border); + return c; } void -tilev(void) { - tilevstack(tilemaster()); +tileresize(Client *c, int x, int y, int w, int h) { + resize(c, x, y, w, h, RESIZEHINTS); + if((RESIZEHINTS) && ((c->h < bh) || (c->h > h) || (c->w < bh) || (c->w > w))) + /* client doesn't accept size constraints */ + resize(c, x, y, w, h, False); } void -tilevstack(unsigned int n) { - int i, y, h; +tilev(void) { + int y, h; + unsigned int i, n = counttiled(); Client *c; if(n == 0) return; + c = tilemaster(n); + if(--n == 0) + return; y = ty; h = th / n; if(h < bh) h = th; - for(i = 0, c = nexttiled(clients); c; c = nexttiled(c->next), i++) - if(i > 0) { - if(i > 1 && i == n) /* remainder */ - tileresize(c, tx, y, tw - 2 * c->border, - (ty + th) - y - 2 * c->border); - else - tileresize(c, tx, y, tw - 2 * c->border, - h - 2 * c->border); - if(h != th) - y = c->y + c->h + 2 * c->border; - } + for(i = 0, c = nexttiled(c->next); c; c = nexttiled(c->next), i++) { + if(i + 1 == n) /* remainder */ + tileresize(c, tx, y, tw - 2 * c->border, (ty + th) - y - 2 * c->border); + else + tileresize(c, tx, y, tw - 2 * c->border, h - 2 * c->border); + if(h != th) + y = c->y + c->h + 2 * c->border; + } } void