caps_watch.c (1026B)
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <X11/Xlib.h> 4 #include <X11/XKBlib.h> 5 6 int main(void) 7 { 8 Display *dpy; 9 int xkbEventType, xkbError; 10 int major = XkbMajorVersion, minor = XkbMinorVersion; 11 12 dpy = XkbOpenDisplay(NULL, &xkbEventType, NULL, &major, &minor, &xkbError); 13 if (!dpy) 14 return 1; 15 16 XkbSelectEventDetails(dpy, XkbUseCoreKbd, XkbStateNotify, 17 XkbModifierLockMask, XkbModifierLockMask); 18 19 int prev = -1; 20 21 XEvent xev; 22 while (1) { 23 XNextEvent(dpy, &xev); 24 if (xev.type != xkbEventType) 25 continue; 26 27 XkbEvent *xkbe = (XkbEvent *)&xev; 28 if (xkbe->any.xkb_type != XkbStateNotify) 29 continue; 30 31 int on = (xkbe->state.locked_mods & LockMask) != 0; 32 if (on == prev) 33 continue; 34 prev = on; 35 36 char cmd[256]; 37 snprintf(cmd, sizeof(cmd), 38 "dunstify 'Caps Lock: %s'", 39 on ? "ON" : "OFF"); 40 system(cmd); 41 } 42 return 0; 43 }