summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorribet2017-07-18 16:09:58 +0000
committerribet2017-07-18 16:09:58 +0000
commit1fbb3a2953d1555483fef73891b820b1f4ba8e0e (patch)
treed7152e6f71b6aec806edcb2a56889444d9df2e23
parent09b0a7ad78e3bfbd7fb852a58910db54f3a9a6b4 (diff)
downloadxinput2-ivy-1fbb3a2953d1555483fef73891b820b1f4ba8e0e.zip
xinput2-ivy-1fbb3a2953d1555483fef73891b820b1f4ba8e0e.tar.gz
xinput2-ivy-1fbb3a2953d1555483fef73891b820b1f4ba8e0e.tar.bz2
xinput2-ivy-1fbb3a2953d1555483fef73891b820b1f4ba8e0e.tar.xz
Fixed hierarchy change and raw data for multi-screen
-rw-r--r--debian/changelog8
-rw-r--r--xinput2_ivy.c187
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 <ribet@cena.fr> 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);
}