removed TLast tag enum, now tags is simple defined as char *[] array, the rest is calculated correctly, rules take an int array for the tags b3557557
arg@10ksloc.org · 2006-08-03 12:12 8 file(s) · +66 −71
client.c +3 −1
16 16
	int i;
17 17
18 18
	c->tw = 0;
19 -
	for(i = 0; i < TLast; i++)
19 +
	for(i = 0; i < ntags; i++)
20 20
		if(c->tags[i])
21 21
			c->tw += textw(tags[i]);
22 22
	c->tw += textw(c->name);
211 211
	XSetWindowAttributes twa;
212 212
213 213
	c = emallocz(sizeof(Client));
214 +
	c->tags = emallocz(ntags * sizeof(Bool));
214 215
	c->win = w;
215 216
	c->x = c->tx = wa->x;
216 217
	c->y = c->ty = wa->y;
429 430
		if(!sel)
430 431
			sel = clients;
431 432
	}
433 +
	free(c->tags);
432 434
	free(c);
433 435
434 436
	XSync(dpy, False);
config.arg.h +23 −29
3 3
 * See LICENSE file for license details.
4 4
 */
5 5
6 -
enum { Tfnord, Tdev, Tnet, Twork, Tmisc, TLast };
7 6
#define TAGS \
8 -
const char *tags[TLast] = { \
9 -
	[Tfnord] = "fnord", \
10 -
	[Tdev] = "dev", \
11 -
	[Tnet] = "net", \
12 -
	[Twork] = "work", \
13 -
	[Tmisc] = "misc", \
14 -
};
7 +
const char *tags[] = { "fnord", "dev", "net", "work", "misc", NULL };
15 8
16 9
#define DEFMODE			dotile /* dofloat */
17 -
#define DEFTAG			Tdev
10 +
#define DEFTAG			1 /* index */
18 11
#define FONT			"-*-terminus-medium-*-*-*-13-*-*-*-*-*-iso10646-*"
19 12
#define BGCOLOR			"#0a2c2d"
20 13
#define FGCOLOR			"#ddeeee"
33 26
	const char *xlock[] = { "xlock", NULL }; \
34 27
static Key key[] = { \
35 28
	/* modifier		key		function	arguments */ \
36 -
	{ MODKEY,		XK_0,		view,		{ .i = Tfnord } }, \
37 -
	{ MODKEY,		XK_1,		view,		{ .i = Tdev } }, \
38 -
	{ MODKEY,		XK_2,		view,		{ .i = Tnet } }, \
39 -
	{ MODKEY,		XK_3,		view,		{ .i = Twork } }, \
40 -
	{ MODKEY,		XK_4,		view,		{ .i = Tmisc} }, \
29 +
	{ MODKEY,		XK_0,		view,		{ .i = 0 } }, \
30 +
	{ MODKEY,		XK_1,		view,		{ .i = 1 } }, \
31 +
	{ MODKEY,		XK_2,		view,		{ .i = 2 } }, \
32 +
	{ MODKEY,		XK_3,		view,		{ .i = 3 } }, \
33 +
	{ MODKEY,		XK_4,		view,		{ .i = 4 } }, \
41 34
	{ MODKEY,		XK_h,		viewprev,	{ 0 } }, \
42 35
	{ MODKEY,		XK_j,		focusnext,	{ 0 } }, \
43 36
	{ MODKEY,		XK_k,		focusprev,	{ 0 } }, \
45 38
	{ MODKEY,		XK_m,		togglemax,	{ 0 } }, \
46 39
	{ MODKEY,		XK_space,	togglemode,	{ 0 } }, \
47 40
	{ MODKEY,		XK_Return,	zoom,		{ 0 } }, \
48 -
	{ MODKEY|ControlMask,	XK_0,		appendtag,	{ .i = Tfnord } }, \
49 -
	{ MODKEY|ControlMask,	XK_1,		appendtag,	{ .i = Tdev } }, \
50 -
	{ MODKEY|ControlMask,	XK_2,		appendtag,	{ .i = Tnet } }, \
51 -
	{ MODKEY|ControlMask,	XK_3,		appendtag,	{ .i = Twork } }, \
52 -
	{ MODKEY|ControlMask,	XK_4,		appendtag,	{ .i = Tmisc } }, \
53 -
	{ MODKEY|ShiftMask,	XK_0,		replacetag,	{ .i = Tfnord } }, \
54 -
	{ MODKEY|ShiftMask,	XK_1,		replacetag,	{ .i = Tdev } }, \
55 -
	{ MODKEY|ShiftMask,	XK_2,		replacetag,	{ .i = Tnet } }, \
56 -
	{ MODKEY|ShiftMask,	XK_3,		replacetag,	{ .i = Twork } }, \
57 -
	{ MODKEY|ShiftMask,	XK_4,		replacetag,	{ .i = Tmisc } }, \
41 +
	{ MODKEY|ControlMask,	XK_0,		appendtag,	{ .i = 0 } }, \
42 +
	{ MODKEY|ControlMask,	XK_1,		appendtag,	{ .i = 1 } }, \
43 +
	{ MODKEY|ControlMask,	XK_2,		appendtag,	{ .i = 2 } }, \
44 +
	{ MODKEY|ControlMask,	XK_3,		appendtag,	{ .i = 3 } }, \
45 +
	{ MODKEY|ControlMask,	XK_4,		appendtag,	{ .i = 4 } }, \
46 +
	{ MODKEY|ShiftMask,	XK_0,		replacetag,	{ .i = 0 } }, \
47 +
	{ MODKEY|ShiftMask,	XK_1,		replacetag,	{ .i = 1 } }, \
48 +
	{ MODKEY|ShiftMask,	XK_2,		replacetag,	{ .i = 2 } }, \
49 +
	{ MODKEY|ShiftMask,	XK_3,		replacetag,	{ .i = 3 } }, \
50 +
	{ MODKEY|ShiftMask,	XK_4,		replacetag,	{ .i = 5 } }, \
58 51
	{ MODKEY|ShiftMask,	XK_c,		killclient,	{ 0 } }, \
59 52
	{ MODKEY|ShiftMask,	XK_q,		quit,		{ 0 } }, \
60 53
	{ MODKEY|ShiftMask,	XK_Return,	spawn,		{ .argv = term } }, \
64 57
};
65 58
66 59
#define RULES \
60 +
	const unsigned int firefox[] = { 2 }; \
