On Tue, Apr 13, 2021 at 01:10:20PM +0300, Yigit Colakoglu wrote:
> This patch allows the user to provide a second set of tags which are
> displayed when there is a client in that tag.
> 
> ---
>  config.def.h |  5 ++++-
>  dwm.c        | 36 +++++++++++++++++++++---------------
>  2 files changed, 25 insertions(+), 16 deletions(-)
> 
> diff --git a/config.def.h b/config.def.h
> index 1c0b587..53630cf 100644
> --- a/config.def.h
> +++ b/config.def.h
> @@ -19,7 +19,10 @@ static const char *colors[][3]      = {
>  };
> 
>  /* tagging */
> -static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" };
> +static const char *tags[][9] = {
> +     [VacantTags] = {"1", "2", "3", "4", "5", "6", "7", "8", "9"},
> +     [BusyTags]   = {"A", "B", "C", "D", "E", "F", "G", "H", "I"}
> +};
> 
>  static const Rule rules[] = {
>       /* xprop(1):
> diff --git a/dwm.c b/dwm.c
> index b0b3466..c7b8ceb 100644
> --- a/dwm.c
> +++ b/dwm.c
> @@ -54,7 +54,7 @@
>  #define MOUSEMASK               (BUTTONMASK|PointerMotionMask)
>  #define WIDTH(X)                ((X)->w + 2 * (X)->bw)
>  #define HEIGHT(X)               ((X)->h + 2 * (X)->bw)
> -#define TAGMASK                 ((1 << LENGTH(tags)) - 1)
> +#define TAGMASK                 ((1 << LENGTH(tags[VacantTags])) - 1)
>  #define TEXTW(X)                (drw_fontset_getwidth(drw, (X)) + lrpad)
> 
>  /* enums */
> @@ -66,6 +66,7 @@ enum { NetSupported, NetWMName, NetWMState, NetWMCheck,
>  enum { WMProtocols, WMDelete, WMState, WMTakeFocus, WMLast }; /* default 
> atoms */
>  enum { ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle,
>         ClkClientWin, ClkRootWin, ClkLast }; /* clicks */
> +enum { VacantTags, BusyTags }; /* Tag Types */
> 
>  typedef union {
>       int i;
> @@ -273,7 +274,7 @@ static Window root, wmcheckwin;
>  #include "config.h"
> 
>  /* compile-time check if all tags fit into an unsigned int bit array. */
> -struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; };
> +struct NumTags { char limitexceeded[LENGTH(tags[VacantTags]) > 31 ? -1 : 1]; 
> };
> 
>  /* function implementations */
>  void
> @@ -417,7 +418,7 @@ attachstack(Client *c)
>  void
>  buttonpress(XEvent *e)
>  {
> -     unsigned int i, x, click;
> +     unsigned int i, x, click, occ = 0;
>       Arg arg = {0};
>       Client *c;
>       Monitor *m;
> @@ -432,10 +433,16 @@ buttonpress(XEvent *e)
>       }
>       if (ev->window == selmon->barwin) {
>               i = x = 0;
> -             do
> -                     x += TEXTW(tags[i]);
> -             while (ev->x >= x && ++i < LENGTH(tags));
> -             if (i < LENGTH(tags)) {
> +
> +             for (c = m->clients; c; c = c->next)
> +                     occ |= c->tags == 255 ? 0 : c->tags;
> +             do {
> +                     if (!(occ & 1 << i || m->tagset[m->seltags] & 1 << i))
> +                             x += TEXTW(tags[VacantTags][i]);
> +                     else
> +                             x += TEXTW(tags[BusyTags][i]);
> +             }while (ev->x >= x && ++i < LENGTH(tags[VacantTags]));
> +             if (i < LENGTH(tags[VacantTags])) {
>                       click = ClkTagBar;
>                       arg.ui = 1 << i;
>               } else if (ev->x < x + blw)
> @@ -710,19 +717,18 @@ drawbar(Monitor *m)
>       }
> 
>       for (c = m->clients; c; c = c->next) {
> -             occ |= c->tags;
> +             occ |= c->tags == 255 ? 0 : c->tags;
>               if (c->isurgent)
>                       urg |= c->tags;
>       }
>       x = 0;
> -     for (i = 0; i < LENGTH(tags); i++) {
> -             w = TEXTW(tags[i]);
> +     for (i = 0; i < LENGTH(tags[VacantTags]); i++) {
> +             w = bh;
>               drw_setscheme(drw, scheme[m->tagset[m->seltags] & 1 << i ? 
> SchemeSel : SchemeNorm]);
> -             drw_text(drw, x, 0, w, bh, lrpad / 2, tags[i], urg & 1 << i);
> -             if (occ & 1 << i)
> -                     drw_rect(drw, x + boxs, boxs, boxw, boxw,
> -                             m == selmon && selmon->sel && selmon->sel->tags 
> & 1 << i,
> -                             urg & 1 << i);
> +             if (!(occ & 1 << i || m->tagset[m->seltags] & 1 << i))
> +                     drw_text(drw, x, 0, w, bh, lrpad / 2, 
> tags[VacantTags][i], urg & 1 << i);
> +             else
> +                     drw_text(drw, x, 0, w, bh, lrpad / 2, 
> tags[BusyTags][i], urg & 1 << i);
>               x += w;
>       }
>       w = blw = TEXTW(m->ltsymbol);
> --
> 2.31.1
> 
> 

No thanks, but you can upload it to the wiki.

-- 
Kind regards,
Hiltjo

Reply via email to