debian-dots

dotfiles (does the obvious)
git clone [email protected]:dracuxan/debian-dots.git
Log | Files | Refs | README | LICENSE

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 }