From a76193c684a9ad4f907038172d7bb33694c41a9e Mon Sep 17 00:00:00 2001 From: Cody Hiar Date: Sat, 19 Oct 2019 15:45:18 -0600 Subject: Initial commit --- keyboard_reader.c | 80 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 keyboard_reader.c (limited to 'keyboard_reader.c') diff --git a/keyboard_reader.c b/keyboard_reader.c new file mode 100644 index 0000000..319f702 --- /dev/null +++ b/keyboard_reader.c @@ -0,0 +1,80 @@ +// xkbcat: Logs X11 keypresses, globally. + +#include +#include + +#include +#include +#include +#include + +const char * DEFAULT_DISPLAY = ":0"; +const bool DEFAULT_PRINT_UP = false; + +char * get_key() { + + const char * hostname = DEFAULT_DISPLAY; + bool printKeyUps = DEFAULT_PRINT_UP; + + // Set up X + Display * disp = XOpenDisplay(hostname); + if (NULL == disp) { + fprintf(stderr, "Cannot open X display: %s\n", hostname); + exit(1); + } + + // Test for XInput 2 extension + int xi_opcode; + int queryEvent, queryError; + if (! XQueryExtension(disp, "XInputExtension", &xi_opcode, + &queryEvent, &queryError)) { + // XXX Test version >=2 + fprintf(stderr, "X Input extension not available\n"); return ""; + } + + // Register events + Window root = DefaultRootWindow(disp); + XIEventMask m; + m.deviceid = XIAllMasterDevices; + m.mask_len = XIMaskLen(XI_LASTEVENT); + m.mask = calloc(m.mask_len, sizeof(char)); + XISetMask(m.mask, XI_RawKeyPress); + XISetMask(m.mask, XI_RawKeyRelease); + XISelectEvents(disp, root, &m, 1); + XSync(disp, false); + free(m.mask); + + while (1) { // Forever + XEvent event; + XGenericEventCookie *cookie = (XGenericEventCookie*)&event.xcookie; + XNextEvent(disp, &event); + + if (XGetEventData(disp, cookie) && + cookie->type == GenericEvent && + cookie->extension == xi_opcode) + { + switch (cookie->evtype) + { + case XI_RawKeyRelease: if (!printKeyUps) continue; + case XI_RawKeyPress: { + XIRawEvent *ev = cookie->data; + + // Ask X what it calls that key + KeySym s = XkbKeycodeToKeysym(disp, ev->detail, 0, 0); + if (NoSymbol == s) continue; + char *str = XKeysymToString(s); + if (NULL == str) continue; + + + if (printKeyUps) printf("%s", cookie->evtype == XI_RawKeyPress ? "+" : "-"); + char *ret = malloc(1000); + sprintf(ret, "%s", str); + XCloseDisplay(disp); + return ret; + break; + } + } + } + fflush(stdout); + } +} -- cgit v1.2.3