diff -r 81ebf60c6c8b config.default.h --- a/config.default.h Tue Aug 15 10:45:14 2006 +0200 +++ b/config.default.h Sun Aug 20 00:33:36 2006 +0200 @@ -4,7 +4,7 @@ */ #define TAGS \ -const char *tags[] = { "0", "1", "2", "3", "4", NULL }; +char *tags[] = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }; #define DEFMODE dotile /* dofloat */ #define DEFTAG 1 /* index */ @@ -28,11 +28,21 @@ static Key key[] = { \ { MODKEY|ShiftMask, XK_2, tag, { .i = 2 } }, \ { MODKEY|ShiftMask, XK_3, tag, { .i = 3 } }, \ { MODKEY|ShiftMask, XK_4, tag, { .i = 4 } }, \ + { MODKEY|ShiftMask, XK_5, tag, { .i = 5 } }, \ + { MODKEY|ShiftMask, XK_6, tag, { .i = 6 } }, \ + { MODKEY|ShiftMask, XK_7, tag, { .i = 7 } }, \ + { MODKEY|ShiftMask, XK_8, tag, { .i = 8 } }, \ + { MODKEY|ShiftMask, XK_9, tag, { .i = 9 } }, \ { MODKEY|ControlMask|ShiftMask, XK_0, toggletag, { .i = 0 } }, \ { MODKEY|ControlMask|ShiftMask, XK_1, toggletag, { .i = 1 } }, \ { MODKEY|ControlMask|ShiftMask, XK_2, toggletag, { .i = 2 } }, \ { MODKEY|ControlMask|ShiftMask, XK_3, toggletag, { .i = 3 } }, \ { MODKEY|ControlMask|ShiftMask, XK_4, toggletag, { .i = 4 } }, \ + { MODKEY|ControlMask|ShiftMask, XK_5, toggletag, { .i = 5 } }, \ + { MODKEY|ControlMask|ShiftMask, XK_6, toggletag, { .i = 6 } }, \ + { MODKEY|ControlMask|ShiftMask, XK_7, toggletag, { .i = 7 } }, \ + { MODKEY|ControlMask|ShiftMask, XK_8, toggletag, { .i = 8 } }, \ + { MODKEY|ControlMask|ShiftMask, XK_9, toggletag, { .i = 9 } }, \ { MODKEY|ShiftMask, XK_c, killclient, { 0 } }, \ { MODKEY, XK_space, togglemode, { 0 } }, \ { MODKEY, XK_0, view, { .i = 0 } }, \ @@ -40,12 +50,22 @@ static Key key[] = { \ { MODKEY, XK_2, view, { .i = 2 } }, \ { MODKEY, XK_3, view, { .i = 3 } }, \ { MODKEY, XK_4, view, { .i = 4 } }, \ + { MODKEY, XK_5, view, { .i = 5 } }, \ + { MODKEY, XK_6, view, { .i = 6 } }, \ + { MODKEY, XK_7, view, { .i = 7 } }, \ + { MODKEY, XK_8, view, { .i = 8 } }, \ + { MODKEY, XK_9, view, { .i = 9 } }, \ { MODKEY|ControlMask, XK_0, toggleview, { .i = 0 } }, \ { MODKEY|ControlMask, XK_1, toggleview, { .i = 1 } }, \ { MODKEY|ControlMask, XK_2, toggleview, { .i = 2 } }, \ { MODKEY|ControlMask, XK_3, toggleview, { .i = 3 } }, \ { MODKEY|ControlMask, XK_4, toggleview, { .i = 4 } }, \ - { MODKEY|ShiftMask, XK_q, quit, { 0 } }, \ + { MODKEY|ControlMask, XK_5, toggleview, { .i = 5 } }, \ + { MODKEY|ControlMask, XK_6, toggleview, { .i = 6 } }, \ + { MODKEY|ControlMask, XK_7, toggleview, { .i = 7 } }, \ + { MODKEY|ControlMask, XK_8, toggleview, { .i = 8 } }, \ + { MODKEY|ControlMask, XK_9, toggleview, { .i = 9 } }, \ + { MODKEY|ShiftMask, XK_q, quit, { 0 } }, \ }; #define RULES \ diff -r 81ebf60c6c8b dwm.h --- a/dwm.h Tue Aug 15 10:45:14 2006 +0200 +++ b/dwm.h Sun Aug 20 00:33:36 2006 +0200 @@ -10,6 +10,9 @@ #define BUTTONMASK (ButtonPressMask | ButtonReleaseMask) #define MOUSEMASK (BUTTONMASK | PointerMotionMask) #define PROTODELWIN 1 +#define MAXTAGS 20 +#define MAXSTATUS 1024 +#define CMDLEN 8 typedef union Arg Arg; typedef struct Client Client; @@ -67,8 +70,8 @@ struct Client { Window title; }; -extern const char *tags[]; -extern char stext[1024]; +extern char *tags[]; +extern char stext[MAXSTATUS]; extern int screen, sx, sy, sw, sh, bx, by, bw, bh, mw; extern unsigned int ntags, numlockmask; extern void (*handler[LASTEvent])(XEvent *); @@ -130,6 +133,8 @@ extern void toggletag(Arg *arg); extern void toggletag(Arg *arg); extern void toggleview(Arg *arg); extern void view(Arg *arg); +extern void addtag(); +extern void deltag(); /* util.c */ extern void *emallocz(unsigned int size); diff -r 81ebf60c6c8b main.c --- a/main.c Tue Aug 15 10:45:14 2006 +0200 +++ b/main.c Sun Aug 20 00:33:36 2006 +0200 @@ -93,7 +93,7 @@ xerrorstart(Display *dsply, XErrorEvent /* extern */ -char stext[1024]; +char stext[MAXSTATUS]; Bool *seltag; int screen, sx, sy, sw, sh, bx, by, bw, bh, mw; unsigned int ntags, numlockmask; @@ -296,6 +296,12 @@ main(int argc, char *argv[]) stext[strlen(stext) - 1] = 0; else strcpy(stext, "broken pipe"); + if (0 == strncmp("add tag ", stext, CMDLEN)){ + addtag(); + } + else if(0 == strncmp("del tag ", stext, CMDLEN)){ + deltag(); + } drawstatus(); } } diff -r 81ebf60c6c8b tag.c --- a/tag.c Tue Aug 15 10:45:14 2006 +0200 +++ b/tag.c Sun Aug 20 00:33:36 2006 +0200 @@ -324,3 +324,69 @@ view(Arg *arg) seltag[arg->i] = True; arrange(NULL); } + +void +addtag() +{ + int n, t; + Client *c; + char *tg = emallocz(MAXSTATUS); + Bool *st, *ct; + + strcpy(tg, stext); + + if (ntags < MAXTAGS) + { + tags[ntags] = emallocz(sizeof(tg)); + strcpy((char*)tags[ntags], tg+CMDLEN); + sprintf(stext, "added tag: %s", tg+CMDLEN); + ntags++; + + /* adjust seltag */ + seltag = (Bool *) realloc(seltag, sizeof(Bool) * ntags); + seltag[ntags-1]=False; + + /* adjust tags for every client */ + for(n = 0, c = clients; c; c = c->next){ + c->tags = (Bool *) realloc(c->tags, sizeof(Bool) * ntags); + c->tags[ntags-1]=False; + } + } + else { + sprintf(stext, "rejected tag: %s", tg); + } +} + +void +deltag() +{ + int n, t; + int deltg = -1; + Client *c; + char *tg = emallocz(MAXSTATUS); + + strcpy(tg, stext); + tg += CMDLEN; + + /* shift tag structures */ + for(t=0; t=0 ){ + for(t=deltg; tnext){ + /* send to tag "zero" */ + if (c->tags[deltg]) c->tags[0]=True; + for(t=deltg; ttags[t] = c->tags[t+1]; + c->tags[ntags-1]=False; + } + tags[ntags-1]=False; + seltag[ntags-1]=False; + ntags--; + sprintf(stext, "removed tag: %s", tg); + } + else { + sprintf(stext, "ignoring tag: %s", tg); + } +}