URI: 
       dwm-mmnametags-6.6.diff - sites - public wiki contents of suckless.org
  HTML git clone git://git.suckless.org/sites
   DIR Log
   DIR Files
   DIR Refs
       ---
       dwm-mmnametags-6.6.diff (4672B)
       ---
            1 diff --git a/config.def.h b/config.def.h
            2 index 81c3fc0..28daa84 100644
            3 --- a/config.def.h
            4 +++ b/config.def.h
            5 @@ -19,7 +19,8 @@ static const char *colors[][3]      = {
            6  };
            7  
            8  /* tagging */
            9 -static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" };
           10 +#define MAX_TAGLEN 16                        /* altogether */
           11 +static char tags[][MAX_TAGLEN] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" };
           12  
           13  static const Rule rules[] = {
           14          /* xprop(1):
           15 @@ -86,6 +87,7 @@ static const Key keys[] = {
           16          { MODKEY,                       XK_period, focusmon,       {.i = +1 } },
           17          { MODKEY|ShiftMask,             XK_comma,  tagmon,         {.i = -1 } },
           18          { MODKEY|ShiftMask,             XK_period, tagmon,         {.i = +1 } },
           19 +        { MODKEY,                       XK_n,      nametag,        {0} },
           20          TAGKEYS(                        XK_1,                      0)
           21          TAGKEYS(                        XK_2,                      1)
           22          TAGKEYS(                        XK_3,                      2)
           23 diff --git a/dwm.c b/dwm.c
           24 index 4f345ee..5e9dfac 100644
           25 --- a/dwm.c
           26 +++ b/dwm.c
           27 @@ -47,6 +47,7 @@
           28  /* macros */
           29  #define BUTTONMASK              (ButtonPressMask|ButtonReleaseMask)
           30  #define CLEANMASK(mask)         (mask & ~(numlockmask|LockMask) & (ShiftMask|ControlMask|Mod1Mask|Mod2Mask|Mod3Mask|Mod4Mask|Mod5Mask))
           31 +#define SETDMENUMON(m)          m[0] = '0' + selmon->num
           32  #define INTERSECT(x,y,w,h,m)    (MAX(0, MIN((x)+(w),(m)->wx+(m)->ww) - MAX((x),(m)->wx)) \
           33                                 * MAX(0, MIN((y)+(h),(m)->wy+(m)->wh) - MAX((y),(m)->wy)))
           34  #define ISVISIBLE(C)            ((C->tags & C->mon->tagset[C->mon->seltags]))
           35 @@ -129,6 +130,7 @@ struct Monitor {
           36          Monitor *next;
           37          Window barwin;
           38          const Layout *lt[2];
           39 +        char **tags;
           40  };
           41  
           42  typedef struct {
           43 @@ -183,6 +185,7 @@ static void maprequest(XEvent *e);
           44  static void monocle(Monitor *m);
           45  static void motionnotify(XEvent *e);
           46  static void movemouse(const Arg *arg);
           47 +static void nametag(const Arg *arg);
           48  static Client *nexttiled(Client *c);
           49  static void pop(Client *c);
           50  static void propertynotify(XEvent *e);
           51 @@ -433,7 +436,7 @@ buttonpress(XEvent *e)
           52          if (ev->window == selmon->barwin) {
           53                  i = x = 0;
           54                  do
           55 -                        x += TEXTW(tags[i]);
           56 +                        x += TEXTW(m->tags[i]);
           57                  while (ev->x >= x && ++i < LENGTH(tags));
           58                  if (i < LENGTH(tags)) {
           59                          click = ClkTagBar;
           60 @@ -499,6 +502,7 @@ void
           61  cleanupmon(Monitor *mon)
           62  {
           63          Monitor *m;
           64 +        unsigned int i;
           65  
           66          if (mon == mons)
           67                  mons = mons->next;
           68 @@ -508,6 +512,10 @@ cleanupmon(Monitor *mon)
           69          }
           70          XUnmapWindow(dpy, mon->barwin);
           71          XDestroyWindow(dpy, mon->barwin);
           72 +        for (i = 0; i <= LENGTH(tags); i++) {
           73 +                free(mon->tags[i]);
           74 +        }
           75 +        free(mon->tags);
           76          free(mon);
           77  }
           78  
           79 @@ -633,6 +641,7 @@ Monitor *
           80  createmon(void)
           81  {
           82          Monitor *m;
           83 +        unsigned int i;
           84  
           85          m = ecalloc(1, sizeof(Monitor));
           86          m->tagset[0] = m->tagset[1] = 1;
           87 @@ -643,6 +652,14 @@ createmon(void)
           88          m->lt[0] = &layouts[0];
           89          m->lt[1] = &layouts[1 % LENGTH(layouts)];
           90          strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol);
           91 +
           92 +    m->tags = malloc(MAX_TAGLEN * LENGTH(tags));
           93 +
           94 +        for (i = 0; i <= LENGTH(tags); i++) {
           95 +                m->tags[i] = malloc(MAX_TAGLEN);
           96 +                memset(m->tags[i], 0, MAX_TAGLEN);
           97 +                memcpy(m->tags[i], tags[i], MAX_TAGLEN);
           98 +        }
           99          return m;
          100  }
          101  
          102 @@ -720,9 +737,9 @@ drawbar(Monitor *m)
          103          }
          104          x = 0;
          105          for (i = 0; i < LENGTH(tags); i++) {
          106 -                w = TEXTW(tags[i]);
          107 +                w = TEXTW(m->tags[i]);
          108                  drw_setscheme(drw, scheme[m->tagset[m->seltags] & 1 << i ? SchemeSel : SchemeNorm]);
          109 -                drw_text(drw, x, 0, w, bh, lrpad / 2, tags[i], urg & 1 << i);
          110 +                drw_text(drw, x, 0, w, bh, lrpad / 2, m->tags[i], urg & 1 << i);
          111                  if (occ & 1 << i)
          112                          drw_rect(drw, x + boxs, boxs, boxw, boxw,
          113                                  m == selmon && selmon->sel && selmon->sel->tags & 1 << i,
          114 @@ -1201,6 +1218,39 @@ movemouse(const Arg *arg)
          115          }
          116  }
          117  
          118 +void
          119 +nametag(const Arg *arg) {
          120 +        char *p, name[MAX_TAGLEN];
          121 +        FILE *f;
          122 +        int i;
          123 +        char dmenumon[2];
          124 +        char cmd[25];
          125 +
          126 +        SETDMENUMON(dmenumon);
          127 +        memset(cmd, 0, 25);
          128 +        sprintf(cmd, "dmenu -m %s < /dev/null", dmenumon);
          129 +        errno = 0; // popen(3p) says on failure it "may" set errno
          130 +
          131 +        if(!(f = popen(cmd, "r"))) {
          132 +                fprintf(stderr, "dwm: popen 'dmenu < /dev/null' failed%s%s\n", errno ? ": " : "", errno ? strerror(errno) : "");
          133 +                return;
          134 +        }
          135 +        if (!(p = fgets(name, MAX_TAGLEN, f)) && (i = errno) && ferror(f))
          136 +                fprintf(stderr, "dwm: fgets failed: %s\n", strerror(i));
          137 +        if (pclose(f) < 0)
          138 +                fprintf(stderr, "dwm: pclose failed: %s\n", strerror(errno));
          139 +        if(!p)
          140 +                return;
          141 +        if((p = strchr(name, '\n')))
          142 +                *p = '\0';
          143 +
          144 +        for(i = 0; i < LENGTH(tags); i++)
          145 +                if(selmon->tagset[selmon->seltags] & (1 << i)) {
          146 +                        strcpy(selmon->tags[i], name);
          147 +                }
          148 +        drawbars();
          149 +}
          150 +
          151  Client *
          152  nexttiled(Client *c)
          153  {