+static void print_deviceevent(XIDeviceEvent* event)
+{
+ double *val;
+ int i;
+
+ printf(" device: %d (%d)\n", event->deviceid, event->sourceid);
+ printf(" detail: %d\n", event->detail);
+ printf(" buttons:");
+ for (i = 0; i < event->buttons->mask_len * 8; i++)
+ if (BitIsOn(event->buttons->mask, i))
+ printf(" %d", i);
+ printf("\n");
+
+ printf(" modifiers: locked 0x%x latched 0x%x base 0x%x\n",
+ event->mods->locked, event->mods->latched,
+ event->mods->base);
+ printf(" group: locked 0x%x latched 0x%x base 0x%x\n",
+ event->group->locked, event->group->latched,
+ event->group->base);
+ printf(" valuators:");
+
+ val = event->valuators->values;
+ for (i = 0; i < event->valuators->mask_len * 8; i++)
+ if (BitIsOn(event->valuators->mask, i))
+ printf(" %.2f", *val++);
+ printf("\n");
+
+ printf(" windows: root 0x%lx event 0x%lx child 0x%ld\n",
+ event->root, event->event, event->child);
+}
+
+static void print_devicechangedevent(Display *dpy, XIDeviceChangedEvent *event)
+{
+ printf(" device: %d (%d)\n", event->deviceid, event->sourceid);
+ printf(" reason: %s\n", (event->reason == SlaveSwitch) ? "SlaveSwitch" :
+ "DeviceChanged");
+ print_classes_xi2(dpy, event->classes, event->num_classes);
+}
+
+