#include #include #include #include #include int main(int argc, char **argv) { Display *display; int xi_opcode, event, error; int major = 2, minor = 0; XIDeviceInfo *devs; int num_devs, i, mouse_id, have_mouse; if (!(display = XOpenDisplay(NULL))) return 1; XSynchronize(display, True); /* XInput Extension available? */ if (!XQueryExtension(display, "XInputExtension", &xi_opcode, &event, &error)) { printf("X Input extension not available.\n"); return 1; } /* Which version of XI2? We support 2.0 */ if (XIQueryVersion(display, &major, &minor) == BadRequest) { printf("XI2 not available. Server supports %d.%d\n", major, minor); return 1; } printf("XI2 available version %d.%d\n", major, minor); XSync(display, False); devs = XIQueryDevice(display, /*XIAllMasterDevices*/XIAllDevices, &num_devs); for (i = 0; i < num_devs; i++) { printf("Got device %d: (%s)\n", i, devs[i].name); if (devs[i].use == XISlavePointer) //if (devs[i].use == XIQueryVersion) { mouse_id = devs[i].deviceid; have_mouse = 1; printf("Have mouse too id=%d (%s)\n", mouse_id, devs[i].name); } } XIFreeDeviceInfo(devs); // if (have_mouse) { XIEventMask eventmask; unsigned char mask[XIMaskLen(XI_RawMotion)] = {0}; /* the actual mask */ /* Select for motion events */ eventmask.deviceid = XIAllDevices; eventmask.mask_len = XIMaskLen(XI_RawMotion); eventmask.mask = mask; //eventmask.deviceid = XIAllMasterDevices; eventmask.deviceid = 7; XISetMask(eventmask.mask, XI_RawKeyPress); XISetMask(eventmask.mask, XI_RawKeyRelease); XISetMask(eventmask.mask, XI_RawButtonPress); XISetMask(eventmask.mask, XI_RawButtonRelease); XISetMask(eventmask.mask, XI_RawMotion); XISelectEvents(display, DefaultRootWindow(display), &eventmask, 1); printf("Set mask\n"); while (1) { XEvent xev; XGenericEventCookie *cookie = (XGenericEventCookie*)&xev.xcookie; XNextEvent(display, &xev); if (XGetEventData(display, cookie) && cookie->type == GenericEvent && cookie->extension == xi_opcode) { XIRawEvent *revent = (XIRawEvent *)cookie->data; printf("EVENT type %d\n", cookie->evtype); switch(cookie->evtype) { case XI_RawKeyPress: printf("XI_RawKeyPress\t: %d\n", revent->detail); break; case XI_RawKeyRelease: printf("XI_RawKeyRelease\t: %d\n", revent->detail); break; case XI_RawButtonPress: printf("XI_RawButtonPress\t: %d\n", revent->detail); break; case XI_RawButtonRelease: printf("XI_RawButtonRelease\t: %d\n", revent->detail); break; case XI_RawMotion: { int i; double *val, *raw_val; val = revent->valuators.values; raw_val = revent->raw_values; for (i = 0; i < revent->valuators.mask_len * 8; i++) if (XIMaskIsSet(revent->valuators.mask, i)) printf(" %2d: %.2f (%.2f)\n", i, *val++, *raw_val++); break; } } } XFreeEventData(display, &xev.xcookie); } } XCloseDisplay(display); return 0; }