/* gcc touchgrab.c -lXi -Wall -std=c99 -o touchgrab */ #include #include #include #include #include int main(int argc, char **argv) { Display *dpy = XOpenDisplay(NULL); int opcode, event, error; if (!XQueryExtension(dpy, "XInputExtension", &opcode, &event, &error)) { printf("X Input extension not available.\n"); return 1; } int major = 2, minor = 2; XIQueryVersion(dpy, &major, &minor); if (major * 1000 + minor < 2002) { printf("Server does not support XI 2.2\n"); return 1; } if (argc != 3 || (strcmp(argv[2], "accept") && strcmp(argv[2], "reject"))) { printf("Usage: %s accept|reject\n", argv[0]); return 1; } int dev = atoi(argv[1]); int mode = argv[2][0] == 'a' ? XIAcceptTouch : XIRejectTouch; static unsigned char touch_mask_data[4]; static XIEventMask touch_mask; touch_mask.deviceid = dev; touch_mask.mask = touch_mask_data; touch_mask.mask_len = sizeof(touch_mask_data); memset(touch_mask.mask, 0, touch_mask.mask_len); XISetMask(touch_mask.mask, XI_TouchBegin); XISetMask(touch_mask.mask, XI_TouchUpdate); XISetMask(touch_mask.mask, XI_TouchEnd); XIGrabModifiers modifier = {0}; modifier.modifiers = XIAnyModifier; Window win = XDefaultRootWindow(dpy); XIGrabButton(dpy, dev, 1, win, None, GrabModeAsync, GrabModeAsync, False, &touch_mask, 1, &modifier); if (XIGrabTouchBegin(dpy, dev, win, False, &touch_mask, 1, &modifier)) { printf("Grab failed\n"); return 1; } XIGrabDevice(dpy, dev, win, CurrentTime, None, GrabModeAsync, GrabModeAsync, False, &touch_mask); while (1) { XEvent ev; XNextEvent(dpy, &ev); if (ev.xcookie.type == GenericEvent && ev.xcookie.extension == opcode && XGetEventData(dpy, &ev.xcookie)) { XIDeviceEvent *event = (XIDeviceEvent *)ev.xcookie.data; switch(event->evtype) { case XI_TouchBegin: printf("TouchBegin: %d -> %d\n", event->sourceid, event->deviceid); XIAllowTouchEvents(dpy, event->deviceid, event->detail, win, mode); break; case XI_TouchUpdate: printf("TouchUpdate: %d -> %d\n", event->sourceid, event->deviceid); break; case XI_TouchEnd: printf("TouchEnd: %d -> %d\n", event->sourceid, event->deviceid); break; } } XFreeEventData(dpy, &ev.xcookie); } return 0; }