]> diplodocus.org Git - xorg-xinput/blobdiff - src/test_xi2.c
gitlab CI: stop requiring Signed-off-by in commits
[xorg-xinput] / src / test_xi2.c
index 4a6c3b665edb2d3314cbb3539c131978afad046d..5f97258c581350162dc9f62df65ea4db0ae540ed 100644 (file)
@@ -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: