diff options
author | Sven Gothel <[email protected]> | 2019-03-27 03:10:41 +0100 |
---|---|---|
committer | Sven Gothel <[email protected]> | 2019-03-27 03:10:41 +0100 |
commit | 746383476aa449e9cab4a25df27be85b61aa074b (patch) | |
tree | 8f5d54b10abd6fbc23b8b82011b4a24bb16c7d21 /src/newt/native/X11Window.c | |
parent | 92006e4baef57f1f3fb647dd307aed5989fd4c8d (diff) |
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
Diffstat (limited to 'src/newt/native/X11Window.c')
-rw-r--r-- | src/newt/native/X11Window.c | 86 |
1 files changed, 49 insertions, 37 deletions
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); |