67 61
static Rule rule[] = { \
68 -
	/* class:instance	tags				isfloat */ \
69 -
	{ "Firefox.*",		{ [Tnet] = True },		False }, \
70 -
	{ "Gimp.*",		{ 0 },				True}, \
71 -
	{ "MPlayer.*",		{ 0 },				True}, \
72 -
	{ "Acroread.*",		{ 0 },				True}, \
62 +
	/* class:instance	tags		isfloat */ \
63 +
	{ "Firefox.*",		firefox,	False }, \
64 +
	{ "Gimp.*",		NULL,		True}, \
65 +
	{ "MPlayer.*",		NULL,		True}, \
66 +
	{ "Acroread.*",		NULL,		True}, \
73 67
};
config.default.h +21 −27
3 3
 * See LICENSE file for license details.
4 4
 */
5 5
6 -
enum { Tfnord, Tdev, Tnet, Twork, Tmisc, TLast };
7 6
#define TAGS \
8 -
const char *tags[TLast] = { \
9 -
	[Tfnord] = "fnord", \
10 -
	[Tdev] = "dev", \
11 -
	[Tnet] = "net", \
12 -
	[Twork] = "work", \
13 -
	[Tmisc] = "misc", \
14 -
};
7 +
const char *tags[] = { "0", "1", "2", "3", "4", NULL };
15 8
16 9
#define DEFMODE			dotile /* dofloat */
17 -
#define DEFTAG			Tdev
10 +
#define DEFTAG			1 /* index */
18 11
#define FONT			"fixed"
19 12
#define BGCOLOR			"#666699"
20 13
#define FGCOLOR			"#eeeeee"
27 20
	const char *term[] = { "xterm", NULL }; \
28 21
static Key key[] = { \
29 22
	/* modifier		key		function	arguments */ \
30 -
	{ MODKEY,		XK_0,		view,		{ .i = Tfnord } }, \
31 -
	{ MODKEY,		XK_1,		view,		{ .i = Tdev } }, \
32 -
	{ MODKEY,		XK_2,		view,		{ .i = Tnet } }, \
33 -
	{ MODKEY,		XK_3,		view,		{ .i = Twork } }, \
34 -
	{ MODKEY,		XK_4,		view,		{ .i = Tmisc} }, \
23 +
	{ MODKEY,		XK_0,		view,		{ .i = 0 } }, \
24 +
	{ MODKEY,		XK_1,		view,		{ .i = 1 } }, \
25 +
	{ MODKEY,		XK_2,		view,		{ .i = 2 } }, \
26 +
	{ MODKEY,		XK_3,		view,		{ .i = 3 } }, \
27 +
	{ MODKEY,		XK_4,		view,		{ .i = 4 } }, \
35 28
	{ MODKEY,		XK_h,		viewprev,	{ 0 } }, \
36 29
	{ MODKEY,		XK_j,		focusnext,	{ 0 } }, \
37 30
	{ MODKEY,		XK_k,		focusprev,	{ 0 } }, \
39 32
	{ MODKEY,		XK_m,		togglemax,	{ 0 } }, \
40 33
	{ MODKEY,		XK_space,	togglemode,	{ 0 } }, \
41 34
	{ MODKEY,		XK_Return,	zoom,		{ 0 } }, \
42 -
	{ MODKEY|ControlMask,	XK_0,		appendtag,	{ .i = Tfnord } }, \
43 -
	{ MODKEY|ControlMask,	XK_1,		appendtag,	{ .i = Tdev } }, \
44 -
	{ MODKEY|ControlMask,	XK_2,		appendtag,	{ .i = Tnet } }, \
45 -
	{ MODKEY|ControlMask,	XK_3,		appendtag,	{ .i = Twork } }, \
46 -
	{ MODKEY|ControlMask,	XK_4,		appendtag,	{ .i = Tmisc } }, \
47 -
	{ MODKEY|ShiftMask,	XK_0,		replacetag,	{ .i = Tfnord } }, \
48 -
	{ MODKEY|ShiftMask,	XK_1,		replacetag,	{ .i = Tdev } }, \
49 -
	{ MODKEY|ShiftMask,	XK_2,		replacetag,	{ .i = Tnet } }, \
50 -
	{ MODKEY|ShiftMask,	XK_3,		replacetag,	{ .i = Twork } }, \
51 -
	{ MODKEY|ShiftMask,	XK_4,		replacetag,	{ .i = Tmisc } }, \
35 +
	{ MODKEY|ControlMask,	XK_0,		appendtag,	{ .i = 0 } }, \
36 +
	{ MODKEY|ControlMask,	XK_1,		appendtag,	{ .i = 1 } }, \
37 +
	{ MODKEY|ControlMask,	XK_2,		appendtag,	{ .i = 2 } }, \
38 +
	{ MODKEY|ControlMask,	XK_3,		appendtag,	{ .i = 3 } }, \
39 +
	{ MODKEY|ControlMask,	XK_4,		appendtag,	{ .i = 4 } }, \
40 +
	{ MODKEY|ShiftMask,	XK_0,		replacetag,	{ .i = 0 } }, \
41 +
	{ MODKEY|ShiftMask,	XK_1,		replacetag,	{ .i = 1 } }, \
42 +
	{ MODKEY|ShiftMask,	XK_2,		replacetag,	{ .i = 2 } }, \
43 +
	{ MODKEY|ShiftMask,	XK_3,		replacetag,	{ .i = 3 } }, \
44 +
	{ MODKEY|ShiftMask,	XK_4,		replacetag,	{ .i = 4 } }, \
52 45
	{ MODKEY|ShiftMask,	XK_c,		killclient,	{ 0 } }, \
53 46
	{ MODKEY|ShiftMask,	XK_q,		quit,		{ 0 } }, \
54 47
	{ MODKEY|ShiftMask,	XK_Return,	spawn,		{ .argv = term } }, \
55 48
};
56 49
57 50
#define RULES \
51 +
	const unsigned int firefox[] = { 2 }; \
58 52
static Rule rule[] = { \
59 -
	/* class:instance	tags				isfloat */ \
60 -
	{ "Firefox.*",		{ [Tnet] = True },		False }, \
61 -
	{ "Gimp.*",		{ 0 },				True}, \
53 +
	/* class:instance	tags		isfloat */ \
54 +
	{ "Firefox.*",		firefox,	False }, \
55 +
	{ "Gimp.*",		NULL,		True}, \
62 56
};
draw.c +2 −2
114 114
	drawtext(NULL, !istile, False);
115 115
116 116
	dc.w = 0;
