JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
removed TLast tag enum, now tags is simple defined as char *[] array, the rest is...
authorarg@10ksloc.org <unknown>
Thu, 3 Aug 2006 10:12:26 +0000 (12:12 +0200)
committerarg@10ksloc.org <unknown>
Thu, 3 Aug 2006 10:12:26 +0000 (12:12 +0200)
client.c
config.arg.h
config.default.h
draw.c
dwm.h
event.c
main.c
tag.c

index f4ed1a0..91d031e 100644 (file)
--- a/client.c
+++ b/client.c
@@ -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);
index a3d312c..00a1d13 100644 (file)
@@ -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}, \
 };
index ec1804f..ce3773e 100644 (file)
@@ -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}, \
 };
diff --git a/draw.c b/draw.c
index 506a862..dffb490 100644 (file)
--- a/draw.c
+++ b/draw.c
@@ -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]);
diff --git a/dwm.h b/dwm.h
index c44da29..25971ac 100644 (file)
--- a/dwm.h
+++ b/dwm.h
@@ -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];
diff --git a/event.c b/event.c
index 0c159c7..88e1b10 100644 (file)
--- a/event.c
+++ b/event.c
@@ -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);
diff --git a/main.c b/main.c
index 33a2a9a..9ea09bf 100644 (file)
--- a/main.c
+++ b/main.c
@@ -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);
diff --git a/tag.c b/tag.c
index 9022371..b20e71e 100644 (file)
--- a/tag.c
+++ b/tag.c
@@ -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(&regex, rule[i].pattern, 0)) {
                                if(!regexec(&regex, 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(&regex);
@@ -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);
 }