| t proceeded, though we still miss a real Tag struct - dwm - [fork] custo… | |
| git clone git://src.adamsgaard.dk/dwm | |
| Log | |
| Files | |
| Refs | |
| README | |
| LICENSE | |
| --- | |
| commit 00ca643bd7ccba6efd001cc679525a53a3c75586 | |
| parent 0271ac0ed7b422ffac8ff848193deceedb0872da | |
| Author: anselm@anselm1 <unknown> | |
| Date: Wed, 27 Feb 2008 21:50:50 +0000 | |
| proceeded, though we still miss a real Tag struct | |
| Diffstat: | |
| M config.def.h | 6 ++++-- | |
| M dwm.c | 58 +++++++++++++++++++----------… | |
| 2 files changed, 39 insertions(+), 25 deletions(-) | |
| --- | |
| diff --git a/config.def.h b/config.def.h | |
| t@@ -12,8 +12,10 @@ | |
| #define SELFGCOLOR "#ffffff" | |
| /* tagging */ | |
| -const char tags[][MAXTAGLEN] = { "1", "2", "3", "4", "5", "6", "7", "8", "www"… | |
| -int initags[LENGTH(tags)] = { [0] = 1 }; | |
| +const char tags[][MAXTAGLEN] = { "1", "2", "3", "4", "nil", "6", "7", "8",… | |
| +unsigned int vtags[LENGTH(tags)] = { 0 , 0 , 0 , 0 , 0 , 1 , 1 , 1 ,… | |
| +Bool initags[LENGTH(tags)] = { [0] = True, [5] = True }; | |
| + | |
| Rule rules[] = { | |
| /* class:instance:title substr tags ref isfloating */ | |
| { "Firefox", tags[8], False }, | |
| diff --git a/dwm.c b/dwm.c | |
| t@@ -67,10 +67,10 @@ struct Client { | |
| int x, y, w, h; | |
| int basew, baseh, incw, inch, maxw, maxh, minw, minh; | |
| int minax, maxax, minay, maxay; | |
| - int *tags; | |
| long flags; | |
| unsigned int border, oldborder; | |
| Bool isbanned, isfixed, isfloating, isurgent; | |
| + Bool *tags; | |
| Client *next; | |
| Client *prev; | |
| Client *snext; | |
| t@@ -110,8 +110,12 @@ typedef struct { | |
| Bool isfloating; | |
| } Rule; | |
| +typedef struct { | |
| + const char name[MAXTAGLEN]; | |
| + unsigned int view; | |
| +} Tag; | |
| + | |
| struct View { | |
| - int id; | |
| int x, y, w, h, wax, way, wah, waw; | |
| double mwfact; | |
| Layout *layout; | |
| t@@ -119,6 +123,7 @@ struct View { | |
| }; | |
| /* function declarations */ | |
| +void addtag(Client *c, const char *t); | |
| void applyrules(Client *c); | |
| void arrange(void); | |
| void attach(Client *c); | |
| t@@ -153,7 +158,7 @@ long getstate(Window w); | |
| Bool gettextprop(Window w, Atom atom, char *text, unsigned int size); | |
| void grabbuttons(Client *c, Bool focused); | |
| void grabkeys(void); | |
| -unsigned int idxoftag(const char *tag); | |
| +unsigned int idxoftag(const char *t); | |
| void initfont(const char *fontstr); | |
| Bool isoccupied(unsigned int t); | |
| Bool isprotodel(Client *c); | |
| t@@ -208,8 +213,6 @@ char stext[256], buf[256]; | |
| int nviews = 1; | |
| View *selview; | |
| int screen; | |
| -int *seltags; | |
| -int *prevtags; | |
| int (*xerrorxlib)(Display *, XErrorEvent *); | |
| unsigned int bh, bpos; | |
| unsigned int blw = 0; | |
| t@@ -234,6 +237,8 @@ Bool domwfact = True; | |
| Bool dozoom = True; | |
| Bool otherwm, readin; | |
| Bool running = True; | |
| +Bool *prevtags; | |
| +Bool *seltags; | |
| Client *clients = NULL; | |
| Client *sel = NULL; | |
| Client *stack = NULL; | |
| t@@ -248,17 +253,24 @@ Window root; | |
| /* function implementations */ | |
| void | |
| +addtag(Client *c, const char *t) { | |
| + unsigned int i, tidx = idxoftag(t); | |
| + | |
| + for(i = 0; i < LENGTH(tags); i++) | |
| + if(c->tags[i] && vtags[i] != vtags[tidx]) | |
| + return; /* conflict */ | |
| + c->tags[tidx] = True; | |
| +} | |
| + | |
| +void | |
| applyrules(Client *c) { | |
| unsigned int i; | |
| - Bool matched_tag = False; | |
| + Bool matched = False; | |
| Rule *r; | |
| XClassHint ch = { 0 }; | |
| /* rule matching */ | |
| XGetClassHint(dpy, c->win, &ch); | |
| - snprintf(buf, sizeof buf, "%s:%s:%s", | |
| - ch.res_class ? ch.res_class : "", | |
| - ch.res_name ? ch.res_name : "", c->name); | |
| for(i = 0; i < LENGTH(rules); i++) { | |
| r = &rules[i]; | |
| if(strstr(c->name, r->prop) | |
| t@@ -267,8 +279,8 @@ applyrules(Client *c) { | |
| { | |
| c->isfloating = r->isfloating; | |
| if(r->tag) { | |
| - matched_tag = True; | |
| - c->tags[idxoftag(r->tag)] = selview->id; | |
| + addtag(c, r->tag); | |
| + matched = True; | |
| } | |
| } | |
| } | |
| t@@ -276,7 +288,7 @@ applyrules(Client *c) { | |
| XFree(ch.res_class); | |
| if(ch.res_name) | |
| XFree(ch.res_name); | |
| - if(!matched_tag) | |
| + if(!matched) | |
| memcpy(c->tags, seltags, sizeof initags); | |
| } | |
| t@@ -532,7 +544,7 @@ drawbar(View *v) { | |
| for(c = stack; c && (!isvisible(c) || getview(c) != v); c = c->snext); | |
| for(i = 0; i < LENGTH(tags); i++) { | |
| dc.w = textw(tags[i]); | |
| - if(seltags[i] && seltags[i] == v->id) { | |
| + if(seltags[i]) { | |
| drawtext(v, tags[i], dc.sel, isurgent(i)); | |
| drawsquare(v, c && c->tags[i], isoccupied(i), isurgent… | |
| } | |
| t@@ -902,10 +914,10 @@ grabkeys(void) { | |
| } | |
| unsigned int | |
| -idxoftag(const char *tag) { | |
| +idxoftag(const char *t) { | |
| unsigned int i; | |
| - for(i = 0; (i < LENGTH(tags)) && (tags[i] != tag); i++); | |
| + for(i = 0; (i < LENGTH(tags)) && (tags[i] != t); i++); | |
| return (i < LENGTH(tags)) ? i : 0; | |
| } | |
| t@@ -1559,7 +1571,6 @@ nviews = 2; /* aim Xinerama */ | |
| for(i = 0; i < nviews; i++) { | |
| /* init geometry */ | |
| v = &views[i]; | |
| - v->id = i + 1; | |
| if(nviews != 1 && isxinerama) { | |
| t@@ -1653,8 +1664,8 @@ tag(const char *arg) { | |
| if(!sel) | |
| return; | |
| for(i = 0; i < LENGTH(tags); i++) | |
| - sel->tags[i] = (NULL == arg) ? selview->id : 0; | |
| - sel->tags[idxoftag(arg)] = selview->id; | |
| + sel->tags[i] = (NULL == arg); | |
| + sel->tags[idxoftag(arg)] = True; | |
| arrange(); | |
| } | |
| t@@ -1750,7 +1761,7 @@ toggletag(const char *arg) { | |
| sel->tags[i] = !sel->tags[i]; | |
| for(j = 0; j < LENGTH(tags) && !sel->tags[j]; j++); | |
| if(j == LENGTH(tags)) | |
| - sel->tags[i] = selview->id; /* at least one tag must be enable… | |
| + sel->tags[i] = True; /* at least one tag must be enabled */ | |
| arrange(); | |
| } | |
| t@@ -1762,7 +1773,7 @@ toggleview(const char *arg) { | |
| seltags[i] = !seltags[i]; | |
| for(j = 0; j < LENGTH(tags) && !seltags[j]; j++); | |
| if(j == LENGTH(tags)) | |
| - seltags[i] = selview->id; /* at least one tag must be viewed */ | |
| + seltags[i] = True; /* at least one tag must be viewed */ | |
| arrange(); | |
| } | |
| t@@ -1903,11 +1914,12 @@ updatewmhints(Client *c) { | |
| void | |
| view(const char *arg) { | |
| unsigned int i; | |
| - int tmp[LENGTH(tags)]; | |
| + Bool tmp[LENGTH(tags)]; | |
| for(i = 0; i < LENGTH(tags); i++) | |
| - tmp[i] = (NULL == arg) ? selview->id : 0; | |
| - tmp[idxoftag(arg)] = selview->id; | |
| + tmp[i] = (NULL == arg); | |
| + tmp[idxoftag(arg)] = True; | |
| + | |
| if(memcmp(seltags, tmp, sizeof initags) != 0) { | |
| memcpy(prevtags, seltags, sizeof initags); | |
| memcpy(seltags, tmp, sizeof initags); |