tkey.c - spoon - [fork] customized build of spoon, the dwm status utility
(HTM) git clone git://src.adamsgaard.dk/spoon
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) LICENSE
---
tkey.c (1019B)
---
1 #include <err.h>
2 #include <stdio.h>
3
4 #include <X11/keysym.h>
5 #include <X11/Xlib.h>
6
7 #include "types.h"
8 #include "util.h"
9
10 int
11 keyread(void *arg, char *buf, size_t len)
12 {
13 Display *dpy;
14 XModifierKeymap *map;
15 KeyCode keycode;
16 Window w1, w2;
17 int i1, i2, i3, i4;
18 unsigned modmask;
19 unsigned keymask;
20 struct keyarg *key = arg;
21 int on;
22 int i;
23
24 dpy = XOpenDisplay(NULL);
25 if (dpy == NULL) {
26 warnx("cannot open display");
27 return -1;
28 }
29 keycode = XKeysymToKeycode(dpy, key->sym);
30 if (keycode == NoSymbol) {
31 warnx("no key code for this symbol");
32 XCloseDisplay(dpy);
33 return -1;
34 }
35 map = XGetModifierMapping(dpy);
36 for (i = 0; i < 8; i++)
37 if (map->modifiermap[map->max_keypermod * i] == keycode)
38 keymask = 1U << i;
39 XFreeModifiermap(map);
40 XQueryPointer(dpy, DefaultRootWindow(dpy),
41 &w1, &w2, &i1, &i2, &i3, &i4, &modmask);
42 XCloseDisplay(dpy);
43 on = (keymask & modmask) != 0;
44 DPRINTF_D(on);
45 if (on)
46 snprintf(buf, len, "%s", key->on);
47 else
48 snprintf(buf, len, "%s", key->off);
49 return 0;
50 }