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 {