/*************************/ /* grabkey.c 1.00 */ /* by Adam M. Costello */ /* ***********************************/ /* */ /* grabkey [ -display ] */ /* */ /* Grabs the specified key, waits for it to be pressed */ /* once, then ungrabs it and exits. The has the */ /* form keysymname+modifier+modifier+... Valid modifiers */ /* are Shift, Lock, Control, Mod1, Mod2, Mod3, Mod4, Mod5. */ /***********************************************************/ /* This is ANSI C plus X11R6 code. */ #include #include #include #include #include #ifndef EXIT_FAILURE #define EXIT_FAILURE 1 #endif #ifndef EXIT_SUCCESS #define EXIT_SUCCESS 1 #endif void warn(char *msg) { fputs(msg,stderr); fflush(stderr); } void fail(char *msg) { warn(msg); exit(EXIT_FAILURE); } void usage(char **argv) /* Prints a usage message to stderr, then exits unsuccessfully. */ { fprintf(stderr, "\n" "usage:\n" "%s [ -display ] \n" "\n" " has the form keysymname+modifier+modifier+...\n" "Valid modifiers are" " Shift, Lock, Control, Mod1, Mod2, Mod3, Mod4, Mod5.\n" , argv[0] ); exit(EXIT_FAILURE); } void parseargs(int argc, char **argv, char **displayname, char **keysymname, unsigned int *modifiers) /* Parses the command line arguments and */ /* sets **displayname and **keysymname. */ { char **argp, *mod; int keysymseen = 0; *modifiers = 0; argp = argv; while (*++argp) { if (!strcmp(*argp, "-display")) { if (!*++argp) usage(argv); *displayname = *argp; } else if (**argp == '-') { usage(argv); } else { if (keysymseen) usage(argv); *keysymname = strtok(*argp, "+"); for (;;) { mod = strtok(NULL, "+"); if (!mod) break; if (!strcmp(mod, "Shift" )) *modifiers |= ShiftMask; else if (!strcmp(mod, "Lock" )) *modifiers |= LockMask; else if (!strcmp(mod, "Control")) *modifiers |= ControlMask; else if (!strcmp(mod, "Mod1" )) *modifiers |= Mod1Mask; else if (!strcmp(mod, "Mod2" )) *modifiers |= Mod2Mask; else if (!strcmp(mod, "Mod3" )) *modifiers |= Mod3Mask; else if (!strcmp(mod, "Mod4" )) *modifiers |= Mod4Mask; else if (!strcmp(mod, "Mod5" )) *modifiers |= Mod5Mask; else { warn("Unrecognized modifier.\n"); usage(argv); } } keysymseen = 1; } } } int main(int argc, char **argv) { char *displayname = NULL; Display *display; char *keysymname; unsigned int modifiers; KeySym keysym; KeyCode keycode; Window rootwindow; XEvent event; parseargs(argc, argv, &displayname, &keysymname, &modifiers); display = XOpenDisplay(displayname); if (!display) fail("Cannot open display.\n"); keysym = XStringToKeysym(keysymname); if (keysym == NoSymbol) fail("Invalid keysym.\n"); keycode = XKeysymToKeycode(display,keysym); if (!keycode) fail("Undefined keysym.\n"); rootwindow = DefaultRootWindow(display); XGrabKey(display,keycode,modifiers,rootwindow, False,GrabModeAsync,GrabModeAsync ); do XNextEvent(display, &event); while (event.type != KeyPress || event.xkey.keycode != keycode); XUngrabKey(display,keycode,modifiers,rootwindow); XCloseDisplay(display); return EXIT_SUCCESS; }