X-Git-Url: https://diplodocus.org/git/xorg-xinput/blobdiff_plain/960ed57f624e200467d5b7801da0d11337d8eba4..refs/heads/master:/src/test_xi2.c?ds=sidebyside diff --git a/src/test_xi2.c b/src/test_xi2.c index 4a6c3b6..5f97258 100644 --- a/src/test_xi2.c +++ b/src/test_xi2.c @@ -47,6 +47,7 @@ static void print_deviceevent(XIDeviceEvent* event) int i; printf(" device: %d (%d)\n", event->deviceid, event->sourceid); + printf(" time: %ld\n", event->time); printf(" detail: %d\n", event->detail); switch(event->evtype) { case XI_KeyPress: @@ -59,6 +60,15 @@ static void print_deviceevent(XIDeviceEvent* event) case XI_Motion: printf(" flags: %s\n", (event->flags & XIPointerEmulated) ? "emulated" : ""); break; +#endif +#if HAVE_XI22 + case XI_TouchBegin: + case XI_TouchUpdate: + case XI_TouchEnd: + printf(" flags:%s%s\n", + (event->flags & XITouchPendingEnd) ? " pending_end" : "", + (event->flags & XITouchEmulatingPointer) ? " emulating" : ""); + break; #endif } @@ -91,6 +101,7 @@ static void print_deviceevent(XIDeviceEvent* event) static void print_devicechangedevent(Display *dpy, XIDeviceChangedEvent *event) { printf(" device: %d (%d)\n", event->deviceid, event->sourceid); + printf(" time: %ld\n", event->time); printf(" reason: %s\n", (event->reason == XISlaveSwitch) ? "SlaveSwitch" : "DeviceChanged"); print_classes_xi2(dpy, event->classes, event->num_classes); @@ -99,6 +110,7 @@ static void print_devicechangedevent(Display *dpy, XIDeviceChangedEvent *event) static void print_hierarchychangedevent(XIHierarchyEvent *event) { int i; + printf(" time: %ld\n", event->time); printf(" Changes happened: %s %s %s %s %s %s %s %s\n", (event->flags & XIMasterAdded) ? "[new master]" : "", (event->flags & XIMasterRemoved) ? "[master removed]" : "", @@ -147,9 +159,9 @@ static void print_rawevent(XIRawEvent *event) int i; double *val, *raw_val; - printf(" device: %d\n", event->deviceid); + printf(" device: %d (%d)\n", event->deviceid, event->sourceid); + printf(" time: %ld\n", event->time); printf(" detail: %d\n", event->detail); - printf(" valuators:\n"); #if HAVE_XI21 switch(event->evtype) { case XI_RawButtonPress: @@ -160,6 +172,7 @@ static void print_rawevent(XIRawEvent *event) } #endif + printf(" valuators:\n"); val = event->valuators.values; raw_val = event->raw_values; for (i = 0; i < event->valuators.mask_len * 8; i++) @@ -175,6 +188,7 @@ static void print_enterleave(XILeaveEvent* event) int i; printf(" device: %d (%d)\n", event->deviceid, event->sourceid); + printf(" time: %ld\n", event->time); printf(" windows: root 0x%lx event 0x%lx child 0x%ld\n", event->root, event->event, event->child); switch(event->mode) @@ -230,6 +244,7 @@ static void print_propertyevent(Display *display, XIPropertyEvent* event) else changed = "modified"; name = XGetAtomName(display, event->property); + printf(" time: %ld\n", event->time); printf(" property: %ld '%s'\n", event->property, name); printf(" changed: %s\n", changed); @@ -301,6 +316,12 @@ static const char* type_to_name(int evtype) case XI_RawButtonPress: name = "RawButtonPress"; break; case XI_RawButtonRelease: name = "RawButtonRelease"; break; case XI_RawMotion: name = "RawMotion"; break; + case XI_TouchBegin: name = "TouchBegin"; break; + case XI_TouchUpdate: name = "TouchUpdate"; break; + case XI_TouchEnd: name = "TouchEnd"; break; + case XI_RawTouchBegin: name = "RawTouchBegin"; break; + case XI_RawTouchUpdate: name = "RawTouchUpdate"; break; + case XI_RawTouchEnd: name = "RawTouchEnd"; break; default: name = "unknown event type"; break; } @@ -315,70 +336,91 @@ test_xi2(Display *display, char *name, char *desc) { - XIEventMask mask; + XIEventMask mask[2]; + XIEventMask *m; Window win; int deviceid = -1; + int use_root = 0; + int rc; + + setvbuf(stdout, NULL, _IOLBF, 0); + + if (argc >= 1 && strcmp(argv[0], "--root") == 0) { + use_root = 1; + + argc--; + argv++; + } + + rc = list(display, argc, argv, name, desc); + if (rc != EXIT_SUCCESS) + return rc; + + if (use_root) + win = DefaultRootWindow(display); + else + win = create_win(display); - list(display, argc, argv, name, desc); if (argc >= 1) { XIDeviceInfo *info; info = xi2_find_device_info(display, argv[0]); + /* info is alway valid, the list() call exits if the device + cannot be found, but let's shut up coverity */ + if (!info) + return EXIT_FAILURE; deviceid = info->deviceid; } - win = create_win(display); /* Select for motion events */ - mask.deviceid = (deviceid == -1) ? XIAllDevices : deviceid; - mask.mask_len = XIMaskLen(XI_RawMotion); - mask.mask = calloc(mask.mask_len, sizeof(char)); - XISetMask(mask.mask, XI_ButtonPress); - XISetMask(mask.mask, XI_ButtonRelease); - XISetMask(mask.mask, XI_KeyPress); - XISetMask(mask.mask, XI_KeyRelease); - XISetMask(mask.mask, XI_Motion); - XISetMask(mask.mask, XI_DeviceChanged); - XISetMask(mask.mask, XI_Enter); - XISetMask(mask.mask, XI_Leave); - XISetMask(mask.mask, XI_FocusIn); - XISetMask(mask.mask, XI_FocusOut); - if (mask.deviceid == XIAllDevices) - XISetMask(mask.mask, XI_HierarchyChanged); - XISetMask(mask.mask, XI_PropertyEvent); - XISelectEvents(display, win, &mask, 1); - XMapWindow(display, win); - XSync(display, False); + m = &mask[0]; + m->deviceid = (deviceid == -1) ? XIAllDevices : deviceid; + m->mask_len = XIMaskLen(XI_LASTEVENT); + m->mask = calloc(m->mask_len, sizeof(char)); + XISetMask(m->mask, XI_ButtonPress); + XISetMask(m->mask, XI_ButtonRelease); + XISetMask(m->mask, XI_KeyPress); + XISetMask(m->mask, XI_KeyRelease); + XISetMask(m->mask, XI_Motion); + XISetMask(m->mask, XI_DeviceChanged); + XISetMask(m->mask, XI_Enter); + XISetMask(m->mask, XI_Leave); + XISetMask(m->mask, XI_FocusIn); + XISetMask(m->mask, XI_FocusOut); +#if HAVE_XI22 + XISetMask(m->mask, XI_TouchBegin); + XISetMask(m->mask, XI_TouchUpdate); + XISetMask(m->mask, XI_TouchEnd); +#endif + if (m->deviceid == XIAllDevices) + XISetMask(m->mask, XI_HierarchyChanged); + XISetMask(m->mask, XI_PropertyEvent); + + m = &mask[1]; + m->deviceid = (deviceid == -1) ? XIAllMasterDevices : deviceid; + m->mask_len = XIMaskLen(XI_LASTEVENT); + m->mask = calloc(m->mask_len, sizeof(char)); + XISetMask(m->mask, XI_RawKeyPress); + XISetMask(m->mask, XI_RawKeyRelease); + XISetMask(m->mask, XI_RawButtonPress); + XISetMask(m->mask, XI_RawButtonRelease); + XISetMask(m->mask, XI_RawMotion); +#if HAVE_XI22 + XISetMask(m->mask, XI_RawTouchBegin); + XISetMask(m->mask, XI_RawTouchUpdate); + XISetMask(m->mask, XI_RawTouchEnd); +#endif - { - XIGrabModifiers modifiers[] = {{0, 0}, {0, 0x10}, {0, 0x1}, {0, 0x11}}; - int nmods = sizeof(modifiers)/sizeof(modifiers[0]); - - mask.deviceid = 2; - memset(mask.mask, 0, mask.mask_len); - XISetMask(mask.mask, XI_KeyPress); - XISetMask(mask.mask, XI_KeyRelease); - XISetMask(mask.mask, XI_ButtonPress); - XISetMask(mask.mask, XI_ButtonRelease); - XISetMask(mask.mask, XI_Motion); - XIGrabButton(display, 2, 1, win, None, GrabModeAsync, GrabModeAsync, - False, &mask, nmods, modifiers); - XIGrabKeycode(display, 3, 24 /* q */, win, GrabModeAsync, GrabModeAsync, - False, &mask, nmods, modifiers); - XIUngrabButton(display, 3, 1, win, nmods - 2, &modifiers[2]); - XIUngrabKeycode(display, 3, 24 /* q */, win, nmods - 2, &modifiers[2]); + XISelectEvents(display, win, &mask[0], use_root ? 2 : 1); + if (!use_root) { + XISelectEvents(display, DefaultRootWindow(display), &mask[1], 1); + XMapWindow(display, win); } + XSync(display, False); - mask.deviceid = (deviceid == -1) ? XIAllMasterDevices : deviceid; - memset(mask.mask, 0, mask.mask_len); - XISetMask(mask.mask, XI_RawKeyPress); - XISetMask(mask.mask, XI_RawKeyRelease); - XISetMask(mask.mask, XI_RawButtonPress); - XISetMask(mask.mask, XI_RawButtonRelease); - XISetMask(mask.mask, XI_RawMotion); - XISelectEvents(display, DefaultRootWindow(display), &mask, 1); + free(mask[0].mask); + free(mask[1].mask); - free(mask.mask); - - { + if (!use_root) { XEvent event; XMaskEvent(display, ExposureMask, &event); XSelectInput(display, win, 0); @@ -412,6 +454,9 @@ test_xi2(Display *display, case XI_RawButtonPress: case XI_RawButtonRelease: case XI_RawMotion: + case XI_RawTouchBegin: + case XI_RawTouchUpdate: + case XI_RawTouchEnd: print_rawevent(cookie->data); break; case XI_Enter: