Added alttagsdecoration patch.

Unified tag icon handling while adding support for different icons per monitor.

In general LENGTH(tags) has been replaced with a NUMTAGS macro (defaulting to 9)
and the tags[] array has been replaced with a tagicons[][] array, access to which
is done through a single function tagicon.

This allows one central place where alternative tags, alttagsdecoration, or other
future tags logic is handled. This also gives a consistent display of tags
regardless of the module that presents tags.

Additionally the monitor index has been integrated into dwm for easier access.
pull/48/head
bakkeby 4 years ago
parent df57bdeb64
commit f45acf8795

@ -15,6 +15,8 @@ Refer to [https://dwm.suckless.org/](https://dwm.suckless.org/) for details on t
### Changelog:
2020-08-25 - Unified tag icon handling while adding support for different icons per monitor. Added alttagsdecoration patch.
2020-08-22 - Added logic to auto-hide bars if nothing is drawn on them (e.g. for standalone bars that only show certain clients). Added clientindicators patch and unified indicator code. Simplified Pango integration by settling on common function signatures.
2020-08-21 - Simplification of color configuration; settling on a set of color schemes that is shared between multiple patches (urgentborder, floatborder and titlecolor patches made non-optional)
@ -162,6 +164,9 @@ Refer to [https://dwm.suckless.org/](https://dwm.suckless.org/) for details on t
- [alternativetags](https://dwm.suckless.org/patches/alternativetags/)
- adds alternative tags which can be toggled on the fly for the sole purpose of providing visual aid
- [alttagsdecoration](https://dwm.suckless.org/patches/alttagsdecoration/)
- provides the ability to use alternative text for tags which contain at least one window
- [alwaysfullscreen](https://dwm.suckless.org/patches/alwaysfullscreen/)
- prevents the focus to drift from the active fullscreen client when using focusstack\(\)
@ -412,7 +417,7 @@ Refer to [https://dwm.suckless.org/](https://dwm.suckless.org/) for details on t
- [rotatestack](https://dwm.suckless.org/patches/rotatestack/)
- let's you rotate through the stack using keyboard shortcuts
- [roundedcorners](https://github.com/mitchweaver/suckless/blob/master/dwm/patches_mitch/mitch-06-rounded_corners-db6093f6ec1bb884f7540f2512935b5254750b30.patch)
- [roundedcorners](https://github.com/mitchweaver/suckless/blob/master/dwm/patches/mitch-06-rounded_corners-f04cac6d6e39cd9e3fc4fae526e3d1e8df5e34b2.patch)
- adds rounded corners to client windows
- [savefloats](https://dwm.suckless.org/patches/save_floats/)

@ -153,15 +153,15 @@ static char selfloatbgcolor[] = "#117799";
static const unsigned int baralpha = 0xd0;
static const unsigned int borderalpha = OPAQUE;
static const unsigned int alphas[][3] = {
/* fg bg border */
[SchemeNorm] = { OPAQUE, baralpha, borderalpha },
[SchemeSel] = { OPAQUE, baralpha, borderalpha },
[SchemeTitleNorm] = { OPAQUE, baralpha, borderalpha },
[SchemeTitleSel] = { OPAQUE, baralpha, borderalpha },
[SchemeTagsNorm] = { OPAQUE, baralpha, borderalpha },
[SchemeTagsSel] = { OPAQUE, baralpha, borderalpha },
[SchemeHid] = { OPAQUE, baralpha, borderalpha },
[SchemeUrg] = { OPAQUE, baralpha, borderalpha },
/* fg bg border */
[SchemeNorm] = { OPAQUE, baralpha, borderalpha },
[SchemeSel] = { OPAQUE, baralpha, borderalpha },
[SchemeTitleNorm] = { OPAQUE, baralpha, borderalpha },
[SchemeTitleSel] = { OPAQUE, baralpha, borderalpha },
[SchemeTagsNorm] = { OPAQUE, baralpha, borderalpha },
[SchemeTagsSel] = { OPAQUE, baralpha, borderalpha },
[SchemeHid] = { OPAQUE, baralpha, borderalpha },
[SchemeUrg] = { OPAQUE, baralpha, borderalpha },
#if BAR_FLEXWINTITLE_PATCH
[SchemeFlexActTTB] = { OPAQUE, baralpha, borderalpha },
[SchemeFlexActLTR] = { OPAQUE, baralpha, borderalpha },
@ -203,15 +203,15 @@ static const unsigned int alphas[][3] = {
static const char title_bg_dark[] = "#303030";
static const char title_bg_light[] = "#fdfdfd";
static const int color_ptrs[][ColCount] = {
/* fg bg border float */
[SchemeNorm] = { -1, -1, 5, 12 },
[SchemeSel] = { -1, -1, 11, 13 },
[SchemeTitleNorm] = { 6, -1, -1, -1 },
[SchemeTitleSel] = { 6, -1, -1, -1 },
[SchemeTagsNorm] = { 2, 0, 0, -1 },
[SchemeTagsSel] = { 6, 5, 5, -1 },
[SchemeHid] = { 5, 0, 0, -1 },
[SchemeUrg] = { 7, 9, 9, 15 },
/* fg bg border float */
[SchemeNorm] = { -1, -1, 5, 12 },
[SchemeSel] = { -1, -1, 11, 13 },
[SchemeTitleNorm] = { 6, -1, -1, -1 },
[SchemeTitleSel] = { 6, -1, -1, -1 },
[SchemeTagsNorm] = { 2, 0, 0, -1 },
[SchemeTagsSel] = { 6, 5, 5, -1 },
[SchemeHid] = { 5, 0, 0, -1 },
[SchemeUrg] = { 7, 9, 9, 15 },
};
#endif // BAR_VTCOLORS_PATCH
@ -264,15 +264,15 @@ static char *colors[][ColCount] = {
#if BAR_POWERLINE_STATUS_PATCH
static char *statuscolors[][ColCount] = {
/* fg bg border float */
[SchemeNorm] = { normfgcolor, normbgcolor, normbordercolor, normfloatcolor },
[SchemeSel] = { selfgcolor, selbgcolor, selbordercolor, selfloatcolor },
[SchemeTitleNorm] = { titlenormfgcolor, titlenormbgcolor, titlenormbordercolor, titlenormfloatcolor },
[SchemeTitleSel] = { titleselfgcolor, titleselbgcolor, titleselbordercolor, titleselfloatcolor },
[SchemeTagsNorm] = { tagsnormfgcolor, tagsnormbgcolor, tagsnormbordercolor, tagsnormfloatcolor },
[SchemeTagsSel] = { tagsselfgcolor, tagsselbgcolor, tagsselbordercolor, tagsselfloatcolor },
[SchemeHid] = { hidfgcolor, hidbgcolor, hidbordercolor, hidfloatcolor },
[SchemeUrg] = { urgfgcolor, urgbgcolor, urgbordercolor, urgfloatcolor },
/* fg bg border float */
[SchemeNorm] = { normfgcolor, normbgcolor, normbordercolor, normfloatcolor },
[SchemeSel] = { selfgcolor, selbgcolor, selbordercolor, selfloatcolor },
[SchemeTitleNorm] = { titlenormfgcolor, titlenormbgcolor, titlenormbordercolor, titlenormfloatcolor },
[SchemeTitleSel] = { titleselfgcolor, titleselbgcolor, titleselbordercolor, titleselfloatcolor },
[SchemeTagsNorm] = { tagsnormfgcolor, tagsnormbgcolor, tagsnormbordercolor, tagsnormfloatcolor },
[SchemeTagsSel] = { tagsselfgcolor, tagsselbgcolor, tagsselbordercolor, tagsselfloatcolor },
[SchemeHid] = { hidfgcolor, hidbgcolor, hidbordercolor, hidfloatcolor },
[SchemeUrg] = { urgfgcolor, urgbgcolor, urgbordercolor, urgfloatcolor },
};
#endif // BAR_POWERLINE_STATUS_PATCH
@ -295,15 +295,38 @@ static Sp scratchpads[] = {
};
#endif // SCRATCHPADS_PATCH
/* tagging */
#if BAR_EWMHTAGS_PATCH
static char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" };
#else
static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" };
#endif // BAR_EWMHTAGS_PATCH
#if BAR_ALTERNATIVE_TAGS_PATCH
static const char *tagsalt[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" };
#endif // BAR_ALTERNATIVE_TAGS_PATCH
/* Tags
* In a traditional dwm the number of tags in use can be changed simply by changing the number
* of strings in the tags array. This build does things a bit different which has some added
* benefits. If you need to change the number of tags here then change the NUMTAGS macro in dwm.c.
*
* Examples:
*
* 1) static char *tagicons[][NUMTAGS*2] = {
* [DEFAULT_TAGS] = { "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I" },
* }
*
* 2) static char *tagicons[][1] = {
* [DEFAULT_TAGS] = { "" },
* }
*
* The first example would result in the tags on the first monitor to be 1 through 9, while the
* tags for the second monitor would be named A through I. A third monitor would start again at
* 1 through 9 while the tags on a fourth monitor would also be named A through I. Note the tags
* count of NUMTAGS*2 in the array initialiser which defines how many tag text / icon exists in
* the array. This can be changed to *3 to add separate icons for a third monitor.
*
* For the second example each tag would be represented as a bullet point. Both cases work the
* same from a technical standpoint - the icon index is derived from the tag index and the monitor
* index. If the icon index is is greater than the number of tag icons then it will wrap around
* until it an icon matches. Similarly if there are two tag icons then it would alternate between
* them. This works seamlessly with alternative tags and alttagsdecoration patches.
*/
static char *tagicons[][NUMTAGS] = {
[DEFAULT_TAGS] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" },
[ALTERNATIVE_TAGS] = { "A", "B", "C", "D", "E", "F", "G", "H", "I" },
[ALT_TAGS_DECORATION] = { "<1>", "<2>", "<3>", "<4>", "<5>", "<6>", "<7>", "<8>", "<9>" },
};
#if BAR_TAGGRID_PATCH
/* grid of tags */
@ -461,6 +484,7 @@ static const BarRule barrules[] = {
{ -1, 1, BAR_ALIGN_LEFT, width_wintitle_floating, draw_wintitle_floating, click_wintitle_floating, "wintitle_floating" },
#endif // BAR_WINTITLE_FLOATING_PATCH
#endif // BAR_FLEXWINTITLE_PATCH
{ NULL }
};
#if DWMC_PATCH

45
dwm.c

@ -45,6 +45,12 @@
#include "drw.h"
#include "util.h"
#if BAR_FLEXWINTITLE_PATCH
#ifndef FLEXTILE_DELUXE_LAYOUT
#define FLEXTILE_DELUXE_LAYOUT 1
#endif
#endif
#if BAR_PANGO_PATCH
#include <pango/pango.h>
#endif // BAR_PANGO_PATCH
@ -57,6 +63,7 @@
#endif // SPAWNCMD_PATCH
/* macros */
#define NUMTAGS 9
#define BARRULES 20
#define BUTTONMASK (ButtonPressMask|ButtonReleaseMask)
#define CLEANMASK(mask) (mask & ~(numlockmask|LockMask) & (ShiftMask|ControlMask|Mod1Mask|Mod2Mask|Mod3Mask|Mod4Mask|Mod5Mask))
@ -79,12 +86,12 @@
#define HEIGHT(X) ((X)->h + 2 * (X)->bw)
#define WTYPE "_NET_WM_WINDOW_TYPE_"
#if SCRATCHPADS_PATCH
#define NUMTAGS (LENGTH(tags) + LENGTH(scratchpads))
#define TAGMASK ((1 << NUMTAGS) - 1)
#define SPTAG(i) ((1 << LENGTH(tags)) << (i))
#define SPTAGMASK (((1 << LENGTH(scratchpads))-1) << LENGTH(tags))
#define TOTALTAGS (NUMTAGS + LENGTH(scratchpads))
#define TAGMASK ((1 << TOTALTAGS) - 1)
#define SPTAG(i) ((1 << NUMTAGS) << (i))
#define SPTAGMASK (((1 << LENGTH(scratchpads))-1) << NUMTAGS)
#else
#define TAGMASK ((1 << LENGTH(tags)) - 1)
#define TAGMASK ((1 << NUMTAGS) - 1)
#endif // SCRATCHPADS_PATCH
#define TEXTWM(X) (drw_fontset_getwidth(drw, (X), True) + lrpad)
#define TEXTW(X) (drw_fontset_getwidth(drw, (X), False) + lrpad)
@ -364,6 +371,7 @@ typedef struct {
typedef struct Pertag Pertag;
#endif // PERTAG_PATCH
struct Monitor {
int index;
char ltsymbol[16];
float mfact;
#if FLEXTILE_DELUXE_LAYOUT
@ -670,9 +678,9 @@ static Window root, wmcheckwin;
/* compile-time check if all tags fit into an unsigned int bit array. */
#if SCRATCHPAD_ALT_1_PATCH
struct NumTags { char limitexceeded[LENGTH(tags) > 30 ? -1 : 1]; };
struct NumTags { char limitexceeded[NUMTAGS > 30 ? -1 : 1]; };
#else
struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; };
struct NumTags { char limitexceeded[NUMTAGS > 31 ? -1 : 1]; };
#endif // SCRATCHPAD_ALT_1_PATCH
/* function implementations */
@ -911,7 +919,7 @@ attachstack(Client *c)
void
buttonpress(XEvent *e)
{
int click, i, r, mi;
int click, i, r;
Arg arg = {0};
Client *c;
Monitor *m;
@ -931,14 +939,13 @@ buttonpress(XEvent *e)
focus(NULL);
}
for (mi = 0, m = mons; m && m != selmon; m = m->next, mi++); // get the monitor index
for (bar = selmon->bar; bar; bar = bar->next) {
if (ev->window == bar->win) {
for (r = 0; r < LENGTH(barrules); r++) {
br = &barrules[r];
if (br->bar != bar->idx || (br->monitor == 'A' && m != selmon) || br->clickfunc == NULL)
continue;
if (br->monitor != 'A' && br->monitor != -1 && br->monitor != mi)
if (br->monitor != 'A' && br->monitor != -1 && br->monitor != bar->mon->index)
continue;
if (bar->x[r] <= ev->x && ev->x <= bar->x[r] + bar->w[r]) {
carg.rel_x = ev->x - bar->x[r];
@ -1133,8 +1140,8 @@ clientmessage(XEvent *e)
selmon = c->mon;
focus(c);
} else {
for (i = 0; i < LENGTH(tags) && !((1 << i) & c->tags); i++);
if (i < LENGTH(tags)) {
for (i = 0; i < NUMTAGS && !((1 << i) & c->tags); i++);
if (i < NUMTAGS) {
const Arg a = {.ui = 1 << i};
selmon = c->mon;
view(&a);
@ -1312,8 +1319,8 @@ createmon(void)
m->gappoh = gappoh;
m->gappov = gappov;
#endif // VANITYGAPS_PATCH
for (mi = 0, mon = mons; mon; mon = mon->next, mi++); // monitor index
m->index = mi;
#if MONITOR_RULES_PATCH
for (j = 0; j < LENGTH(monrules); j++) {
mr = &monrules[j];
@ -1374,7 +1381,7 @@ createmon(void)
if (!(m->pertag = (Pertag *)calloc(1, sizeof(Pertag))))
die("fatal: could not malloc() %u bytes\n", sizeof(Pertag));
m->pertag->curtag = m->pertag->prevtag = 1;
for (i = 0; i <= LENGTH(tags); i++) {
for (i = 0; i <= NUMTAGS; i++) {
#if FLEXTILE_DELUXE_LAYOUT
m->pertag->nstacks[i] = m->nstack;
#endif // FLEXTILE_DELUXE_LAYOUT
@ -1522,14 +1529,12 @@ drawbarwin(Bar *bar)
{
if (!bar->win)
return;
Monitor *mon;
int r, w, mi, total_drawn = 0;
int r, w, total_drawn = 0;
int rx, lx, rw, lw; // bar size, split between left and right if a center module is added
const BarRule *br;
BarWidthArg warg = { 0 };
BarDrawArg darg = { 0, 0 };
for (mi = 0, mon = mons; mon && mon != bar->mon; mon = mon->next, mi++); // get the monitor index
rw = lw = bar->bw;
rx = lx = 0;
@ -1539,7 +1544,7 @@ drawbarwin(Bar *bar)
br = &barrules[r];
if (br->bar != bar->idx || br->drawfunc == NULL || (br->monitor == 'A' && bar->mon != selmon))
continue;
if (br->monitor != 'A' && br->monitor != -1 && br->monitor != mi)
if (br->monitor != 'A' && br->monitor != -1 && br->monitor != bar->mon->index)
continue;
drw_setscheme(drw, scheme[SchemeNorm]);
warg.max_width = (br->alignment < BAR_ALIGN_RIGHT_LEFT ? lw : rw);
@ -3630,7 +3635,6 @@ updatebarpos(Monitor *m)
bar->by = -bh - y_pad;
if (!m->showbar)
return;
for (num_bars = 0, bar = m->bar; bar; bar = bar->next) {
if (!bar->showbar)
continue;
@ -3639,7 +3643,6 @@ updatebarpos(Monitor *m)
num_bars++;
}
m->wh = m->wh - y_pad * num_bars - bh * num_bars;
for (bar = m->bar; bar; bar = bar->next)
bar->by = (bar->topbar ? m->wy - bh : m->wy + m->wh);
}
@ -3720,6 +3723,8 @@ updategeom(void)
cleanupmon(m);
}
}
for (i = 0, m = mons; m; m = m->next, i++)
m->index = i;
free(unique);
} else
#endif /* XINERAMA */

@ -8,15 +8,19 @@ setcurrentdesktop(void)
void
setdesktopnames(void)
{
int i;
XTextProperty text;
Xutf8TextListToTextProperty(dpy, tags, TAGSLENGTH, XUTF8StringStyle, &text);
char *tags[NUMTAGS];
for (i = 0; i < NUMTAGS; i++)
tags[i] = tagicon(selmon, i);
Xutf8TextListToTextProperty(dpy, tags, NUMTAGS, XUTF8StringStyle, &text);
XSetTextProperty(dpy, root, &text, netatom[NetDesktopNames]);
}
void
setnumdesktops(void)
{
long data[] = { TAGSLENGTH };
long data[] = { NUMTAGS };
XChangeProperty(dpy, root, netatom[NetNumberOfDesktops], XA_CARDINAL, 32, PropModeReplace, (unsigned char *)data, 1);
}

@ -1,5 +1,3 @@
#define TAGSLENGTH (LENGTH(tags))
static void setcurrentdesktop(void);
static void setdesktopnames(void);
static void setnumdesktops(void);

@ -198,7 +198,7 @@ flextitledraw(Monitor *m, Client *c, int unused, int x, int w, int tabscheme, Ar
XFillRectangle(drw->dpy, drw->drawable, drw->gc, x + w, 0, 1, bh);
}
/* Optional tags icons */
for (i = 0; i < LENGTH(tags); i++) {
for (i = 0; i < NUMTAGS; i++) {
if ((m->tagset[m->seltags] >> i) & 1)
nviewtags++;
if ((c->tags >> i) & 1)

@ -50,13 +50,13 @@ drawindicator(Monitor *m, Client *c, unsigned int occ, int x, int w, unsigned in
case INDICATOR_RIGHT_TAGS:
if (!c)
break;
for (i = 0; i < LENGTH(tags); i++) {
for (i = 0; i < NUMTAGS; i++) {
drw_rect(drw,
( x + w - 2 - ((LENGTH(tags) / TAGSROWS) * TAGSPX)
- (i % (LENGTH(tags)/TAGSROWS)) + ((i % (LENGTH(tags) / TAGSROWS)) * TAGSPX)
( x + w - 2 - ((NUMTAGS / TAGSROWS) * TAGSPX)
- (i % (NUMTAGS/TAGSROWS)) + ((i % (NUMTAGS / TAGSROWS)) * TAGSPX)
),
( 2 + ((i / (LENGTH(tags)/TAGSROWS)) * TAGSPX)
- ((i / (LENGTH(tags)/TAGSROWS)))
( 2 + ((i / (NUMTAGS/TAGSROWS)) * TAGSPX)
- ((i / (NUMTAGS/TAGSROWS)))
),
TAGSPX, TAGSPX, (c->tags >> i) & 1, 0
);

@ -10,16 +10,12 @@ width_pwrl_tags(Bar *bar, BarWidthArg *a)
occ |= c->tags == 255 ? 0 : c->tags;
#endif // BAR_HIDEVACANTTAGS_PATCH
for (w = 0, i = 0; i < LENGTH(tags); i++) {
for (w = 0, i = 0; i < NUMTAGS; i++) {
#if BAR_HIDEVACANTTAGS_PATCH
if (!(occ & 1 << i || bar->mon->tagset[bar->mon->seltags] & 1 << i))
continue;
#endif // BAR_HIDEVACANTTAGS_PATCH
#if BAR_ALTERNATIVE_TAGS_PATCH
w += selmon->alttag ? TEXTW(tagsalt[i]) : TEXTW(tags[i]) + plw;
#else
w += TEXTW(tags[i]) + plw;
#endif // BAR_ALTERNATIVE_TAGS_PATCH
w += TEXTW(tagicon(bar->mon, i)) + plw;
}
return w + lrpad;
}
@ -31,6 +27,7 @@ draw_pwrl_tags(Bar *bar, BarDrawArg *a)
int invert;
int plw = drw->fonts->h / 2 + 1;
unsigned int i, occ = 0, urg = 0;
char *icon;
Client *c;
Clr *prevscheme, *nxtscheme;
@ -45,14 +42,16 @@ draw_pwrl_tags(Bar *bar, BarDrawArg *a)
}
x = a->x;
prevscheme = scheme[SchemeNorm];
for (i = 0; i < LENGTH(tags); i++) {
for (i = 0; i < NUMTAGS; i++) {
#if BAR_HIDEVACANTTAGS_PATCH
/* do not draw vacant tags */
if (!(occ & 1 << i || bar->mon->tagset[bar->mon->seltags] & 1 << i))
continue;
#endif // BAR_HIDEVACANTTAGS_PATCH
icon = tagicon(bar->mon, i);
invert = 0;
w = TEXTW(tags[i]);
w = TEXTW(icon);
drw_settrans(drw, prevscheme, (nxtscheme = scheme[bar->mon->tagset[bar->mon->seltags] & 1 << i ? SchemeSel : SchemeNorm]));
#if BAR_POWERLINE_TAGS_SLASH_PATCH
drw_arrow(drw, x, 0, plw, bh, 1, 1);
@ -61,7 +60,7 @@ draw_pwrl_tags(Bar *bar, BarDrawArg *a)
#endif // BAR_POWERLINE_TAGS_SLASH_PATCH
x += plw;
drw_setscheme(drw, nxtscheme);
drw_text(drw, x, 0, w, bh, lrpad / 2, tags[i], invert, False);
drw_text(drw, x, 0, w, bh, lrpad / 2, icon, invert, False);
drawindicator(bar->mon, NULL, occ, x, w, i, -1, invert, tagindicatortype);
x += w;
prevscheme = nxtscheme;
@ -94,13 +93,9 @@ click_pwrl_tags(Bar *bar, Arg *arg, BarClickArg *a)
if (!(occ & 1 << i || bar->mon->tagset[bar->mon->seltags] & 1 << i))
continue;
#endif // BAR_HIDEVACANTTAGS_PATCH
#if BAR_ALTERNATIVE_TAGS_PATCH
x += selmon->alttag ? TEXTW(tagsalt[i]) : TEXTW(tags[i]) + plw;
#else
x += TEXTW(tags[i]) + plw;
#endif
} while (a->rel_x >= x && ++i < LENGTH(tags));
if (i < LENGTH(tags)) {
x += TEXTW(tagicon(bar->mon, i)) + plw;
} while (a->rel_x >= x && ++i < NUMTAGS);
if (i < NUMTAGS) {
arg->ui = 1 << i;
}
return ClkTagBar;

@ -69,7 +69,7 @@ bartabdraw(Monitor *m, Client *c, int unused, int x, int w, int groupactive, Arg
XFillRectangle(drw->dpy, drw->drawable, drw->gc, x + w, 0, 1, bh);
}
/* Optional tags icons */
for (i = 0; i < LENGTH(tags); i++) {
for (i = 0; i < NUMTAGS; i++) {
if ((m->tagset[m->seltags] >> i) & 1)
nviewtags++;
if ((c->tags >> i) & 1)

@ -1,7 +1,7 @@
int
width_taggrid(Bar *bar, BarWidthArg *a)
{
return (bh / 2) * (LENGTH(tags) / tagrows + ((LENGTH(tags) % tagrows > 0) ? 1 : 0)) + lrpad;
return (bh / 2) * (NUMTAGS / tagrows + ((NUMTAGS % tagrows > 0) ? 1 : 0)) + lrpad;
}
int
@ -17,17 +17,17 @@ draw_taggrid(Bar *bar, BarDrawArg *a)
max_x = x = a->x + lrpad / 2;
h = bh / tagrows;
y = 0;
columns = LENGTH(tags) / tagrows + ((LENGTH(tags) % tagrows > 0) ? 1 : 0);
columns = NUMTAGS / tagrows + ((NUMTAGS % tagrows > 0) ? 1 : 0);
/* Firstly we will fill the borders of squares */
XSetForeground(drw->dpy, drw->gc, scheme[SchemeTagsNorm][ColBg].pixel);
XFillRectangle(dpy, drw->drawable, drw->gc, x, y, h*columns + 1, bh);
/* We will draw LENGTH(tags) squares in tagraws raws. */
/* We will draw NUMTAGS squares in tagraws raws. */
for (j = 0, i = 0; j < tagrows; j++) {
x = a->x + lrpad / 2;
for (k = 0; k < columns; k++, i++) {
if (i < LENGTH(tags)) {
if (i < NUMTAGS) {
invert = bar->mon->tagset[bar->mon->seltags] & 1 << i ? 0 : 1;
/* Select active color for current square */
@ -61,10 +61,10 @@ click_taggrid(Bar *bar, Arg *arg, BarClickArg *a)
{
unsigned int i, columns;
columns = LENGTH(tags) / tagrows + ((LENGTH(tags) % tagrows > 0) ? 1 : 0);
columns = NUMTAGS / tagrows + ((NUMTAGS % tagrows > 0) ? 1 : 0);
i = (a->rel_x - lrpad / 2) / (bh / tagrows) + columns * (a->rel_y / (bh / tagrows));
if (i >= LENGTH(tags)) {
i = LENGTH(tags) - 1;
if (i >= NUMTAGS) {
i = NUMTAGS - 1;
}
arg->ui = 1 << i;
return ClkTagBar;
@ -79,9 +79,9 @@ switchtag(const Arg *arg)
int col, row;
Arg new_arg;
columns = LENGTH(tags) / tagrows + ((LENGTH(tags) % tagrows > 0) ? 1 : 0);
columns = NUMTAGS / tagrows + ((NUMTAGS % tagrows > 0) ? 1 : 0);
for (i = 0; i < LENGTH(tags); ++i) {
for (i = 0; i < NUMTAGS; ++i) {
if (!(selmon->tagset[selmon->seltags] & 1 << i)) {
continue;
}
@ -96,7 +96,7 @@ switchtag(const Arg *arg)
do {
pos = row * columns + col;
row --;
} while (pos >= LENGTH(tags));
} while (pos >= NUMTAGS);
}
if (arg->ui & SWITCHTAG_DOWN) { /* DOWN */
row ++;
@ -104,7 +104,7 @@ switchtag(const Arg *arg)
row = 0;
}
pos = row * columns + col;
if (pos >= LENGTH(tags)) {
if (pos >= NUMTAGS) {
row = 0;
}
pos = row * columns + col;
@ -117,7 +117,7 @@ switchtag(const Arg *arg)
do {
pos = row * columns + col;
col --;
} while (pos >= LENGTH(tags));
} while (pos >= NUMTAGS);
}
if (arg->ui & SWITCHTAG_RIGHT) { /* RIGHT */
col ++;
@ -125,7 +125,7 @@ switchtag(const Arg *arg)
col = 0;
}
pos = row * columns + col;
if (pos >= LENGTH(tags)) {
if (pos >= NUMTAGS) {
col = 0;
pos = row * columns + col;
}

@ -0,0 +1,20 @@
char *
tagicon(Monitor *m, int tag)
{
#if BAR_ALTTAGSDECORATION_PATCH
Client *c;
#endif // BAR_ALTTAGSDECORATION_PATCH
int tagindex = tag + NUMTAGS * m->index;
if (tagindex >= LENGTH(tagicons[DEFAULT_TAGS]))
tagindex = tagindex % LENGTH(tagicons[DEFAULT_TAGS]);
#if BAR_ALTTAGSDECORATION_PATCH
for (c = m->clients; c && (!(c->tags & 1 << tag) || HIDDEN(c)); c = c->next);
if (c)
return tagicons[ALT_TAGS_DECORATION][tagindex];
#endif // BAR_ALTTAGSDECORATION_PATCH
#if BAR_ALTERNATIVE_TAGS_PATCH
if (m->alttag)
return tagicons[ALTERNATIVE_TAGS][tagindex];
#endif // BAR_ALTERNATIVE_TAGS_PATCH
return tagicons[DEFAULT_TAGS][tagindex];
}

@ -0,0 +1,7 @@
enum {
DEFAULT_TAGS,
ALTERNATIVE_TAGS,
ALT_TAGS_DECORATION,
};
static char * tagicon(Monitor *m, int tag);

@ -9,16 +9,12 @@ width_tags(Bar *bar, BarWidthArg *a)
occ |= c->tags == 255 ? 0 : c->tags;
#endif // BAR_HIDEVACANTTAGS_PATCH
for (w = 0, i = 0; i < LENGTH(tags); i++) {
for (w = 0, i = 0; i < NUMTAGS; i++) {
#if BAR_HIDEVACANTTAGS_PATCH
if (!(occ & 1 << i || bar->mon->tagset[bar->mon->seltags] & 1 << i))
continue;
#endif // BAR_HIDEVACANTTAGS_PATCH
#if BAR_ALTERNATIVE_TAGS_PATCH
w += selmon->alttag ? TEXTW(tagsalt[i]) : TEXTW(tags[i]);
#else
w += TEXTW(tags[i]);
#endif // BAR_ALTERNATIVE_TAGS_PATCH
w += TEXTW(tagicon(bar->mon, i));
}
return w;
}
@ -28,10 +24,8 @@ draw_tags(Bar *bar, BarDrawArg *a)
{
int invert;
int w, x = a->x;
#if BAR_ALTERNATIVE_TAGS_PATCH
int wdelta;
#endif // BAR_ALTERNATIVE_TAGS_PATCH
unsigned int i, occ = 0, urg = 0;
char *icon;
Client *c;
Monitor *m = bar->mon;
@ -44,18 +38,16 @@ draw_tags(Bar *bar, BarDrawArg *a)
if (c->isurgent)
urg |= c->tags;
}
for (i = 0; i < LENGTH(tags); i++) {
for (i = 0; i < NUMTAGS; i++) {
#if BAR_HIDEVACANTTAGS_PATCH
/* do not draw vacant tags */
if (!(occ & 1 << i || m->tagset[m->seltags] & 1 << i))
continue;
#endif // BAR_HIDEVACANTTAGS_PATCH
icon = tagicon(bar->mon, i);
invert = 0;
w = TEXTW(tags[i]);
#if BAR_ALTERNATIVE_TAGS_PATCH
wdelta = selmon->alttag ? abs(TEXTW(tags[i]) - TEXTW(tagsalt[i])) / 2 : 0;
#endif // BAR_ALTERNATIVE_TAGS_PATCH
w = TEXTW(icon);
drw_setscheme(drw, scheme[
m->tagset[m->seltags] & 1 << i
? SchemeTagsSel
@ -63,11 +55,7 @@ draw_tags(Bar *bar, BarDrawArg *a)
? SchemeUrg
: SchemeTagsNorm
]);
#if BAR_ALTERNATIVE_TAGS_PATCH
drw_text(drw, x, 0, w, bh, wdelta + lrpad / 2, (selmon->alttag ? tagsalt[i] : tags[i]), invert, False);
#else
drw_text(drw, x, 0, w, bh, lrpad / 2, tags[i], invert, False);
#endif // BAR_ALTERNATIVE_TAGS_PATCH
drw_text(drw, x, 0, w, bh, lrpad / 2, icon, invert, False);
drawindicator(m, NULL, occ, x, w, i, -1, invert, tagindicatortype);
x += w;
}
@ -91,13 +79,9 @@ click_tags(Bar *bar, Arg *arg, BarClickArg *a)
if (!(occ & 1 << i || bar->mon->tagset[bar->mon->seltags] & 1 << i))
continue;
#endif // BAR_HIDEVACANTTAGS_PATCH
#if BAR_ALTERNATIVE_TAGS_PATCH
x += selmon->alttag ? TEXTW(tagsalt[i]) : TEXTW(tags[i]);
#else
x += TEXTW(tags[i]);
#endif
} while (a->rel_x >= x && ++i < LENGTH(tags));
if (i < LENGTH(tags)) {
x += TEXTW(tagicon(bar->mon, i));
} while (a->rel_x >= x && ++i < NUMTAGS);
if (i < NUMTAGS) {
arg->ui = 1 << i;
}
return ClkTagBar;

@ -5,8 +5,8 @@ focusurgent(const Arg *arg)
int i;
for (c=selmon->clients; c && !c->isurgent; c=c->next);
if (c) {
for (i=0; i < LENGTH(tags) && !((1 << i) & c->tags); i++);
if (i < LENGTH(tags)) {
for (i=0; i < NUMTAGS && !((1 << i) & c->tags); i++);
if (i < NUMTAGS) {
const Arg a = {.ui = 1 << i};
view(&a);
focus(c);

@ -1,5 +1,7 @@
/* Bar functionality */
#include "bar_indicators.c"
#include "bar_tagicons.c"
#if BAR_ALPHA_PATCH
#include "bar_alpha.c"
#endif

@ -1,5 +1,7 @@
/* Bar functionality */
#include "bar_indicators.h"
#include "bar_tagicons.h"
#if BAR_ALPHA_PATCH
#include "bar_alpha.h"
#endif

@ -1,26 +1,26 @@
struct Pertag {
unsigned int curtag, prevtag; /* current and previous tag */
int nmasters[LENGTH(tags) + 1]; /* number of windows in master area */
int nmasters[NUMTAGS + 1]; /* number of windows in master area */
#if FLEXTILE_DELUXE_LAYOUT
int nstacks[LENGTH(tags) + 1]; /* number of windows in primary stack area */
int ltaxis[LENGTH(tags) + 1][LTAXIS_LAST];
const Layout *ltidxs[LENGTH(tags) + 1][3]; /* matrix of tags and layouts indexes */
int nstacks[NUMTAGS + 1]; /* number of windows in primary stack area */
int ltaxis[NUMTAGS + 1][LTAXIS_LAST];
const Layout *ltidxs[NUMTAGS + 1][3]; /* matrix of tags and layouts indexes */
#else
const Layout *ltidxs[LENGTH(tags) + 1][2]; /* matrix of tags and layouts indexes */
const Layout *ltidxs[NUMTAGS + 1][2]; /* matrix of tags and layouts indexes */
#endif // FLEXTILE_DELUXE_LAYOUT
float mfacts[LENGTH(tags) + 1]; /* mfacts per tag */
unsigned int sellts[LENGTH(tags) + 1]; /* selected layouts */
float mfacts[NUMTAGS + 1]; /* mfacts per tag */
unsigned int sellts[NUMTAGS + 1]; /* selected layouts */
#if PERTAGBAR_PATCH
int showbars[LENGTH(tags) + 1]; /* display bar for the current tag */
int showbars[NUMTAGS + 1]; /* display bar for the current tag */
#endif // PERTAGBAR_PATCH
#if SWAPFOCUS_PATCH
Client *prevclient[LENGTH(tags) + 1];
Client *prevclient[NUMTAGS + 1];
#endif // SWAPFOCUS_PATCH
#if ZOOMSWAP_PATCH
Client *prevzooms[LENGTH(tags) + 1]; /* store zoom information */
Client *prevzooms[NUMTAGS + 1]; /* store zoom information */
#endif // ZOOMSWAP_PATCH
#if VANITYGAPS_PATCH
int enablegaps[LENGTH(tags) + 1];
int enablegaps[NUMTAGS + 1];
#endif // VANITYGAPS_PATCH
};
@ -29,7 +29,6 @@ pertagview(const Arg *arg)
{
int i;
unsigned int tmptag;
if (arg->ui & TAGMASK) {
selmon->pertag->prevtag = selmon->pertag->curtag;
selmon->tagset[selmon->seltags] = arg->ui & TAGMASK;
@ -52,6 +51,7 @@ pertagview(const Arg *arg)
selmon->sellt = selmon->pertag->sellts[selmon->pertag->curtag];
selmon->lt[selmon->sellt] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt];
selmon->lt[selmon->sellt^1] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt^1];
#if FLEXTILE_DELUXE_LAYOUT
selmon->ltaxis[LAYOUT] = selmon->pertag->ltaxis[selmon->pertag->curtag][LAYOUT];
selmon->ltaxis[MASTER] = selmon->pertag->ltaxis[selmon->pertag->curtag][MASTER];

@ -3,13 +3,13 @@ reorganizetags(const Arg *arg)
{
Client *c;
unsigned int occ, unocc, i;
unsigned int tagdest[LENGTH(tags)];
unsigned int tagdest[NUMTAGS];
occ = 0;
for (c = selmon->clients; c; c = c->next)
occ |= (1 << (ffs(c->tags)-1));
unocc = 0;
for (i = 0; i < LENGTH(tags); ++i) {
for (i = 0; i < NUMTAGS; ++i) {
while (unocc < i && (occ & (1 << unocc)))
unocc++;
if (occ & (1 << i)) {

@ -5,11 +5,11 @@ shiftview(const Arg *arg)
if (arg->i > 0) // left circular shift
shifted.ui = (selmon->tagset[selmon->seltags] << arg->i)
| (selmon->tagset[selmon->seltags] >> (LENGTH(tags) - arg->i));
| (selmon->tagset[selmon->seltags] >> (NUMTAGS - arg->i));
else // right circular shift
shifted.ui = selmon->tagset[selmon->seltags] >> (- arg->i)
| selmon->tagset[selmon->seltags] << (LENGTH(tags) + arg->i);
| selmon->tagset[selmon->seltags] << (NUMTAGS + arg->i);
view(&shifted);
}

@ -20,12 +20,12 @@ shiftviewclients(const Arg *arg)
if (arg->i > 0) // left circular shift
do {
shifted.ui = (shifted.ui << arg->i)
| (shifted.ui >> (LENGTH(tags) - arg->i));
| (shifted.ui >> (NUMTAGS - arg->i));
} while (tagmask && !(shifted.ui & tagmask));
else // right circular shift
do {
shifted.ui = (shifted.ui >> (- arg->i)
| shifted.ui << (LENGTH(tags) + arg->i));
| shifted.ui << (NUMTAGS + arg->i));
} while (tagmask && !(shifted.ui & tagmask));
view(&shifted);

@ -8,11 +8,11 @@ tagall(const Arg *arg)
int tag = (char *)arg->v ? atoi(((char *)arg->v) + floating_only) : 0;
int j;
Client* c;
if (tag >= 0 && tag < LENGTH(tags))
if (tag >= 0 && tag < NUMTAGS)
for (c = selmon->clients; c; c = c->next)
{
if (!floating_only || c->isfloating)
for (j = 0; j < LENGTH(tags); j++)
for (j = 0; j < NUMTAGS; j++)
{
if (c->tags & 1 << j && selmon->tagset[selmon->seltags] & 1 << j)
{

@ -67,6 +67,7 @@
* https://gitlab.com/udiboy1209-suckless/dwm/-/commit/071f5063e8ac4280666828179f92788d893eea40#4b1a539194be7467cefbda22f675a3b7c19ceca7
*/
#define BAR_POWERLINE_TAGS_PATCH 0
/* Alters the tags powerline to use forward slash instead of arrows */
#define BAR_POWERLINE_TAGS_SLASH_PATCH 0
@ -156,6 +157,12 @@
*/
#define BAR_ALTERNATIVE_TAGS_PATCH 0
/* This patches provides the ability to use alternative text for tags which contain at
* least one window.
* https://dwm.suckless.org/patches/alttagsdecoration/
*/
#define BAR_ALTTAGSDECORATION_PATCH 0
/* This patch changes the rectangle indicating if a tag is used by a client into a bar
* above the tag name for better visibility.
* Set the tagindicatortype variable in config.h to INDICATOR_TOP_BAR to enable this.

Loading…
Cancel
Save