// SPDX-License-Identifier: WTFPL // based on https://wayland.freedesktop.org/libinput/doc/latest/api/ // cc -Wall -O2 key_event_unix.c `pkg-config --cflags --libs libinput libudev` -o key_event_unix // On OpenBSD, this program must be run as root without X.org #include #include #include #include #include #include #include #include #include #include static int open_restricted(const char *path, int flags, void *user_data) { int fd = open(path, flags); return fd < 0 ? -errno : fd; } static void close_restricted(int fd, void *user_data) { close(fd); } const static struct libinput_interface interface = { .open_restricted = open_restricted, .close_restricted = close_restricted, }; int main(void) { struct udev *udev; struct libinput *li; struct libinput_event *ev; struct pollfd pfd; struct libinput_event_keyboard *kev; struct libinput_event_pointer *pev; enum libinput_event_type type; enum libinput_key_state ks; enum libinput_button_state bs; uint32_t key; uint64_t us, last_us = 0; bool quit = false, first = true; if ((udev = udev_new()) == NULL) goto fin0; if ((li = libinput_udev_create_context(&interface, NULL, udev)) == NULL) goto fin1; libinput_udev_assign_seat(li, "seat0"); pfd.fd = libinput_get_fd(li); pfd.events = POLLIN; while (!quit) { poll(&pfd, 1, -1); libinput_dispatch(li); while ((ev = libinput_get_event(li)) != NULL) { type = libinput_event_get_type(ev); switch (type) { default: break; case LIBINPUT_EVENT_POINTER_BUTTON: pev = libinput_event_get_pointer_event(ev); key = libinput_event_pointer_get_button(pev); bs = libinput_event_pointer_get_button_state(pev); us = libinput_event_pointer_get_time_usec(pev); printf("Button %s: VK: 0x%-3X | Interval: ", bs ? "Pressed " : "Released", key); if (first) { printf("---- ms (First)\n"); first = false; } else { printf("%.3f ms\n", (double)(us - last_us) / 1000); } last_us = us; break; case LIBINPUT_EVENT_KEYBOARD_KEY: kev = libinput_event_get_keyboard_event(ev); key = libinput_event_keyboard_get_key(kev); ks = libinput_event_keyboard_get_key_state(kev); us = libinput_event_keyboard_get_time_usec(kev); quit = (key == 1); printf("Key %s: VK: 0x%-3X | Interval: ", ks ? "Pressed " : "Released", key); if (first) { printf("---- ms (First)\n"); first = false; } else { printf("%.3f ms\n", (double)(us - last_us) / 1000); } last_us = us; break; } } libinput_event_destroy(ev); } libinput_unref(li); fin1: udev_unref(udev); fin0: return 0; }