 |
/* gcc -o xi2_sample xi2_sample.c `pkg-config --cflags --libs xi` */
#include <stdio.h>
#include <X11/Xlib.h>
#include <X11/extensions/XInput.h>
int main (int argc, char** argv) {
Display *dpy;
Window win;
XDeviceInfo *info;
int ndevices,
i;
XDevice *pointer1 = NULL,
*pointer2 = NULL;
XEvent ev;
int type_bpress;
XEventClass cls[2];
dpy = XOpenDisplay(NULL);
XQueryInputVersion(dpy, XI_2_Major, XI_2_Minor);
/* Create and map window */
win = XCreateSimpleWindow(dpy, DefaultRootWindow(dpy), 0, 0, 400, 400,
0, 0, BlackPixel(dpy, DefaultScreen(dpy)));
XMapWindow(dpy, win);
XFlush(dpy);
info = XListInputDevices(dpy, &ndevices);
for (i = 0; i < ndevices; i++) {
XDeviceInfo* current = &info[i];
printf("Found device: %s (%d)\n", current->name, current->id);
switch(current->use) {
case IsXExtensionPointer:
case IsXExtensionKeyboard:
case IsXExtensionDevice:
printf(" .. is slave device (ignoring)\n");
break;
case IsXPointer:
if (!pointer1)
pointer1 = XOpenDevice(dpy, current->id);
else if (!pointer2)
pointer2 = XOpenDevice(dpy, current->id);
printf(" .. is master pointer\n");
break;
case IsXKeyboard:
printf(" .. is master keyboard\n");
break;
}
}
XFreeDeviceList(info);
if (!pointer2) { /* there is always at least one pointer */
printf("Only found one master pointer.\n");
printf("Try xinput --create-master \"name\"\n");
return 1;
}
DeviceButtonPress(pointer1, type_bpress, cls[0]);
DeviceButtonPress(pointer2, type_bpress, cls[1]);
XSelectExtensionEvent(dpy, win, cls, 2);
/* Main event loop */
while(1) {
XNextEvent(dpy, &ev);
printf("Event type %d received\n", ev.type);
if (ev.type == type_bpress) {
XDeviceButtonEvent* bev = (XDeviceButtonEvent*)&ev;
printf("Press received by device %d\n", bev->deviceid);
}
}
XCloseDevice(dpy, pointer1);
XCloseDevice(dpy, pointer2);
XCloseDisplay(dpy);
return 0;
}
|