/* gcc -Os -s -oxmodifiers xmodifiers.c -lX11 */ #include #include #include #include #include #include static void fatal(const char *str) { fprintf(stderr, "%s\n", str); exit(1); } static unsigned ctom(char c) { switch (c) { case 'S': return ShiftMask; case 'L': return LockMask; case 'C': return ControlMask; case 'a': return Mod1Mask; case 'b': return Mod2Mask; case 'c': return Mod3Mask; case 'd': return Mod4Mask; case 'e': return Mod5Mask; case '1': return Button1Mask; case '2': return Button2Mask; case '3': return Button3Mask; case '4': return Button4Mask; case '5': return Button5Mask; default: fatal("invalid qualifier"); } return 0; } int main(int argc, char **argv) { unsigned mask; if (argc > 1 && strcmp(argv[1], "-h")==0) { printf("usage: %s [SLCabcde12345] ...\n", argv[0]); printf("checks X11 keyboard qualifiers. either returns the current set\n"); printf("or checks if any of the given sets are pressed.\n"); printf("SLC is Shift/Lock/Control, abcdef = MOD1-5, 12345 = Pointer1-5\n"); exit(0); } { int i; Window w; Display *dpy = XOpenDisplay(0); if (!dpy) fatal("unable to open display"); if (!XQueryPointer(dpy, DefaultRootWindow(dpy), &w, &w, &i, &i, &i, &i, &mask)) fatal("query pointer failed"); XCloseDisplay(dpy); } if (!*++argv) { char buf[32]; int i = 0; char c, *cs = "SLCabcde12345"; while (c = *cs++) if (mask & ctom(c)) buf[i++] = c; buf[i] = 0; printf("%s\n", buf); exit(0); } else { char *p; while (p = *argv++) { unsigned m = 0; while (*p) m |= ctom(*p++); if ((mask & m) == m) exit(0); } exit(1); } return 0; }