1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
|
diff --git a/config.def.h b/config.def.h
index 4f59424..9f13490 100644
--- a/config.def.h
+++ b/config.def.h
@@ -19,6 +19,19 @@ static const char *colors[][3] = {
[SchemeSel] = { col_gray4, col_cyan, col_cyan },
};
+/* full tag indicator variables */
+static const int fti_top = 1; /* 0 means bottom indicator */
+static const int fti_border = 1; /* 0 means no border */
+static const unsigned int fti_height = 4; /* indicator height (as px) */
+static const unsigned int fti_ptop = 0; /* top padding */
+static const unsigned int fti_pbot = 0; /* bottom padding */
+static const unsigned int fti_plef = 0; /* left padding */
+static const unsigned int fti_prig = 0; /* right padding */
+static const char fti_color_nor[] = "#222222"; /* indicator color (not selected tag) */
+static const char fti_color_sel[] = "#eeeeee"; /* indicator color (selected tag) */
+static const char fti_color_nor_inv[] = "#bbbbbb"; /* inverse indicator color (not selected tag) */
+static const char fti_color_sel_inv[] = "#005577"; /* inverse indicator color (selected tag) */
+
/* tagging */
static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" };
diff --git a/drw.c b/drw.c
index c41e6af..fe4734d 100644
--- a/drw.c
+++ b/drw.c
@@ -221,6 +221,32 @@ drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h, int filled, int
XDrawRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w - 1, h - 1);
}
+/* full tag indicator draw function (it does almost the same as drw_rect, check the
+ * https://github.com/nasccped/dwm-fulltag-indicator) */
+void
+drw_fti(Drw *drw, int x_pos, int y_pos, unsigned int wid, unsigned int hei, const char *bg, const char *border)
+{
+ if (!drw || !drw->scheme)
+ return;
+ XSetForeground(drw->dpy, drw->gc, get_colorpixel(drw->dpy, bg));
+ XFillRectangle(drw->dpy, drw->drawable, drw->gc, x_pos, y_pos, wid, hei);
+ XSetForeground(drw->dpy, drw->gc, get_colorpixel(drw->dpy, border));
+ XDrawRectangle(drw->dpy, drw->drawable, drw->gc, x_pos, y_pos, wid - 1, hei - 1);
+}
+
+/* full tag indicator utility: convert a string hex to a valid X server color (unsigned long) */
+unsigned long
+get_colorpixel(Display *dpy, const char *hex)
+{
+ if (!dpy || !hex) return 0;
+ XColor color;
+ int screen = DefaultScreen(dpy);
+ Colormap cmap = DefaultColormap(dpy, screen);
+ if (!XParseColor(dpy, cmap, hex, &color)) return BlackPixel(dpy, screen);
+ if (!XAllocColor(dpy, cmap, &color)) return BlackPixel(dpy, screen);
+ return color.pixel;
+}
+
int
drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lpad, const char *text, int invert)
{
diff --git a/drw.h b/drw.h
index 6471431..77bc431 100644
--- a/drw.h
+++ b/drw.h
@@ -54,5 +54,9 @@ void drw_setscheme(Drw *drw, Clr *scm);
void drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h, int filled, int invert);
int drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lpad, const char *text, int invert);
+/* full tag indicator functions */
+void drw_fti(Drw *drw, int x_pos, int y_pos, unsigned int wid, unsigned int hei, const char *bg, const char *border);
+unsigned long get_colorpixel(Display *dpy, const char *hex);
+
/* Map functions */
void drw_map(Drw *drw, Window win, int x, int y, unsigned int w, unsigned int h);
diff --git a/dwm.c b/dwm.c
index b1c1c4f..bf77d40 100644
--- a/dwm.c
+++ b/dwm.c
@@ -266,6 +266,9 @@ static Display *dpy;
static Drw *drw;
static Monitor *mons, *selmon;
static Window root, wmcheckwin;
+static int fti_x, fti_y; /* full tag indicator x and y position */
+static int fti_wid; /* full tag indicator width (calculated at drawbar function) */
+static const char *fti_bg_color, *fti_bord_color; /* full tag indicator colors */
/* configuration, allows nested code to access above variables */
#include "config.h"
@@ -723,10 +726,33 @@ drawbar(Monitor *m)
w = TEXTW(tags[i]);
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) {
+ // if negative space
+ if (0
+ || (fti_plef + fti_prig >= w)
+ || (fti_top && (fti_ptop + fti_height >= bh))
+ || (!fti_top && (fti_pbot + fti_height >= bh))) {
+ x += w;
+ continue;
+ }
+ // set x position
+ fti_x = x + fti_plef;
+ // set width
+ fti_wid = w - fti_plef - fti_prig;
+ // set y position
+ fti_y = topbar
+ ? fti_top ? m->wy - bh + fti_ptop : m->wy - fti_height - fti_pbot
+ : fti_top ? m->wy + fti_ptop : m->wy + bh - fti_height - fti_pbot;
+ // set colors for bg and border
+ fti_bg_color = (m == selmon && selmon->sel && selmon->sel->tags & 1 << i)
+ ? ((urg & 1 << i) ? fti_color_sel_inv : fti_color_sel)
+ : ((urg & 1 << i) ? fti_color_nor_inv : fti_color_nor);
+ fti_bord_color = fti_border
+ ? ((urg & 1 << i) ? fti_color_sel_inv : fti_color_sel)
+ : fti_bg_color;
+ // draw indicator
+ drw_fti(drw, fti_x, fti_y, fti_wid, fti_height, fti_bg_color, fti_bord_color);
+ }
x += w;
}
w = TEXTW(m->ltsymbol);
|