Skip to content

Instantly share code, notes, and snippets.

@leite
Created August 11, 2023 12:04
Show Gist options
  • Save leite/4c76a4d8963c392895e5377037d1de2f to your computer and use it in GitHub Desktop.
Save leite/4c76a4d8963c392895e5377037d1de2f to your computer and use it in GitHub Desktop.
list devices and events of key and button release
#include <X11/Xlib.h>
#include <X11/extensions/XInput.h>
#include <stdio.h>
/**
* libs needed: libx11-dev libxi-dev
* $ gcc devices.c -o devices -lX11 -lXi && ./devices
*/
static int key_release_type = -1;
static int button_release_type = -1;
int main (int argc, char **argv) {
XDevice *device;
XInputClassInfo *ici;
XEventClass e_list[20];
XEvent e;
int n_devices, i, j, n = 0;
Display *display = XOpenDisplay(NULL);
unsigned long screen = DefaultScreen(display);
Window w_root = RootWindow(display, screen);
XDeviceInfo *devices = XListInputDevices(display, &n_devices);
for (i = 0; i < n_devices; ++i) {
if (devices[i].type < 1)
continue;
printf(
"[i] device, name: %s, id: %d, type: %d\n",
devices[i].name, (int) devices[i].id, (int) devices[i].type
);
// open device
device = XOpenDevice(display, devices[i].id);
// list device events
if (device->num_classes > 0) {
for (ici = device->classes, j=0; j < device->num_classes; ++ici, ++j) {
if (ici->input_class == KeyClass) {
printf(" -> device has key events, id: %d\n", (int) devices[i].id);
DeviceKeyRelease(device, key_release_type, e_list[n]); ++n;
} else if (ici->input_class == ButtonClass) {
printf(" -> device has button events, id: %d\n", (int) devices[i].id);
DeviceButtonRelease(device, button_release_type, e_list[n]); ++n;
}
}
}
}
XFreeDeviceList(devices);
printf("[i] number of devices: %d, events: %d\n", n_devices, n);
if (XSelectExtensionEvent(display, w_root, e_list, n)) {
printf("error selecting events\n");
}
setvbuf(stdout, NULL, _IOLBF, 0);
while (1) {
XNextEvent(display, &e);
if (e.type == key_release_type) {
XDeviceKeyEvent *key = (XDeviceKeyEvent *) &e;
printf("[e] key release %d \n", key->keycode);
} else if (e.type == button_release_type) {
XDeviceButtonEvent *button = (XDeviceButtonEvent *) &e;
printf("[e] button release %d \n", button->button);
}
}
XFree(display);
return 0;
}
// vim: ts=2 sw=2 et :
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment