Using a new tags definition (const char [][MAXTAGLEN] - thanks go to Szabolcs! e9a07335
Anselm R. Garbe · 2007-11-10 19:16 2 file(s) · +81 −78
config.def.h +57 −58
12 12
#define SELFGCOLOR		"#ffffff"
13 13
14 14
/* tagging */
15 -
const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "www" };
15 +
const char tags[][MAXTAGLEN] = { "1", "2", "3", "4", "5", "6", "7", "8", "www" };
16 16
Bool seltags[LENGTH(tags)] = {[0] = True};
17 17
Rule rules[] = {
18 18
	/* class:instance:title regex	tags regex	isfloating */
34 34
35 35
/* key definitions */
36 36
#define MODKEY			Mod1Mask
37 -
#define KEYS \
38 -
Key keys[] = { \
39 -
	/* modifier			key		function	argument */ \
40 -
	{ MODKEY,			XK_p,		spawn, \
41 -
		"exe=`dmenu_path | dmenu -fn '"FONT"' -nb '"NORMBGCOLOR"' -nf '"NORMFGCOLOR"'" \
42 -
		" -sb '"SELBGCOLOR"' -sf '"SELFGCOLOR"'` && exec $exe" }, \
43 -
	{ MODKEY|ShiftMask,		XK_Return,	spawn, "exec uxterm" }, \
44 -
	{ MODKEY,			XK_space,	setlayout,	NULL }, \
45 -
	{ MODKEY,			XK_b,		togglebar,	NULL }, \
46 -
	{ MODKEY,			XK_j,		focusnext,	NULL }, \
47 -
	{ MODKEY,			XK_k,		focusprev,	NULL }, \
48 -
	{ MODKEY,			XK_h,		setmwfact,	"-0.05" }, \
49 -
	{ MODKEY,			XK_l,		setmwfact,	"+0.05" }, \
50 -
	{ MODKEY,			XK_m,		togglemax,	NULL }, \
51 -
	{ MODKEY,			XK_Return,	zoom,		NULL }, \
52 -
	{ MODKEY,			XK_Tab,		viewprevtag,	NULL }, \
53 -
	{ MODKEY|ShiftMask,		XK_space,	togglefloating,	NULL }, \
54 -
	{ MODKEY|ShiftMask,		XK_c,		killclient,	NULL }, \
55 -
	{ MODKEY,			XK_0,		view,		NULL }, \
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 -
	{ MODKEY|ShiftMask,		XK_0,		tag,		NULL }, \
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 -
	{ MODKEY|ShiftMask,		XK_q,		quit,		NULL }, \
37 +
Key keys[] = {
38 +
	/* modifier			key		function	argument */
39 +
	{ MODKEY,			XK_p,		spawn,
40 +
		"exe=`dmenu_path | dmenu -fn '"FONT"' -nb '"NORMBGCOLOR"' -nf '"NORMFGCOLOR"'"
41 +
		" -sb '"SELBGCOLOR"' -sf '"SELFGCOLOR"'` && exec $exe" },
42 +
	{ MODKEY|ShiftMask,		XK_Return,	spawn, "exec uxterm" },
43 +
	{ MODKEY,			XK_space,	setlayout,	NULL },
44 +
	{ MODKEY,			XK_b,		togglebar,	NULL },
45 +
	{ MODKEY,			XK_j,		focusnext,	NULL },
46 +
	{ MODKEY,			XK_k,		focusprev,	NULL },
47 +
	{ MODKEY,			XK_h,		setmwfact,	"-0.05" },
48 +
	{ MODKEY,			XK_l,		setmwfact,	"+0.05" },
49 +
	{ MODKEY,			XK_m,		togglemax,	NULL },
50 +
	{ MODKEY,			XK_Return,	zoom,		NULL },
51 +
	{ MODKEY,			XK_Tab,		viewprevtag,	NULL },
52 +
	{ MODKEY|ShiftMask,		XK_space,	togglefloating,	NULL },
53 +
	{ MODKEY|ShiftMask,		XK_c,		killclient,	NULL },
54 +
	{ MODKEY,			XK_0,		view,		NULL },
55 +
	{ MODKEY,			XK_1,		view,		tags[0] },
56 +
	{ MODKEY,			XK_2,		view,		tags[1] },
57 +
	{ MODKEY,			XK_3,		view,		tags[2] },
58 +
	{ MODKEY,			XK_4,		view,		tags[3] },
59 +
	{ MODKEY,			XK_5,		view,		tags[4] },
60 +
	{ MODKEY,			XK_6,		view,		tags[5] },
61 +
	{ MODKEY,			XK_7,		view,		tags[6] },
62 +
	{ MODKEY,			XK_8,		view,		tags[7] },
63 +
	{ MODKEY,			XK_9,		view,		tags[8] },
64 +
	{ MODKEY|ControlMask,		XK_1,		toggleview,	tags[0] },
65 +
	{ MODKEY|ControlMask,		XK_2,		toggleview,	tags[1] },
66 +
	{ MODKEY|ControlMask,		XK_3,		toggleview,	tags[2] },
67 +
	{ MODKEY|ControlMask,		XK_4,		toggleview,	tags[3] },
68 +
	{ MODKEY|ControlMask,		XK_5,		toggleview,	tags[4] },
69 +
	{ MODKEY|ControlMask,		XK_6,		toggleview,	tags[5] },
70 +
	{ MODKEY|ControlMask,		XK_7,		toggleview,	tags[6] },
71 +
	{ MODKEY|ControlMask,		XK_8,		toggleview,	tags[7] },
72 +
	{ MODKEY|ControlMask,		XK_9,		toggleview,	tags[8] },
73 +
	{ MODKEY|ShiftMask,		XK_0,		tag,		NULL },
74 +
	{ MODKEY|ShiftMask,		XK_1,		tag,		tags[0] },
75 +
	{ MODKEY|ShiftMask,		XK_2,		tag,		tags[1] },
76 +
	{ MODKEY|ShiftMask,		XK_3,		tag,		tags[2] },
77 +
	{ MODKEY|ShiftMask,		XK_4,		tag,		tags[3] },
78 +
	{ MODKEY|ShiftMask,		XK_5,		tag,		tags[4] },
79 +
	{ MODKEY|ShiftMask,		XK_6,		tag,		tags[5] },
80 +
	{ MODKEY|ShiftMask,		XK_7,		tag,		tags[6] },
81 +
	{ MODKEY|ShiftMask,		XK_8,		tag,		tags[7] },
82 +
	{ MODKEY|ShiftMask,		XK_9,		tag,		tags[8] },
83 +
	{ MODKEY|ControlMask|ShiftMask,	XK_1,		toggletag,	tags[0] },
84 +
	{ MODKEY|ControlMask|ShiftMask,	XK_2,		toggletag,	tags[1] },
85 +
	{ MODKEY|ControlMask|ShiftMask,	XK_3,		toggletag,	tags[2] },
86 +
	{ MODKEY|ControlMask|ShiftMask,	XK_4,		toggletag,	tags[3] },
87 +
	{ MODKEY|ControlMask|ShiftMask,	XK_5,		toggletag,	tags[4] },
88 +
	{ MODKEY|ControlMask|ShiftMask,	XK_6,		toggletag,	tags[5] },
89 +
	{ MODKEY|ControlMask|ShiftMask,	XK_7,		toggletag,	tags[6] },
90 +
	{ MODKEY|ControlMask|ShiftMask,	XK_8,		toggletag,	tags[7] },
91 +
	{ MODKEY|ControlMask|ShiftMask,	XK_9,		toggletag,	tags[8] },
92 +
	{ MODKEY|ShiftMask,		XK_q,		quit,		NULL },
94 93
};
dwm.c +24 −20
44 44
/* macros */
45 45
#define BUTTONMASK		(ButtonPressMask | ButtonReleaseMask)
46 46
#define CLEANMASK(mask)		(mask & ~(numlockmask | LockMask))
47 +
#define LENGTH(x)		(sizeof x / sizeof x[0])
48 +
#define MAXTAGLEN		16
47 49
#define MOUSEMASK		(BUTTONMASK | PointerMotionMask)
48 -
#define LENGTH(x)		(sizeof x / sizeof x[0])
49 50
50 51
51 52
/* enums */
143 144
long getstate(Window w);
144 145
Bool gettextprop(Window w, Atom atom, char *text, unsigned int size);
145 146
void grabbuttons(Client *c, Bool focused);
147 +
void grabkeys(void);
146 148
unsigned int idxoftag(const char *tag);
147 149
void initfont(const char *fontstr);
148 150
Bool isoccupied(unsigned int t);
838 840
				GrabModeAsync, GrabModeSync, None, None);
839 841
}
840 842
843 +
void
844 +
grabkeys(void)  {
845 +
	unsigned int i;
846 +
	KeyCode code;
847 +
848 +
	XUngrabKey(dpy, AnyKey, AnyModifier, root);
849 +
	for(i = 0; i < LENGTH(keys); i++) {
850 +
		code = XKeysymToKeycode(dpy, keys[i].keysym);
851 +
		XGrabKey(dpy, code, keys[i].mod, root, True,
852 +
				GrabModeAsync, GrabModeAsync);
853 +
		XGrabKey(dpy, code, keys[i].mod | LockMask, root, True,
854 +
				GrabModeAsync, GrabModeAsync);
855 +
		XGrabKey(dpy, code, keys[i].mod | numlockmask, root, True,
856 +
				GrabModeAsync, GrabModeAsync);
857 +
		XGrabKey(dpy, code, keys[i].mod | numlockmask | LockMask, root, True,
858 +
				GrabModeAsync, GrabModeAsync);
859 +
	}
860 +
}
861 +
841 862
unsigned int
842 863
idxoftag(const char *tag) {
843 864
	unsigned int i;
925 946
926 947
void
927 948
keypress(XEvent *e) {
928 -
	KEYS
929 949
	unsigned int i;
930 -
	KeyCode code;
931 950
	KeySym keysym;
932 951
	XKeyEvent *ev;
933 952
934 -
	if(!e) { /* grabkeys */
935 -
		XUngrabKey(dpy, AnyKey, AnyModifier, root);
936 -
		for(i = 0; i < LENGTH(keys); i++) {
937 -
			code = XKeysymToKeycode(dpy, keys[i].keysym);
938 -
			XGrabKey(dpy, code, keys[i].mod, root, True,
939 -
					GrabModeAsync, GrabModeAsync);
940 -
			XGrabKey(dpy, code, keys[i].mod | LockMask, root, True,
941 -
					GrabModeAsync, GrabModeAsync);
942 -
			XGrabKey(dpy, code, keys[i].mod | numlockmask, root, True,
943 -
					GrabModeAsync, GrabModeAsync);
944 -
			XGrabKey(dpy, code, keys[i].mod | numlockmask | LockMask, root, True,
945 -
					GrabModeAsync, GrabModeAsync);
946 -
		}
947 -
		return;
948 -
	}
949 953
	ev = &e->xkey;
950 954
	keysym = XKeycodeToKeysym(dpy, (KeyCode)ev->keycode, 0);
951 955
	for(i = 0; i < LENGTH(keys); i++)
1048 1052
1049 1053
	XRefreshKeyboardMapping(ev);
1050 1054
	if(ev->request == MappingKeyboard)
1051 -
		keypress(NULL);
1055 +
		grabkeys();
1052 1056
}
1053 1057
1054 1058
void
1460 1464
	XSelectInput(dpy, root, wa.event_mask);
1461 1465
1462 1466
	/* grab keys */
1463 -
	keypress(NULL);
1467 +
	grabkeys();
1464 1468
1465 1469
	/* init tags */
1466 1470
	compileregs();