Created
August 11, 2023 12:04
-
-
Save leite/4c76a4d8963c392895e5377037d1de2f to your computer and use it in GitHub Desktop.
list devices and events of key and button release
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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