117 -
	for(i = 0; i < TLast; i++) {
117 +
	for(i = 0; i < ntags; i++) {
118 118
		dc.x += dc.w;
119 119
		dc.w = textw(tags[i]);
120 120
		if(istile)
153 153
	dc.x = dc.y = 0;
154 154
155 155
	dc.w = 0;
156 -
	for(i = 0; i < TLast; i++) {
156 +
	for(i = 0; i < ntags; i++) {
157 157
		if(c->tags[i]) {
158 158
			dc.x += dc.w;
159 159
			dc.w = textw(tags[i]);
dwm.h +3 −2
60 60
	unsigned int border;
61 61
	Bool isfloat;
62 62
	Bool ismax;
63 -
	Bool tags[TLast];
63 +
	Bool *tags;
64 64
	Client *next;
65 65
	Client *prev;
66 66
	Window win;
67 67
	Window title;
68 68
};
69 69
70 -
extern const char *tags[TLast];
70 +
extern const char *tags[];
71 71
extern char stext[1024];
72 72
extern int tsel, screen, sx, sy, sw, sh, bx, by, bw, bh, mw;
73 +
extern unsigned int ntags;
73 74
extern void (*handler[LASTEvent])(XEvent *);
74 75
extern void (*arrange)(Arg *);
75 76
extern Atom wmatom[WMLast], netatom[NetLast];
event.c +1 −1
105 105
		switch(ev->button) {
106 106
		default:
107 107
			x = 0;
108 -
			for(a.i = 0; a.i < TLast; a.i++) {
108 +
			for(a.i = 0; a.i < ntags; a.i++) {
109 109
				x += textw(tags[a.i]);
110 110
				if(ev->x < x) {
111 111
					view(&a);
main.c +3 −0
85 85
char stext[1024];
86 86
int tsel = DEFTAG;
87 87
int screen, sx, sy, sw, sh, bx, by, bw, bh, mw;
88 +
unsigned int ntags;
88 89
Atom wmatom[WMLast], netatom[NetLast];
89 90
Bool running = True;
90 91
Bool issel = True;
209 210
	cursor[CurMove] = XCreateFontCursor(dpy, XC_fleur);
210 211
211 212
	grabkeys();
213 +
214 +
	for(ntags = 0; tags[ntags]; ntags++);
212 215
213 216
	/* style */
214 217
	dc.bg = getcolor(BGCOLOR);
tag.c +10 −9
13 13
14 14
typedef struct {
15 15
	const char *pattern;
16 -
	Bool tags[TLast];
16 +
	const unsigned int *tags;
17 17
	Bool isfloat;
18 18
} Rule;
19 19
145 145
	if(!sel)
146 146
		return;
147 147
148 -
	for(i = 0; i < TLast; i++)
148 +
	for(i = 0; i < ntags; i++)
149 149
		sel->tags[i] = False;
150 150
	appendtag(arg);
151 151
}
155 155
{
156 156
	char classinst[256];
157 157
	static unsigned int len = sizeof(rule) / sizeof(rule[0]);
158 -
	unsigned int i, j;
158 +
	unsigned int i, j, n;
159 159
	regex_t regex;
160 160
	regmatch_t tmp;
161 161
	Bool matched = False;
168 168
		for(i = 0; !matched && i < len; i++) {
169 169
			if(!regcomp(&regex, rule[i].pattern, 0)) {
170 170
				if(!regexec(&regex, classinst, 1, &tmp, 0)) {
171 -
					for(j = 0; j < TLast; j++) {
172 -
						if((c->tags[j] = rule[i].tags[j]))
173 -
							matched = True;
174 -
					}
171 +
					n = rule[i].tags ?
172 +
						sizeof(rule[i].tags) / sizeof(rule[i].tags[0]) : 0;
173 +
					matched = n != 0;
174 +
					for(j = 0; j < n; j++)
175 +
						c->tags[rule[i].tags[j]] = True;
175 176
					c->isfloat = rule[i].isfloat;
176 177
				}
177 178
				regfree(&regex);
204 205
void
205 206
viewnext(Arg *arg)
206 207
{
207 -
	arg->i = (tsel < TLast-1) ? tsel+1 : 0;
208 +
	arg->i = (tsel < ntags-1) ? tsel+1 : 0;
208 209
	view(arg);
209 210
}
210 211
211 212
void
212 213
viewprev(Arg *arg)
213 214
{
214 -
	arg->i = (tsel > 0) ? tsel-1 : TLast-1;
215 +
	arg->i = (tsel > 0) ? tsel-1 : ntags-1;
215 216
	view(arg);
216 217
}