diff options
-rw-r--r-- | client.c | 4 | ||||
-rw-r--r-- | config.arg.h | 52 | ||||
-rw-r--r-- | config.default.h | 48 | ||||
-rw-r--r-- | draw.c | 4 | ||||
-rw-r--r-- | dwm.h | 5 | ||||
-rw-r--r-- | event.c | 2 | ||||
-rw-r--r-- | main.c | 3 | ||||
-rw-r--r-- | tag.c | 19 |
8 files changed, 66 insertions, 71 deletions
@@ -16,7 +16,7 @@ resizetitle(Client *c) int i; c->tw = 0; - for(i = 0; i < TLast; i++) + for(i = 0; i < ntags; i++) if(c->tags[i]) c->tw += textw(tags[i]); c->tw += textw(c->name); @@ -211,6 +211,7 @@ manage(Window w, XWindowAttributes *wa) XSetWindowAttributes twa; c = emallocz(sizeof(Client)); + c->tags = emallocz(ntags * sizeof(Bool)); c->win = w; c->x = c->tx = wa->x; c->y = c->ty = wa->y; @@ -429,6 +430,7 @@ unmanage(Client *c) if(!sel) sel = clients; } + free(c->tags); free(c); XSync(dpy, False); diff --git a/config.arg.h b/config.arg.h index a3d312c7..00a1d135 100644 --- a/config.arg.h +++ b/config.arg.h @@ -3,18 +3,11 @@ * See LICENSE file for license details. */ -enum { Tfnord, Tdev, Tnet, Twork, Tmisc, TLast }; #define TAGS \ -const char *tags[TLast] = { \ - [Tfnord] = "fnord", \ - [Tdev] = "dev", \ - [Tnet] = "net", \ - [Twork] = "work", \ - [Tmisc] = "misc", \ -}; +const char *tags[] = { "fnord", "dev", "net", "work", "misc", NULL }; #define DEFMODE dotile /* dofloat */ -#define DEFTAG Tdev +#define DEFTAG 1 /* index */ #define FONT "-*-terminus-medium-*-*-*-13-*-*-*-*-*-iso10646-*" #define BGCOLOR "#0a2c2d" #define FGCOLOR "#ddeeee" @@ -33,11 +26,11 @@ const char *tags[TLast] = { \ const char *xlock[] = { "xlock", NULL }; \ static Key key[] = { \ /* modifier key function arguments */ \ - { MODKEY, XK_0, view, { .i = Tfnord } }, \ - { MODKEY, XK_1, view, { .i = Tdev } }, \ - { MODKEY, XK_2, view, { .i = Tnet } }, \ - { MODKEY, XK_3, view, { .i = Twork } }, \ - { MODKEY, XK_4, view, { .i = Tmisc} }, \ + { MODKEY, XK_0, view, { .i = 0 } }, \ + { MODKEY, XK_1, view, { .i = 1 } }, \ + { MODKEY, XK_2, view, { .i = 2 } }, \ + { MODKEY, XK_3, view, { .i = 3 } }, \ + { MODKEY, XK_4, view, { .i = 4 } }, \ { MODKEY, XK_h, viewprev, { 0 } }, \ { MODKEY, XK_j, focusnext, { 0 } }, \ { MODKEY, XK_k, focusprev, { 0 } }, \ @@ -45,16 +38,16 @@ static Key key[] = { \ { MODKEY, XK_m, togglemax, { 0 } }, \ { MODKEY, XK_space, togglemode, { 0 } }, \ { MODKEY, XK_Return, zoom, { 0 } }, \ - { MODKEY|ControlMask, XK_0, appendtag, { .i = Tfnord } }, \ - { MODKEY|ControlMask, XK_1, appendtag, { .i = Tdev } }, \ - { MODKEY|ControlMask, XK_2, appendtag, { .i = Tnet } }, \ - { MODKEY|ControlMask, XK_3, appendtag, { .i = Twork } }, \ - { MODKEY|ControlMask, XK_4, appendtag, { .i = Tmisc } }, \ - { MODKEY|ShiftMask, XK_0, replacetag, { .i = Tfnord } }, \ - { MODKEY|ShiftMask, XK_1, replacetag, { .i = Tdev } }, \ - { MODKEY|ShiftMask, XK_2, replacetag, { .i = Tnet } }, \ - { MODKEY|ShiftMask, XK_3, replacetag, { .i = Twork } }, \ - { MODKEY|ShiftMask, XK_4, replacetag, { .i = Tmisc } }, \ + { MODKEY|ControlMask, XK_0, appendtag, { .i = 0 } }, \ + { MODKEY|ControlMask, XK_1, appendtag, { .i = 1 } }, \ + { MODKEY|ControlMask, XK_2, appendtag, { .i = 2 } }, \ + { MODKEY|ControlMask, XK_3, appendtag, { .i = 3 } }, \ + { MODKEY|ControlMask, XK_4, appendtag, { .i = 4 } }, \ + { MODKEY|ShiftMask, XK_0, replacetag, { .i = 0 } }, \ + { MODKEY|ShiftMask, XK_1, replacetag, { .i = 1 } }, \ + { MODKEY|ShiftMask, XK_2, replacetag, { .i = 2 } }, \ + { MODKEY|ShiftMask, XK_3, replacetag, { .i = 3 } }, \ + { MODKEY|ShiftMask, XK_4, replacetag, { .i = 5 } }, \ { MODKEY|ShiftMask, XK_c, killclient, { 0 } }, \ { MODKEY|ShiftMask, XK_q, quit, { 0 } }, \ { MODKEY|ShiftMask, XK_Return, spawn, { .argv = term } }, \ @@ -64,10 +57,11 @@ static Key key[] = { \ }; #define RULES \ + const unsigned int firefox[] = { 2 }; \ static Rule rule[] = { \ - /* class:instance tags isfloat */ \ - { "Firefox.*", { [Tnet] = True }, False }, \ - { "Gimp.*", { 0 }, True}, \ - { "MPlayer.*", { 0 }, True}, \ - { "Acroread.*", { 0 }, True}, \ + /* class:instance tags isfloat */ \ + { "Firefox.*", firefox, False }, \ + { "Gimp.*", NULL, True}, \ + { "MPlayer.*", NULL, True}, \ + { "Acroread.*", NULL, True}, \ }; diff --git a/config.default.h b/config.default.h index ec1804f0..ce3773e3 100644 --- a/config.default.h +++ b/config.default.h @@ -3,18 +3,11 @@ * See LICENSE file for license details. */ -enum { Tfnord, Tdev, Tnet, Twork, Tmisc, TLast }; #define TAGS \ -const char *tags[TLast] = { \ - [Tfnord] = "fnord", \ - [Tdev] = "dev", \ - [Tnet] = "net", \ - [Twork] = "work", \ - [Tmisc] = "misc", \ -}; +const char *tags[] = { "0", "1", "2", "3", "4", NULL }; #define DEFMODE dotile /* dofloat */ -#define DEFTAG Tdev +#define DEFTAG 1 /* index */ #define FONT "fixed" #define BGCOLOR "#666699" #define FGCOLOR "#eeeeee" @@ -27,11 +20,11 @@ const char *tags[TLast] = { \ const char *term[] = { "xterm", NULL }; \ static Key key[] = { \ /* modifier key function arguments */ \ - { MODKEY, XK_0, view, { .i = Tfnord } }, \ - { MODKEY, XK_1, view, { .i = Tdev } }, \ - { MODKEY, XK_2, view, { .i = Tnet } }, \ - { MODKEY, XK_3, view, { .i = Twork } }, \ - { MODKEY, XK_4, view, { .i = Tmisc} }, \ + { MODKEY, XK_0, view, { .i = 0 } }, \ + { MODKEY, XK_1, view, { .i = 1 } }, \ + { MODKEY, XK_2, view, { .i = 2 } }, \ + { MODKEY, XK_3, view, { .i = 3 } }, \ + { MODKEY, XK_4, view, { .i = 4 } }, \ { MODKEY, XK_h, viewprev, { 0 } }, \ { MODKEY, XK_j, focusnext, { 0 } }, \ { MODKEY, XK_k, focusprev, { 0 } }, \ @@ -39,24 +32,25 @@ static Key key[] = { \ { MODKEY, XK_m, togglemax, { 0 } }, \ { MODKEY, XK_space, togglemode, { 0 } }, \ { MODKEY, XK_Return, zoom, { 0 } }, \ - { MODKEY|ControlMask, XK_0, appendtag, { .i = Tfnord } }, \ - { MODKEY|ControlMask, XK_1, appendtag, { .i = Tdev } }, \ - { MODKEY|ControlMask, XK_2, appendtag, { .i = Tnet } }, \ - { MODKEY|ControlMask, XK_3, appendtag, { .i = Twork } }, \ - { MODKEY|ControlMask, XK_4, appendtag, { .i = Tmisc } }, \ - { MODKEY|ShiftMask, XK_0, replacetag, { .i = Tfnord } }, \ - { MODKEY|ShiftMask, XK_1, replacetag, { .i = Tdev } }, \ - { MODKEY|ShiftMask, XK_2, replacetag, { .i = Tnet } }, \ - { MODKEY|ShiftMask, XK_3, replacetag, { .i = Twork } }, \ - { MODKEY|ShiftMask, XK_4, replacetag, { .i = Tmisc } }, \ + { MODKEY|ControlMask, XK_0, appendtag, { .i = 0 } }, \ + { MODKEY|ControlMask, XK_1, appendtag, { .i = 1 } }, \ + { MODKEY|ControlMask, XK_2, appendtag, { .i = 2 } }, \ + { MODKEY|ControlMask, XK_3, appendtag, { .i = 3 } }, \ + { MODKEY|ControlMask, XK_4, appendtag, { .i = 4 } }, \ + { MODKEY|ShiftMask, XK_0, replacetag, { .i = 0 } }, \ + { MODKEY|ShiftMask, XK_1, replacetag, { .i = 1 } }, \ + { MODKEY|ShiftMask, XK_2, replacetag, { .i = 2 } }, \ + { MODKEY|ShiftMask, XK_3, replacetag, { .i = 3 } }, \ + { MODKEY|ShiftMask, XK_4, replacetag, { .i = 4 } }, \ { MODKEY|ShiftMask, XK_c, killclient, { 0 } }, \ { MODKEY|ShiftMask, XK_q, quit, { 0 } }, \ { MODKEY|ShiftMask, XK_Return, spawn, { .argv = term } }, \ }; #define RULES \ + const unsigned int firefox[] = { 2 }; \ static Rule rule[] = { \ - /* class:instance tags isfloat */ \ - { "Firefox.*", { [Tnet] = True }, False }, \ - { "Gimp.*", { 0 }, True}, \ + /* class:instance tags isfloat */ \ + { "Firefox.*", firefox, False }, \ + { "Gimp.*", NULL, True}, \ }; @@ -114,7 +114,7 @@ drawstatus() drawtext(NULL, !istile, False); dc.w = 0; - for(i = 0; i < TLast; i++) { + for(i = 0; i < ntags; i++) { dc.x += dc.w; dc.w = textw(tags[i]); if(istile) @@ -153,7 +153,7 @@ drawtitle(Client *c) dc.x = dc.y = 0; dc.w = 0; - for(i = 0; i < TLast; i++) { + for(i = 0; i < ntags; i++) { if(c->tags[i]) { dc.x += dc.w; dc.w = textw(tags[i]); @@ -60,16 +60,17 @@ struct Client { unsigned int border; Bool isfloat; Bool ismax; - Bool tags[TLast]; + Bool *tags; Client *next; Client *prev; Window win; Window title; }; -extern const char *tags[TLast]; +extern const char *tags[]; extern char stext[1024]; extern int tsel, screen, sx, sy, sw, sh, bx, by, bw, bh, mw; +extern unsigned int ntags; extern void (*handler[LASTEvent])(XEvent *); extern void (*arrange)(Arg *); extern Atom wmatom[WMLast], netatom[NetLast]; @@ -105,7 +105,7 @@ buttonpress(XEvent *e) switch(ev->button) { default: x = 0; - for(a.i = 0; a.i < TLast; a.i++) { + for(a.i = 0; a.i < ntags; a.i++) { x += textw(tags[a.i]); if(ev->x < x) { view(&a); @@ -85,6 +85,7 @@ xerrorstart(Display *dsply, XErrorEvent *ee) char stext[1024]; int tsel = DEFTAG; int screen, sx, sy, sw, sh, bx, by, bw, bh, mw; +unsigned int ntags; Atom wmatom[WMLast], netatom[NetLast]; Bool running = True; Bool issel = True; @@ -210,6 +211,8 @@ main(int argc, char *argv[]) grabkeys(); + for(ntags = 0; tags[ntags]; ntags++); + /* style */ dc.bg = getcolor(BGCOLOR); dc.fg = getcolor(FGCOLOR); @@ -13,7 +13,7 @@ typedef struct { const char *pattern; - Bool tags[TLast]; + const unsigned int *tags; Bool isfloat; } Rule; @@ -145,7 +145,7 @@ replacetag(Arg *arg) if(!sel) return; - for(i = 0; i < TLast; i++) + for(i = 0; i < ntags; i++) sel->tags[i] = False; appendtag(arg); } @@ -155,7 +155,7 @@ settags(Client *c) { char classinst[256]; static unsigned int len = sizeof(rule) / sizeof(rule[0]); - unsigned int i, j; + unsigned int i, j, n; regex_t regex; regmatch_t tmp; Bool matched = False; @@ -168,10 +168,11 @@ settags(Client *c) for(i = 0; !matched && i < len; i++) { if(!regcomp(®ex, rule[i].pattern, 0)) { if(!regexec(®ex, classinst, 1, &tmp, 0)) { - for(j = 0; j < TLast; j++) { - if((c->tags[j] = rule[i].tags[j])) - matched = True; - } + n = rule[i].tags ? + sizeof(rule[i].tags) / sizeof(rule[i].tags[0]) : 0; + matched = n != 0; + for(j = 0; j < n; j++) + c->tags[rule[i].tags[j]] = True; c->isfloat = rule[i].isfloat; } regfree(®ex); @@ -204,13 +205,13 @@ view(Arg *arg) void viewnext(Arg *arg) { - arg->i = (tsel < TLast-1) ? tsel+1 : 0; + arg->i = (tsel < ntags-1) ? tsel+1 : 0; view(arg); } void viewprev(Arg *arg) { - arg->i = (tsel > 0) ? tsel-1 : TLast-1; + arg->i = (tsel > 0) ? tsel-1 : ntags-1; view(arg); } |