diff options
| -rw-r--r-- | daemonic.c | 35 |
1 files changed, 20 insertions, 15 deletions
@@ -10,19 +10,15 @@ typedef struct Key { #include "config.h" -#define LENGTH(X) (sizeof X / sizeof X[0]) +#define LENGTH(X) (sizeof X / sizeof X[0]) +#define CLEANMASK(mask) (mask & ~LockMask & (ShiftMask|ControlMask|Mod1Mask|Mod2Mask|Mod3Mask|Mod4Mask|Mod5Mask)) -void -bind_key(Display *dpy, Window win, unsigned int mod, KeySym key) -{ +void bind_key(Display *dpy, Window win, unsigned int mod, KeySym key) { int keycode = XKeysymToKeycode(dpy, key); - XGrabKey(dpy, keycode, mod, win, False, GrabModeAsync, GrabModeAsync); } -int -error_handler(Display *disp, XErrorEvent *xe) -{ +int error_handler(Display *disp, XErrorEvent *xe) { if (xe->error_code == BadAccess) { printf("daemonic: [BadAccess] Cant grab key binding. Already grabbed\n"); return 0; @@ -32,17 +28,27 @@ error_handler(Display *disp, XErrorEvent *xe) return 1; } -int -main() -{ - int running = 10; +void keypress(Display *dpy, XKeyEvent *ev) { + unsigned int i; + KeySym keysym = XKeycodeToKeysym(dpy, (KeyCode) ev->keycode, 0); + + for (i = 0; i < LENGTH(keys); i++) { + if (keysym == keys[i].key && CLEANMASK(keys[i].mod) == CLEANMASK(ev->state) && keys[i].command) { + printf("Executin: %s\n", keys[i].command); + } + } +} + +int main() { XSetErrorHandler(error_handler); + int running = 10; + int i; + Display *dpy = XOpenDisplay(0); Window root = DefaultRootWindow(dpy); // Grab keys - int i; for (i = 0; i < LENGTH(keys); i++) { bind_key(dpy, root, keys[i].mod, keys[i].key); } @@ -54,8 +60,7 @@ main() XSync(dpy, False); while (running && !XNextEvent(dpy, &ev)) { if (ev.type == KeyPress) { - printf("Key: %d\n", ev.xkey.keycode); - + keypress(dpy, &ev.xkey); running--; } } |
