From 746383476aa449e9cab4a25df27be85b61aa074b Mon Sep 17 00:00:00 2001 From: Sven Gothel Date: Wed, 27 Mar 2019 03:10:41 +0100 Subject: Bug 1348: X11 XI Multitouch: Fixes of previous commit 92006e4baef57f1f3fb647dd307aed5989fd4c8d Previous commit 92006e4baef57f1f3fb647dd307aed5989fd4c8d (Note to Danny: I cannot test this now - please re-test and/or review) X11Common::JavaWindow - Owns XI extension's xiOpcode, selected xiTouchDeviceId and tracked XITouchPosition array X11Window::CreateWindow - Query XI extension only once @ window creation and earmark xiOpcode in JavaWindow instance - Fix: Device selection code was "class->type != XITouchClass", but shouldn't it be 'XITouchClass == class->type' (as patched here) - Fix: Free XIQueryDevice returned XIDeviceInfo array via XIFreeDeviceInfo - Earmark deviceid in JavaWindow instance X11Display - Moved global static touch_coordinates to JavaWindow::xiTouchCoords instance X11Display::DispatchMessage - Changed event handling structure similar to https://keithp.com/blogs/Cursor_tracking/ - Fix: Free XGetEventData's optional memory allocation via XFreeEventData - Reuse JavaWindow's queried xiOpcode - Fix: Don't overrise windowPointer, instead validate and require a match. JavaWindow must match! - Fix: Also validate chosen deviceid with JavaWindow's registered device Newt Build: - Added libXi in build recipe and doc --- src/newt/native/X11Window.c | 86 ++++++++++++++++++++++++++------------------- 1 file changed, 49 insertions(+), 37 deletions(-) (limited to 'src/newt/native/X11Window.c') diff --git a/src/newt/native/X11Window.c b/src/newt/native/X11Window.c index 7208b205a..8fb3ecbb9 100644 --- a/src/newt/native/X11Window.c +++ b/src/newt/native/X11Window.c @@ -953,47 +953,59 @@ JNIEXPORT jlongArray JNICALL Java_jogamp_newt_driver_x11_WindowDriver_CreateWind } } + // Register X11 Multitouch Events for new Window + // https://www.x.org/wiki/Development/Documentation/Multitouch/ { - XIDeviceInfo *di; - XIDeviceInfo *dev; - XITouchClassInfo *class; - int devid = -1; + int xi_opcode, event, error; + + javaWindow->xiTouchDeviceId = -1; + + if( XQueryExtension(dpy, "XInputExtension", &xi_opcode, &event, &error) ) { + XIDeviceInfo *di; + int devid = -1; + int cnt = 0; + + javaWindow->xiOpcode = xi_opcode; + di = XIQueryDevice(dpy, XIAllDevices, &cnt); + + if( NULL != di && 0 < cnt ) { + XIDeviceInfo *dev; + int i, j; - int cnt; - int i, j; - - di = XIQueryDevice(dpy, XIAllDevices, &cnt); - for (i = 0; i < cnt; i ++) - { - dev = &di[i]; - for (j = 0; j < dev->num_classes; j ++) - { - class = (XITouchClassInfo*)(dev->classes[j]); - if (class->type != XITouchClass) - { - devid = dev->deviceid; - break; - } - } - if(devid != -1) - { - break; - } - } + // find the 1st XITouchClass device available + for (i = 0; i < cnt && -1 == devid; i ++) { + dev = &di[i]; + for (j = 0; j < dev->num_classes; j ++) { + XITouchClassInfo *class = (XITouchClassInfo*)(dev->classes[j]); + if ( XITouchClass == class->type ) { + devid = dev->deviceid; + break; + } + } + } + XIFreeDeviceInfo(di); + di = NULL; + + if( -1 != devid ) { + // register 1st XITouchClass device if available + XIEventMask mask = { + .deviceid = devid, + .mask_len = XIMaskLen(XI_TouchEnd) // in bytes + }; + + mask.mask = (unsigned char*)calloc(mask.mask_len, sizeof(unsigned char)); + XISetMask(mask.mask, XI_TouchBegin); + XISetMask(mask.mask, XI_TouchUpdate); + XISetMask(mask.mask, XI_TouchEnd); - XIEventMask mask = { - .deviceid = devid, //XIAllDevices, - .mask_len = XIMaskLen(XI_TouchEnd) - }; + XISelectEvents(dpy, window, &mask, 1); - mask.mask = (unsigned char*)calloc(3, sizeof(char)); - XISetMask(mask.mask, XI_TouchBegin); - XISetMask(mask.mask, XI_TouchUpdate); - XISetMask(mask.mask, XI_TouchEnd); - - XISelectEvents(dpy, window, &mask, 1); - - free(mask.mask); + free(mask.mask); + + javaWindow->xiTouchDeviceId = devid; + } + } + } } XFlush(dpy); -- cgit v1.2.3