made tag/view/toggle{tag,view} work on pointer to tags-array, there was the need to define Key key[] not static to do this. split focusclient into focusnext/prev, fixed config.*.h's 10bc0ce9
Anselm R. Garbe · 2007-08-16 17:55 6 file(s) · +127 −112
config.arg.h +39 −39
37 37
/* key definitions */
38 38
#define MODKEY			Mod1Mask
39 39
#define KEYS \
40 -
static Key key[] = { \
40 +
Key key[] = { \
41 41
	/* modifier			key		function	argument */ \
42 42
	{ MODKEY,			XK_p,		spawn, \
43 43
		"exe=`dmenu_path | dmenu -fn '"FONT"' -nb '"NORMBGCOLOR"' -nf '"NORMFGCOLOR"'" \
46 46
		"exec urxvtcd -tr -bg '#111' -fg '#eee' -cr '#eee' +sb -fn '"FONT"'" }, \
47 47
	{ MODKEY,			XK_space,	setlayout,	NULL }, \
48 48
	{ MODKEY,			XK_b,		togglebar,	NULL }, \
49 -
	{ MODKEY,			XK_j,		focusclient,	"1" }, \
50 -
	{ MODKEY,			XK_k,		focusclient,	"-1" }, \
49 +
	{ MODKEY,			XK_j,		focusnext,	NULL }, \
50 +
	{ MODKEY,			XK_k,		focusprev,	NULL }, \
51 51
	{ MODKEY,			XK_h,		addtomwfact,	"-0.05" }, \
52 52
	{ MODKEY,			XK_l,		addtomwfact,	"0.05" }, \
53 53
	{ MODKEY,			XK_m,		togglemax,	NULL }, \
55 55
	{ MODKEY|ShiftMask,		XK_space,	togglefloating,	NULL }, \
56 56
	{ MODKEY|ShiftMask,		XK_c,		killclient,	NULL }, \
57 57
	{ MODKEY,			XK_0,		view,		NULL }, \
58 -
	{ MODKEY,			XK_1,		view,		"0" }, \
59 -
	{ MODKEY,			XK_2,		view,		"1" }, \
60 -
	{ MODKEY,			XK_3,		view,		"2" }, \
61 -
	{ MODKEY,			XK_4,		view,		"3" }, \
62 -
	{ MODKEY,			XK_5,		view,		"4" }, \
63 -
	{ MODKEY,			XK_6,		view,		"5" }, \
64 -
	{ MODKEY,			XK_7,		view,		"6" }, \
65 -
	{ MODKEY,			XK_8,		view,		"7" }, \
66 -
	{ MODKEY,			XK_9,		view,		"8" }, \
67 -
	{ MODKEY|ControlMask,		XK_1,		toggleview,	"0" }, \
68 -
	{ MODKEY|ControlMask,		XK_2,		toggleview,	"1" }, \
69 -
	{ MODKEY|ControlMask,		XK_3,		toggleview,	"2" }, \
70 -
	{ MODKEY|ControlMask,		XK_4,		toggleview,	"3" }, \
71 -
	{ MODKEY|ControlMask,		XK_5,		toggleview,	"4" }, \
72 -
	{ MODKEY|ControlMask,		XK_6,		toggleview,	"5" }, \
73 -
	{ MODKEY|ControlMask,		XK_7,		toggleview,	"6" }, \
74 -
	{ MODKEY|ControlMask,		XK_8,		toggleview,	"7" }, \
75 -
	{ MODKEY|ControlMask,		XK_9,		toggleview,	"8" }, \
58 +
	{ MODKEY,			XK_1,		view,		tags[0] }, \
59 +
	{ MODKEY,			XK_2,		view,		tags[1] }, \
60 +
	{ MODKEY,			XK_3,		view,		tags[2] }, \
61 +
	{ MODKEY,			XK_4,		view,		tags[3] }, \
62 +
	{ MODKEY,			XK_5,		view,		tags[4] }, \
63 +
	{ MODKEY,			XK_6,		view,		tags[5] }, \
64 +
	{ MODKEY,			XK_7,		view,		tags[6] }, \
65 +
	{ MODKEY,			XK_8,		view,		tags[7] }, \
66 +
	{ MODKEY,			XK_9,		view,		tags[8] }, \
67 +
	{ MODKEY|ControlMask,		XK_1,		toggleview,	tags[0] }, \
68 +
	{ MODKEY|ControlMask,		XK_2,		toggleview,	tags[1] }, \
69 +
	{ MODKEY|ControlMask,		XK_3,		toggleview,	tags[2] }, \
70 +
	{ MODKEY|ControlMask,		XK_4,		toggleview,	tags[3] }, \
71 +
	{ MODKEY|ControlMask,		XK_5,		toggleview,	tags[4] }, \
72 +
	{ MODKEY|ControlMask,		XK_6,		toggleview,	tags[5] }, \
73 +
	{ MODKEY|ControlMask,		XK_7,		toggleview,	tags[6] }, \
74 +
	{ MODKEY|ControlMask,		XK_8,		toggleview,	tags[7] }, \
75 +
	{ MODKEY|ControlMask,		XK_9,		toggleview,	tags[8] }, \
76 76
	{ MODKEY|ShiftMask,		XK_0,		tag,		NULL }, \
77 -
	{ MODKEY|ShiftMask,		XK_1,		tag,		"0" }, \
78 -
	{ MODKEY|ShiftMask,		XK_2,		tag,		"1" }, \
79 -
	{ MODKEY|ShiftMask,		XK_3,		tag,		"2" }, \
80 -
	{ MODKEY|ShiftMask,		XK_4,		tag,		"3" }, \
81 -
	{ MODKEY|ShiftMask,		XK_5,		tag,		"4" }, \
82 -
	{ MODKEY|ShiftMask,		XK_6,		tag,		"5" }, \
83 -
	{ MODKEY|ShiftMask,		XK_7,		tag,		"6" }, \
84 -
	{ MODKEY|ShiftMask,		XK_8,		tag,		"7" }, \
85 -
	{ MODKEY|ShiftMask,		XK_9,		tag,		"8" }, \
86 -
	{ MODKEY|ControlMask|ShiftMask,	XK_1,		toggletag,	"0" }, \
87 -
	{ MODKEY|ControlMask|ShiftMask,	XK_2,		toggletag,	"1" }, \
88 -
	{ MODKEY|ControlMask|ShiftMask,	XK_3,		toggletag,	"2" }, \
89 -
	{ MODKEY|ControlMask|ShiftMask,	XK_4,		toggletag,	"3" }, \
90 -
	{ MODKEY|ControlMask|ShiftMask,	XK_5,		toggletag,	"4" }, \
91 -
	{ MODKEY|ControlMask|ShiftMask,	XK_6,		toggletag,	"5" }, \
92 -
	{ MODKEY|ControlMask|ShiftMask,	XK_7,		toggletag,	"6" }, \
93 -
	{ MODKEY|ControlMask|ShiftMask,	XK_8,		toggletag,	"7" }, \
94 -
	{ MODKEY|ControlMask|ShiftMask,	XK_9,		toggletag,	"8" }, \
77 +
	{ MODKEY|ShiftMask,		XK_1,		tag,		tags[0] }, \
78 +
	{ MODKEY|ShiftMask,		XK_2,		tag,		tags[1] }, \
79 +
	{ MODKEY|ShiftMask,		XK_3,		tag,		tags[2] }, \
80 +
	{ MODKEY|ShiftMask,		XK_4,		tag,		tags[3] }, \
81 +
	{ MODKEY|ShiftMask,		XK_5,		tag,		tags[4] }, \
82 +
	{ MODKEY|ShiftMask,		XK_6,		tag,		tags[5] }, \
83 +
	{ MODKEY|ShiftMask,		XK_7,		tag,		tags[6] }, \
84 +
	{ MODKEY|ShiftMask,		XK_8,		tag,		tags[7] }, \
85 +
	{ MODKEY|ShiftMask,		XK_9,		tag,		tags[8] }, \
86 +
	{ MODKEY|ControlMask|ShiftMask,	XK_1,		toggletag,	tags[0] }, \
87 +
	{ MODKEY|ControlMask|ShiftMask,	XK_2,		toggletag,	tags[1] }, \
88 +
	{ MODKEY|ControlMask|ShiftMask,	XK_3,		toggletag,	tags[2] }, \
89 +
	{ MODKEY|ControlMask|ShiftMask,	XK_4,		toggletag,	tags[3] }, \
90 +
	{ MODKEY|ControlMask|ShiftMask,	XK_5,		toggletag,	tags[4] }, \
91 +
	{ MODKEY|ControlMask|ShiftMask,	XK_6,		toggletag,	tags[5] }, \
92 +
	{ MODKEY|ControlMask|ShiftMask,	XK_7,		toggletag,	tags[6] }, \
93 +
	{ MODKEY|ControlMask|ShiftMask,	XK_8,		toggletag,	tags[7] }, \
94 +
	{ MODKEY|ControlMask|ShiftMask,	XK_9,		toggletag,	tags[8] }, \
95 95
	{ MODKEY|ShiftMask,		XK_q,		quit,		NULL }, \
96 96
};
config.default.h +39 −39
38 38
/* key definitions */
39 39
#define MODKEY			Mod1Mask
40 40
#define KEYS \
41 -
static Key key[] = { \
41 +
Key key[] = { \
42 42
	/* modifier			key		function	argument */ \
43 43
	{ MODKEY|ShiftMask,		XK_Return,	spawn,		"exec xterm" }, \
44 44
	{ MODKEY,			XK_p,		spawn, 		"exe=`dmenu_path | dmenu` && exec $exe" }, \
45 45
	{ MODKEY,			XK_space,	setlayout,	NULL }, \
46 46
	{ MODKEY,			XK_b,		togglebar,	NULL }, \
47 -
	{ MODKEY,			XK_j,		focusclient,	"1" }, \
48 -
	{ MODKEY,			XK_k,		focusclient,	"-1" }, \
47 +
	{ MODKEY,			XK_j,		focusnext,	NULL }, \
48 +
	{ MODKEY,			XK_k,		focusprev,	NULL }, \
49 49
	{ MODKEY,			XK_h,		addtomwfact,	"-0.05" }, \
50 50
	{ MODKEY,			XK_l,		addtomwfact,	"0.05" }, \
51 51
	{ MODKEY,			XK_m,		togglemax,	NULL }, \
53 53
	{ MODKEY|ShiftMask,		XK_space,	togglefloating,	NULL }, \
54 54
	{ MODKEY|ShiftMask,		XK_c,		killclient,	NULL }, \
55 55
	{ MODKEY,			XK_0,		view,		NULL }, \
56 -
	{ MODKEY,			XK_1,		view,		"0" }, \
57 -
	{ MODKEY,			XK_2,		view,		"1" }, \
58 -
	{ MODKEY,			XK_3,		view,		"2" }, \
59 -
	{ MODKEY,			XK_4,		view,		"3" }, \
60 -
	{ MODKEY,			XK_5,		view,		"4" }, \
61 -
	{ MODKEY,			XK_6,		view,		"5" }, \
62 -
	{ MODKEY,			XK_7,		view,		"6" }, \
63 -
	{ MODKEY,			XK_8,		view,		"7" }, \
64 -
	{ MODKEY,			XK_9,		view,		"8" }, \
65 -
	{ MODKEY|ControlMask,		XK_1,		toggleview,	"0" }, \
66 -
	{ MODKEY|ControlMask,		XK_2,		toggleview,	"1" }, \
67 -
	{ MODKEY|ControlMask,		XK_3,		toggleview,	"2" }, \
68 -
	{ MODKEY|ControlMask,		XK_4,		toggleview,	"3" }, \
69 -
	{ MODKEY|ControlMask,		XK_5,		toggleview,	"4" }, \
70 -
	{ MODKEY|ControlMask,		XK_6,		toggleview,	"5" }, \
71 -
	{ MODKEY|ControlMask,		XK_7,		toggleview,	"6" }, \
72 -
	{ MODKEY|ControlMask,		XK_8,		toggleview,	"7" }, \
73 -
	{ MODKEY|ControlMask,		XK_9,		toggleview,	"8" }, \
56 +
	{ MODKEY,			XK_1,		view,		tags[0] }, \
57 +
	{ MODKEY,			XK_2,		view,		tags[1] }, \
58 +
	{ MODKEY,			XK_3,		view,		tags[2] }, \
59 +
	{ MODKEY,			XK_4,		view,		tags[3] }, \
60 +
	{ MODKEY,			XK_5,		view,		tags[4] }, \
61 +
	{ MODKEY,			XK_6,		view,		tags[5] }, \
62 +
	{ MODKEY,			XK_7,		view,		tags[6] }, \
63 +
	{ MODKEY,			XK_8,		view,		tags[7] }, \
64 +
	{ MODKEY,			XK_9,		view,		tags[8] }, \
65 +
	{ MODKEY|ControlMask,		XK_1,		toggleview,	tags[0] }, \
66 +
	{ MODKEY|ControlMask,		XK_2,		toggleview,	tags[1] }, \
67 +
	{ MODKEY|ControlMask,		XK_3,		toggleview,	tags[2] }, \
68 +
	{ MODKEY|ControlMask,		XK_4,		toggleview,	tags[3] }, \
69 +
	{ MODKEY|ControlMask,		XK_5,		toggleview,	tags[4] }, \
70 +
	{ MODKEY|ControlMask,		XK_6,		toggleview,	tags[5] }, \
71 +
	{ MODKEY|ControlMask,		XK_7,		toggleview,	tags[6] }, \
72 +
	{ MODKEY|ControlMask,		XK_8,		toggleview,	tags[7] }, \
73 +
	{ MODKEY|ControlMask,		XK_9,		toggleview,	tags[8] }, \
74 74
	{ MODKEY|ShiftMask,		XK_0,		tag,		NULL }, \
75 -
	{ MODKEY|ShiftMask,		XK_1,		tag,		"0" }, \
76 -
	{ MODKEY|ShiftMask,		XK_2,		tag,		"1" }, \
77 -
	{ MODKEY|ShiftMask,		XK_3,		tag,		"2" }, \
78 -
	{ MODKEY|ShiftMask,		XK_4,		tag,		"3" }, \
79 -
	{ MODKEY|ShiftMask,		XK_5,		tag,		"4" }, \
80 -
	{ MODKEY|ShiftMask,		XK_6,		tag,		"5" }, \
81 -
	{ MODKEY|ShiftMask,		XK_7,		tag,		"6" }, \
82 -
	{ MODKEY|ShiftMask,		XK_8,		tag,		"7" }, \
83 -
	{ MODKEY|ShiftMask,		XK_9,		tag,		"8" }, \
84 -
	{ MODKEY|ControlMask|ShiftMask,	XK_1,		toggletag,	"0" }, \
85 -
	{ MODKEY|ControlMask|ShiftMask,	XK_2,		toggletag,	"1" }, \
86 -
	{ MODKEY|ControlMask|ShiftMask,	XK_3,		toggletag,	"2" }, \
87 -
	{ MODKEY|ControlMask|ShiftMask,	XK_4,		toggletag,	"3" }, \
88 -
	{ MODKEY|ControlMask|ShiftMask,	XK_5,		toggletag,	"4" }, \
89 -
	{ MODKEY|ControlMask|ShiftMask,	XK_6,		toggletag,	"5" }, \
90 -
	{ MODKEY|ControlMask|ShiftMask,	XK_7,		toggletag,	"6" }, \
91 -
	{ MODKEY|ControlMask|ShiftMask,	XK_8,		toggletag,	"7" }, \
92 -
	{ MODKEY|ControlMask|ShiftMask,	XK_9,		toggletag,	"8" }, \
75 +
	{ MODKEY|ShiftMask,		XK_1,		tag,		tags[0] }, \
76 +
	{ MODKEY|ShiftMask,		XK_2,		tag,		tags[1] }, \
77 +
	{ MODKEY|ShiftMask,		XK_3,		tag,		tags[2] }, \
78 +
	{ MODKEY|ShiftMask,		XK_4,		tag,		tags[3] }, \
79 +
	{ MODKEY|ShiftMask,		XK_5,		tag,		tags[4] }, \
80 +
	{ MODKEY|ShiftMask,		XK_6,		tag,		tags[5] }, \
81 +
	{ MODKEY|ShiftMask,		XK_7,		tag,		tags[6] }, \
82 +
	{ MODKEY|ShiftMask,		XK_8,		tag,		tags[7] }, \
83 +
	{ MODKEY|ShiftMask,		XK_9,		tag,		tags[8] }, \
84 +
	{ MODKEY|ControlMask|ShiftMask,	XK_1,		toggletag,	tags[0] }, \
85 +
	{ MODKEY|ControlMask|ShiftMask,	XK_2,		toggletag,	tags[1] }, \
86 +
	{ MODKEY|ControlMask|ShiftMask,	XK_3,		toggletag,	tags[2] }, \
87 +
	{ MODKEY|ControlMask|ShiftMask,	XK_4,		toggletag,	tags[3] }, \
88 +
	{ MODKEY|ControlMask|ShiftMask,	XK_5,		toggletag,	tags[4] }, \
89 +
	{ MODKEY|ControlMask|ShiftMask,	XK_6,		toggletag,	tags[5] }, \
90 +
	{ MODKEY|ControlMask|ShiftMask,	XK_7,		toggletag,	tags[6] }, \
91 +
	{ MODKEY|ControlMask|ShiftMask,	XK_8,		toggletag,	tags[7] }, \
92 +
	{ MODKEY|ControlMask|ShiftMask,	XK_9,		toggletag,	tags[8] }, \
93 93
	{ MODKEY|ShiftMask,		XK_q,		quit,		NULL }, \
94 94
};
dwm.h +2 −1
114 114
115 115
/* layout.c */
116 116
void arrange(void);			/* arranges all windows depending on the layout in use */
117 -
void focusclient(const char *arg);	/* focuses next(1)/previous(-1) visible client */
117 +
void focusnext(const char *arg);	/* focuses next visible client */
118 +
void focusprev(const char *arg);	/* focuses prev visible client */
118 119
const char *getsymbol(void);		/* returns symbol of enabled layout */
119 120
Bool isfloating(void);			/* returns True if floating layout is enabled */
120 121
Bool isarrange(void (*func)());		/* returns True if func is the layout function in use */
event.c +8 −12
1 1
/* See LICENSE file for copyright and license details. */
2 2
#include "dwm.h"
3 -
#include <stdio.h>
4 3
#include <stdlib.h>
5 4
#include <X11/keysym.h>
6 5
#include <X11/Xatom.h>
14 13
	void (*func)(const char *arg);
15 14
	const char *arg;
16 15
} Key;
17 -
18 -
KEYS
19 16
20 17
#define CLEANMASK(mask)		(mask & ~(numlockmask | LockMask))
21 18
#define MOUSEMASK		(BUTTONMASK | PointerMotionMask)
112 109
113 110
static void
114 111
buttonpress(XEvent *e) {
115 -
	static char buf[32];
116 112
	unsigned int i, x;
117 113
	Client *c;
118 114
	XButtonPressedEvent *ev = &e->xbutton;
119 115
120 -
	buf[0] = 0;
121 116
	if(barwin == ev->window) {
122 117
		x = 0;
123 118
		for(i = 0; i < ntags; i++) {
124 119
			x += textw(tags[i]);
125 120
			if(ev->x < x) {
126 -
				snprintf(buf, sizeof buf, "%d", i);
127 121
				if(ev->button == Button1) {
128 122
					if(ev->state & MODKEY)
129 -
						tag(buf);
123 +
						tag(tags[i]);
130 124
					else
131 -
						view(buf);
125 +
						view(tags[i]);
132 126
				}
133 127
				else if(ev->button == Button3) {
134 128
					if(ev->state & MODKEY)
135 -
						toggletag(buf);
129 +
						toggletag(tags[i]);
136 130
					else
137 -
						toggleview(buf);
131 +
						toggleview(tags[i]);
138 132
				}
139 133
				return;
140 134
			}
257 251
258 252
static void
259 253
keypress(XEvent *e) {
260 -
	static unsigned int len = sizeof key / sizeof key[0];
254 +
	KEYS
255 +
	unsigned int len = sizeof key / sizeof key[0];
261 256
	unsigned int i;
262 257
	KeySym keysym;
263 258
	XKeyEvent *ev = &e->xkey;
362 357
363 358
void
364 359
grabkeys(void) {
365 -
	static unsigned int len = sizeof key / sizeof key[0];
360 +
	KEYS
361 +
	unsigned int len = sizeof key / sizeof key[0];
366 362
	unsigned int i;
367 363
	KeyCode code;
368 364
layout.c +21 −13
42 42
}
43 43
44 44
void
45 -
focusclient(const char *arg) {
45 +
focusnext(const char *arg) {
46 46
	Client *c;
47 -
   
48 -
	if(!sel || !arg)
47 +
48 +
	if(!sel)
49 49
		return;
50 -
	if(atoi(arg) < 0) {
51 -
		for(c = sel->prev; c && !isvisible(c); c = c->prev);
52 -
		if(!c) {
53 -
			for(c = clients; c && c->next; c = c->next);
54 -
			for(; c && !isvisible(c); c = c->prev);
55 -
		}
50 +
	for(c = sel->next; c && !isvisible(c); c = c->next);
51 +
	if(!c)
52 +
		for(c = clients; c && !isvisible(c); c = c->next);
53 +
	if(c) {
54 +
		focus(c);
55 +
		restack();
56 56
	}
57 -
	else {
58 -
		for(c = sel->next; c && !isvisible(c); c = c->next);
59 -
		if(!c)
60 -
			for(c = clients; c && !isvisible(c); c = c->next);
57 +
}
58 +
59 +
void
60 +
focusprev(const char *arg) {
61 +
	Client *c;
62 +
63 +
	if(!sel)
64 +
		return;
65 +
	for(c = sel->prev; c && !isvisible(c); c = c->prev);
66 +
	if(!c) {
67 +
		for(c = clients; c && c->next; c = c->next);
68 +
		for(; c && !isvisible(c); c = c->prev);
61 69
	}
62 70
	if(c) {
63 71
		focus(c);
tag.c +18 −8
40 40
			PropModeReplace, (unsigned char *)prop, i);
41 41
}
42 42
43 +
static unsigned int
44 +
idxoftag(const char *tag) {
45 +
	unsigned int i;
46 +
47 +
	for(i = 0; i < ntags; i++)
48 +
		if(tags[i] == tag)
49 +
			return i;
50 +
	return 0;
51 +
}
52 +
43 53
/* extern */
44 54
45 55
void
135 145
136 146
void
137 147
tag(const char *arg) {
138 -
	int i;
148 +
	unsigned int i;
139 149
140 150
	if(!sel)
141 151
		return;
142 152
	for(i = 0; i < ntags; i++)
143 153
		sel->tags[i] = arg == NULL;
144 -
	i = arg ? atoi(arg) : 0;
154 +
	i = idxoftag(arg);
145 155
	if(i >= 0 && i < ntags)
146 156
		sel->tags[i] = True;
147 157
	persistconfig(sel);
162 172
163 173
void
164 174
toggletag(const char *arg) {
165 -
	int i, j;
175 +
	unsigned int i, j;
166 176
167 177
	if(!sel)
168 178
		return;
169 -
	i = arg ? atoi(arg) : 0;
179 +
	i = idxoftag(arg);
170 180
	sel->tags[i] = !sel->tags[i];
171 181
	for(j = 0; j < ntags && !sel->tags[j]; j++);
172 182
	if(j == ntags)
177 187
178 188
void
179 189
toggleview(const char *arg) {
180 -
	int i, j;
190 +
	unsigned int i, j;
181 191
182 -
	i = arg ? atoi(arg) : 0;
192 +
	i = idxoftag(arg);
183 193
	seltag[i] = !seltag[i];
184 194
	for(j = 0; j < ntags && !seltag[j]; j++);
185 195
	if(j == ntags)
189 199
190 200
void
191 201
view(const char *arg) {
192 -
	int i;
202 +
	unsigned int i;
193 203
194 204
	for(i = 0; i < ntags; i++)
195 205
		seltag[i] = arg == NULL;
196 -
	i = arg ? atoi(arg) : 0;
206 +
	i = idxoftag(arg);
197 207
	if(i >= 0 && i < ntags)
198 208
		seltag[i] = True;
199 209
	arrange();