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