From 1fbb3a2953d1555483fef73891b820b1f4ba8e0e Mon Sep 17 00:00:00 2001 From: ribet Date: Tue, 18 Jul 2017 16:09:58 +0000 Subject: Fixed hierarchy change and raw data for multi-screen --- debian/changelog | 8 +++ xinput2_ivy.c | 187 +++++++++++++++++++++++++++++++++---------------------- 2 files changed, 121 insertions(+), 74 deletions(-) diff --git a/debian/changelog b/debian/changelog index cc930d3..99ab421 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,11 @@ +xinput2-ivy (1.0.2-1) unstable; urgency=low + + * Rewrite of hierarchy update code + * Fix coordinate for multiple screen (transmit only raw data) + * Initial non-working touch code + + -- Philippe Ribet Tue, 18 Jul 2017 18:08:00 +0200 + xinput2-ivy (1.0.1-1) unstable; urgency=low * Fix: crash when device unpluged twice diff --git a/xinput2_ivy.c b/xinput2_ivy.c index 6fb6a7a..c4af95f 100644 --- a/xinput2_ivy.c +++ b/xinput2_ivy.c @@ -56,6 +56,9 @@ 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_RawTouchBegin: name = "RawTouchBegin"; break; + case XI_RawTouchUpdate: name = "RawTouchUpdate"; break; + case XI_RawTouchEnd: name = "RawTouchEnd"; break; default: name = "unknown event type"; break; } @@ -97,11 +100,10 @@ static void init_valuators_definitions (Display *display, XIDeviceInfo* device) } } valuators_names[v->number] = memcpy(malloc(size + 1), name, size + 1); - printf("%s, ", (name) ? name : "None"); - if (v->label) { XFree(name); } + printf("%d %f->%f\n", v->number, v->min, v->max); valuators_min[v->number] = v->min; valuators_max[v->number] = v->max; num_valuators++; @@ -111,38 +113,47 @@ static void init_valuators_definitions (Display *display, XIDeviceInfo* device) } } +static void register_hierarchy_changed (Display *display) { + XIEventMask mask; + mask.deviceid = XIAllDevices; + mask.mask_len = XIMaskLen(XI_LASTEVENT); + mask.mask = calloc(mask.mask_len, sizeof(char)); + XISetMask(mask.mask, XI_HierarchyChanged); + XISelectEvents(display, DefaultRootWindow(display), &mask, 1); + free(mask.mask); +} + static void register_events (Display *display, XIDeviceInfo* device) { - XIEventMask mask[2]; - mask[0].deviceid = XIAllDevices; - mask[0].mask_len = XIMaskLen(XI_LASTEVENT); - mask[0].mask = calloc(mask[0].mask_len, sizeof(char)); - XISetMask(mask[0].mask, XI_HierarchyChanged); - - if (device) { - mask[1].deviceid = device->deviceid; - mask[1].mask_len = XIMaskLen(XI_LASTEVENT); - mask[1].mask = calloc(mask[1].mask_len, sizeof(char)); - XISetMask(mask[1].mask, XI_RawKeyPress); - XISetMask(mask[1].mask, XI_RawKeyRelease); - XISetMask(mask[1].mask, XI_RawButtonPress); - XISetMask(mask[1].mask, XI_RawButtonRelease); - XISetMask(mask[1].mask, XI_RawMotion); - init_valuators_definitions(display, device); - } else { - int i; - for (i=0; i < num_valuators; i++) { - free(valuators_names[i]); - } - free(valuators_names); - free(valuators_min); - free(valuators_max); - } + XIEventMask mask; + mask.deviceid = device->deviceid; + mask.mask_len = XIMaskLen(XI_LASTEVENT); + mask.mask = calloc(mask.mask_len, sizeof(char)); + 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); + + XISetMask(mask.mask, XI_RawTouchBegin); + XISetMask(mask.mask, XI_RawTouchUpdate); + XISetMask(mask.mask, XI_RawTouchEnd); + XISetMask(mask.mask, XI_TouchBegin); + XISetMask(mask.mask, XI_TouchUpdate); + XISetMask(mask.mask, XI_TouchEnd); + + init_valuators_definitions(display, device); + XISelectEvents(display, DefaultRootWindow(display), &mask, 1); + free(mask.mask); +} - XISelectEvents(display, DefaultRootWindow(display), mask, device ? 2 : 1); - free(mask[0].mask); - if (device) { - free(mask[1].mask); - } +static void unregister_events (Display *display, int deviceid) { + printf("Unregistering device %d\n", deviceid); + XIEventMask mask; + mask.deviceid = deviceid; + mask.mask_len = XIMaskLen(XI_LASTEVENT); + mask.mask = calloc(mask.mask_len, sizeof(char)); /* alternative to clear mask is to use 0 as length */ + XISelectEvents(display, DefaultRootWindow(display), &mask, 1); + free(mask.mask); } static XIDeviceInfo* find_device_info (Display *display, char *name) @@ -189,9 +200,15 @@ static void hierarchy_changed_callback (Display *display, XIHierarchyEvent *even if (event->info[i].deviceid == device_info->deviceid) { if (!event->info[i].enabled) { printf("*** Device %s now disabled\n", device_name); + int i; + for (i=0; i < num_valuators; i++) { + free(valuators_names[i]); + } + free(valuators_names); + free(valuators_min); + free(valuators_max); device_info = NULL; - // register_events(event->display, NULL); - register_events(display, NULL); + break; } } } @@ -207,14 +224,52 @@ static void hierarchy_changed_callback (Display *display, XIHierarchyEvent *even } } -static void raw_event_callback (XIRawEvent *event) { +static void raw_button_callback (Display *display, XIRawEvent *event, int type) { + int ndevices; + XIDeviceInfo* device = XIQueryDevice(display, event->deviceid, &ndevices); + static char message[2000]; + int length; + int i; + if (event->deviceid != device_info->deviceid) { + unregister_events(display, event->deviceid); + return; + } + + strcpy(message, "InputButtonEvent "); + strcat(message, identifier); + length = strlen(message); + length += sprintf(message + length, " num=%d state=%s", event->detail, (type == XI_RawButtonPress) ? "pressed" : "released"); + int raw_value_index = 0; + for (i = 0; i < device->num_classes; i++) { + switch(device->classes[i]->type) { + case XIButtonClass: + break; + case XIKeyClass: + break; + case XIValuatorClass: + { + XIValuatorClassInfo *v = (XIValuatorClassInfo*)(device->classes[i]); + // length += sprintf(message + length, " %s=%.2f", valuators_names[v->number], v->value); + length += sprintf(message + length, " %s=%.2f", valuators_names[v->number], event->raw_values[raw_value_index++]); + break; + } + } + } + length += sprintf(message + length, " time=%u", (uint32_t)event->time); + IvySendMsg(message); + /* printf("%s\n", message);*/ + XIFreeDeviceInfo(device); +} + +static void raw_motion_callback (Display *display, XIRawEvent *event) { int i; - double *val; + // double *val; static char message[2000]; int length; if (event->deviceid != device_info->deviceid) { - printf("??????????\n"); + unregister_events(display, event->deviceid); + return; } strcpy(message, "InputMoveEvent "); @@ -225,10 +280,12 @@ static void raw_event_callback (XIRawEvent *event) { printf("type: %d, ", event->evtype); printf("valuators:\n"); */ - val = event->valuators.values; + //val = event->valuators.values; + int raw_value_index = 0; for (i = 0; i < event->valuators.mask_len * 8; i++) { if (XIMaskIsSet(event->valuators.mask, i)) { - length += sprintf(message + length, " %s=%.2f", valuators_names[i], *val++); + // length += sprintf(message + length, " %s=%.2f", valuators_names[i], *val++); + length += sprintf(message + length, " %s=%.2f", valuators_names[i], event->raw_values[raw_value_index++]); } } length += sprintf(message + length, " time=%u", (uint32_t)(event->time)); @@ -239,14 +296,12 @@ static void raw_event_callback (XIRawEvent *event) { static void X_callback (Channel channel, IVY_HANDLE fd, void *data) { static XEvent event; static XGenericEventCookie *cookie = (XGenericEventCookie*)&event.xcookie; - static char message[2000]; - int length; while (XPending((Display *)data)) { /*while (XEventsQueued ((Display *)data, QueuedAlready) > 0) {*/ XNextEvent((Display *)data, &event); if (XGetEventData((Display *)data, cookie)) { - if (cookie->type == GenericEvent && + if (cookie->type == GenericEvent && cookie->extension == xi_opcode) { switch (cookie->evtype) @@ -256,39 +311,19 @@ static void X_callback (Channel channel, IVY_HANDLE fd, void *data) { break; case XI_RawKeyPress: case XI_RawKeyRelease: + printf("EVENT type %d (%s)\n", cookie->evtype, type_to_name(cookie->evtype)); break; case XI_RawButtonPress: case XI_RawButtonRelease: - { - int ndevices; - XIDeviceInfo* device = XIQueryDevice((Display *)data, ((XIRawEvent*)(cookie->data))->deviceid, &ndevices); - int i; - strcpy(message, "InputButtonEvent "); - strcat(message, identifier); - length = strlen(message); - length += sprintf(message + length, " num=%d state=%s", ((XIRawEvent*)(cookie->data))->detail, (cookie->evtype == XI_RawButtonPress) ? "pressed" : "released"); - for (i = 0; i < device->num_classes; i++) { - switch(device->classes[i]->type) { - case XIButtonClass: - break; - case XIKeyClass: - break; - case XIValuatorClass: - { - XIValuatorClassInfo *v = (XIValuatorClassInfo*)(device->classes[i]); - length += sprintf(message + length, " %s=%.2f", valuators_names[v->number], v->value); - break; - } - } - } - length += sprintf(message + length, " time=%u", (uint32_t)((XIRawEvent*)(cookie->data))->time); - IvySendMsg(message); - /* printf("%s\n", message);*/ - XIFreeDeviceInfo(device); - break; - } + raw_button_callback(((XAnyEvent*)&event)->display, cookie->data, cookie->evtype); + break; case XI_RawMotion: - raw_event_callback(cookie->data); + raw_motion_callback(((XAnyEvent*)&event)->display, cookie->data); + break; + case XI_RawTouchBegin: + case XI_RawTouchUpdate: + case XI_RawTouchEnd: + printf("Touch: %s\n", type_to_name(cookie->evtype)); break; /* case XI_Enter: case XI_Leave: @@ -335,9 +370,11 @@ static int xinput_version (Display *display) { version = XGetExtensionVersion(display, INAME); if (version && (version != (XExtensionVersion*) NoSuchExtension)) { result = version->major_version; + int major = version->major_version; + int minor = version->minor_version; + XIQueryVersion(display, &major, &minor); /* XIQueryVersion to request version 2.2 for multi touch */ XFree(version); } - return result; } @@ -460,13 +497,15 @@ int main (int argc, char * argv[]) { } if (device_name) { + register_hierarchy_changed(display); device_info = find_device_info(display, device_name); - if (!device_info) { + if (device_info) { + register_events(display, device_info); + } else { printf("\n*** Unable to find device <<%s>> at starting time. Valid devices are:\n", device_name); list_devices(display); printf("\n*** Waiting for device <<%s>>.\n", device_name); } - register_events(display, device_info); loop(display); } -- cgit v1.1