added key handling 366d81e3
Anselm R. Garbe · 2006-07-11 11:50 5 file(s) · +44 −30
Makefile +1 −1
3 3
4 4
include config.mk
5 5
6 -
WMSRC = bar.c client.c draw.c event.c util.c wm.c
6 +
WMSRC = bar.c client.c cmd.c draw.c event.c key.c util.c wm.c
7 7
WMOBJ = ${WMSRC:.c=.o}
8 8
MENSRC = menu.c draw.c util.c
9 9
MENOBJ = ${MENSRC:.c=.o}
config.h +2 −0
9 9
#define BORDERCOLOR	"#000000"
10 10
#define STATUSCMD	"echo -n `date` `uptime | sed 's/.*://; s/,//g'`" \
11 11
					" `acpi | awk '{print $4}' | sed 's/,//'`"
12 +
#define KEYS		\
13 +
	{ Mod1Mask, XK_Return, run, "xterm -u8 -bg black -fg white -fn -*-terminus-medium-*-*-*-14-*-*-*-*-*-iso10646-*" },
key.c (added) +26 −0
1 +
/*
2 +
 * (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com>
3 +
 * See LICENSE file for license details.
4 +
 */
5 +
6 +
#include "wm.h"
7 +
8 +
#include <X11/keysym.h>
9 +
10 +
static Key key[] = {
11 +
	KEYS
12 +
};
13 +
14 +
void
15 +
update_keys()
16 +
{
17 +
	unsigned int i, len;
18 +
	KeyCode code;
19 +
20 +
	len = sizeof(key) / sizeof(key[0]);
21 +
	for(i = 0; i < len; i++) {
22 +
		code = XKeysymToKeycode(dpy, key[i].keysym);
23 +
		XUngrabKey(dpy, code, key[i].mod, root);
24 +
		XGrabKey(dpy, code, key[i].mod, root, True, GrabModeAsync, GrabModeAsync);
25 +
	}
26 +
}
wm.c +1 −28
24 24
25 25
char *bartext, tag[256];
26 26
int screen, sel_screen;
27 -
unsigned int lock_mask, numlock_mask;
28 27
29 28
/* draw structs */
30 29
Brush brush = {0};
144 143
}
145 144
146 145
static void
147 -
init_lock_keys()
148 -
{
149 -
	XModifierKeymap *modmap;
150 -
	KeyCode numlock;
151 -
	int i;
152 -
	static int masks[] = {
153 -
		ShiftMask, LockMask, ControlMask, Mod1Mask,
154 -
		Mod2Mask, Mod3Mask, Mod4Mask, Mod5Mask
155 -
	};
156 -
157 -
	numlock_mask = 0;
158 -
	modmap = XGetModifierMapping(dpy);
159 -
	numlock = XKeysymToKeycode(dpy, XStringToKeysym("Num_Lock"));
160 -
161 -
	if(modmap && modmap->max_keypermod > 0) {
162 -
		int max = (sizeof(masks) / sizeof(int)) * modmap->max_keypermod;
163 -
		for(i = 0; i < max; i++)
164 -
			if(numlock && (modmap->modifiermap[i] == numlock))
165 -
				numlock_mask = masks[i / modmap->max_keypermod];
166 -
	}
167 -
	XFreeModifiermap(modmap);
168 -
169 -
	lock_mask = 255 & ~(numlock_mask | LockMask);
170 -
}
171 -
172 -
static void
173 146
cleanup()
174 147
{
175 148
	/*
243 216
	cursor[CurResize] = XCreateFontCursor(dpy, XC_sizing);
244 217
	cursor[CurMove] = XCreateFontCursor(dpy, XC_fleur);
245 218
246 -
	init_lock_keys();
219 +
	update_keys();
247 220
248 221
	brush.drawable = XCreatePixmap(dpy, root, rect.width, rect.height,
249 222
			DefaultDepth(dpy, screen));
wm.h +14 −1
20 20
enum { RFloat, RGrid, RLast };
21 21
22 22
typedef struct Client Client;
23 +
typedef struct Key Key;
23 24
24 25
struct Client {
25 26
	char name[256];
34 35
	XRectangle r[RLast];
35 36
	Client *next;
36 37
	Client *snext;
38 +
};
39 +
40 +
struct Key {
41 +
	unsigned long mod;
42 +
	KeySym keysym;
43 +
	void (*func)(char *arg);
44 +
	char *arg;
37 45
};
38 46
39 47
extern Display *dpy;
46 54
extern void (*handler[LASTEvent]) (XEvent *);
47 55
48 56
extern int screen, sel_screen;
49 -
extern unsigned int lock_mask, numlock_mask;
50 57
extern char *bartext, tag[256];
51 58
52 59
extern Brush brush;
54 61
55 62
/* bar.c */
56 63
extern void draw_bar();
64 +
65 +
/* cmd.c */
66 +
extern void run(char *arg);
57 67
58 68
/* client.c */
59 69
extern Client *create_client(Window w, XWindowAttributes *wa);
60 70
extern void manage(Client *c);
71 +
72 +
/* key.c */
73 +
extern void update_keys();
61 74
62 75
/* wm.c */
63 76
extern int win_proto(Window w);