]> git.lizzy.rs Git - irrlicht.git/commitdiff
Merging r6173 through r6179 from trunk to ogl-es branch
authorcutealien <cutealien@dfc29bdd-3216-0410-991c-e03cc46cb475>
Wed, 30 Dec 2020 18:39:20 +0000 (18:39 +0000)
committercutealien <cutealien@dfc29bdd-3216-0410-991c-e03cc46cb475>
Wed, 30 Dec 2020 18:39:20 +0000 (18:39 +0000)
- Adding optional support for touch input in X11

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/branches/ogl-es@6180 dfc29bdd-3216-0410-991c-e03cc46cb475

changes.txt
include/IEventReceiver.h
include/IrrCompileConfig.h
source/Irrlicht/CIrrDeviceLinux.cpp
source/Irrlicht/CIrrDeviceLinux.h

index 5c87410154437660b4b4498213b2482123d8d966..4413771ea2158c9c086cff4a36bc90aca97fa4a5 100644 (file)
@@ -9,6 +9,7 @@ Changes in ogl-es (not yet released - will be merged with trunk at some point)
 \r
 --------------------------\r
 Changes in 1.9 (not yet released)\r
+- Add optional multitouch support to X11 (but disabled in IrrCompileConfig by default). Thanks @TheBrokenRail for a patch proposal based on example code from esjeon (patch #322).\r
 - Slightly changed close window handling on X11 (optimized and avoids problems on some shells). Thanks @TheBrokenRail for a patch (was part of patch #322).\r
 - Add getActiveColor functions to IGUIStaticText and IGUIButton (get currently used color).\r
 - Add IGUIEnvironment::addToDeletionQueue to allow save removal of gui elements while iterating over them (like the same named function in ISceneManager).\r
index 44c86e6c56efb09465fb5d8af5b565910291a44a..11a50daf3608a6a6a094baecf61162129c749e01 100644 (file)
@@ -37,14 +37,14 @@ namespace irr
         //! A touch input event.\r
                EET_TOUCH_INPUT_EVENT,\r
 \r
-        //! A accelerometer event.\r
-        EET_ACCELEROMETER_EVENT,\r
+               //! A accelerometer event.\r
+               EET_ACCELEROMETER_EVENT,\r
 \r
-        //! A gyroscope event.\r
-        EET_GYROSCOPE_EVENT,\r
+               //! A gyroscope event.\r
+               EET_GYROSCOPE_EVENT,\r
 \r
-        //! A device motion event.\r
-        EET_DEVICE_MOTION_EVENT,\r
+               //! A device motion event.\r
+               EET_DEVICE_MOTION_EVENT,\r
 \r
                //! A joystick (joypad, gamepad) input event.\r
                /** Joystick events are created by polling all connected joysticks once per\r
@@ -353,6 +353,22 @@ struct SEvent
 \r
        };\r
 \r
+    //! Any kind of touch event.\r
+       struct STouchInput\r
+       {\r
+        // Touch ID.\r
+        size_t ID;\r
+\r
+        // X position of simple touch.\r
+               s32 X;\r
+\r
+        // Y position of simple touch.\r
+               s32 Y;\r
+\r
+               //! Type of touch event.\r
+               ETOUCH_INPUT_EVENT Event;\r
+       };\r
+\r
        //! Any kind of mouse event.\r
        struct SMouseInput\r
        {\r
@@ -416,58 +432,55 @@ struct SEvent
     //! Any kind of touch event.\r
        struct STouchInput\r
        {\r
-        // Touch ID.\r
-        size_t ID;\r
+               // Touch ID.\r
+               size_t ID;\r
 \r
-        // X position of simple touch.\r
+               // X position of simple touch.\r
                s32 X;\r
 \r
-        // Y position of simple touch.\r
+               // Y position of simple touch.\r
                s32 Y;\r
 \r
                //! Type of touch event.\r
                ETOUCH_INPUT_EVENT Event;\r
        };\r
 \r
-    //! Any kind of accelerometer event.\r
+       //! Any kind of accelerometer event.\r
        struct SAccelerometerEvent\r
        {\r
-\r
-        // X acceleration.\r
+               // X acceleration.\r
                f64 X;\r
 \r
-        // Y acceleration.\r
+               // Y acceleration.\r
                f64 Y;\r
 \r
-        // Z acceleration.\r
+               // Z acceleration.\r
                f64 Z;\r
        };\r
 \r
     //! Any kind of gyroscope event.\r
        struct SGyroscopeEvent\r
        {\r
-\r
-        // X rotation.\r
+               // X rotation.\r
                f64 X;\r
 \r
-        // Y rotation.\r
+               // Y rotation.\r
                f64 Y;\r
 \r
-        // Z rotation.\r
+               // Z rotation.\r
                f64 Z;\r
        };\r
 \r
-    //! Any kind of device motion event.\r
+       //! Any kind of device motion event.\r
        struct SDeviceMotionEvent\r
        {\r
-\r
-        // X angle - roll.\r
+               // X angle - roll.\r
                f64 X;\r
 \r
-        // Y angle - pitch.\r
+               // Y angle - pitch.\r
                f64 Y;\r
 \r
-        // Z angle - yaw.\r
+               // Z angle - yaw.\r
                f64 Z;\r
        };\r
 \r
@@ -581,10 +594,10 @@ struct SEvent
                struct SGUIEvent GUIEvent;\r
                struct SMouseInput MouseInput;\r
                struct SKeyInput KeyInput;\r
-        struct STouchInput TouchInput;\r
-        struct SAccelerometerEvent AccelerometerEvent;\r
-        struct SGyroscopeEvent GyroscopeEvent;\r
-        struct SDeviceMotionEvent DeviceMotionEvent;\r
+               struct STouchInput TouchInput;\r
+               struct SAccelerometerEvent AccelerometerEvent;\r
+               struct SGyroscopeEvent GyroscopeEvent;\r
+               struct SDeviceMotionEvent DeviceMotionEvent;\r
                struct SJoystickEvent JoystickEvent;\r
                struct SLogEvent LogEvent;\r
                struct SUserEvent UserEvent;\r
index 341b09ad8db2c23ec5f8d7b5cd94372d601768fd..ce7e4bbd5ed8c42e45efa24a004e9ca019afdd73 100644 (file)
@@ -317,18 +317,22 @@ define out. */
 #undef _IRR_COMPILE_WITH_X11_\r
 #endif\r
 \r
-//! On some Linux systems the XF86 vidmode extension or X11 RandR are missing. Use these flags\r
-//! to remove the dependencies such that Irrlicht will compile on those systems, too.\r
-//! If you don't need colored cursors you can also disable the Xcursor extension\r
+//! On some Linux systems the XF86 vidmode extension, X11 RandR, or XInput2 are missing.\r
+//! Use these defines to add/remove support for those dependencies as needed.\r
+//! XInput2 (library called Xi) is currently only used to support touch-input.\r
 #if defined(_IRR_LINUX_PLATFORM_) && defined(_IRR_COMPILE_WITH_X11_)\r
 #define _IRR_LINUX_X11_VIDMODE_\r
 //#define _IRR_LINUX_X11_RANDR_\r
+//#define _IRR_LINUX_X11_XINPUT2_\r
 #ifdef NO_IRR_LINUX_X11_VIDMODE_\r
 #undef _IRR_LINUX_X11_VIDMODE_\r
 #endif\r
 #ifdef NO_IRR_LINUX_X11_RANDR_\r
 #undef _IRR_LINUX_X11_RANDR_\r
 #endif\r
+#ifdef NO_IRR_LINUX_X11_XINPUT2_\r
+#undef _IRR_LINUX_X11_XINPUT2_\r
+#endif\r
 \r
 //! X11 has by default only monochrome cursors, but using the Xcursor library we can also get color cursor support.\r
 //! If you have the need for custom color cursors on X11 then enable this and make sure you also link\r
index af54946adda5f9e0dc785126bed955e33d4ac68d..68e6e3363a15a911588aa2af22324dee365f8f97 100644 (file)
 #include <X11/XKBlib.h>\r
 #include <X11/Xatom.h>\r
 \r
+#if defined(_IRR_LINUX_X11_XINPUT2_)\r
+#include <X11/extensions/XInput2.h>\r
+#endif\r
+\r
 #if defined(_IRR_COMPILE_WITH_OGLES1_) || defined(_IRR_COMPILE_WITH_OGLES2_)\r
 #include "CEGLManager.h"\r
 #endif\r
@@ -91,6 +95,10 @@ namespace
        Atom X_ATOM_NETWM_STATE;\r
 \r
        Atom X_ATOM_WM_DELETE_WINDOW;\r
+\r
+#if defined(_IRR_LINUX_X11_XINPUT2_)\r
+       int XI_EXTENSIONS_OPCODE;\r
+#endif\r
 };\r
 \r
 namespace irr\r
@@ -568,6 +576,8 @@ bool CIrrDeviceLinux::createWindow()
        if (WMCheck != None)\r
                HasNetWM = true;\r
 \r
+       initXInput2();\r
+\r
 #endif // #ifdef _IRR_COMPILE_WITH_X11_\r
        return true;\r
 }\r
@@ -1103,6 +1113,28 @@ bool CIrrDeviceLinux::run()
                                        XFlush (XDisplay);\r
                                }\r
                                break;\r
+#if defined(_IRR_LINUX_X11_XINPUT2_)\r
+                               case GenericEvent:\r
+                               {\r
+                                       XGenericEventCookie *cookie = &event.xcookie;\r
+                                       if (XGetEventData(XDisplay, cookie) && cookie->extension == XI_EXTENSIONS_OPCODE && XI_EXTENSIONS_OPCODE\r
+                                       && (cookie->evtype == XI_TouchUpdate || cookie->evtype == XI_TouchBegin || cookie->evtype == XI_TouchEnd))\r
+                                       {\r
+                                               XIDeviceEvent *de = (XIDeviceEvent *) cookie->data;\r
+\r
+                                               irrevent.EventType = EET_TOUCH_INPUT_EVENT;\r
+\r
+                                               irrevent.TouchInput.Event = cookie->evtype == XI_TouchUpdate ? ETIE_MOVED : (cookie->evtype == XI_TouchBegin ? ETIE_PRESSED_DOWN : ETIE_LEFT_UP);\r
+\r
+                                               irrevent.TouchInput.ID = de->detail;\r
+                                               irrevent.TouchInput.X = de->event_x;\r
+                                               irrevent.TouchInput.Y = de->event_y;\r
+\r
+                                               postEventFromUser(irrevent);\r
+                                       }\r
+                               }\r
+                               break;\r
+#endif\r
 \r
                        default:\r
                                break;\r
@@ -1988,6 +2020,62 @@ void CIrrDeviceLinux::initXAtoms()
 #endif\r
 }\r
 \r
+void CIrrDeviceLinux::initXInput2()\r
+{\r
+#if defined(_IRR_LINUX_X11_XINPUT2_)\r
+       int ev=0;\r
+       int err=0;\r
+       if (!XQueryExtension(XDisplay, "XInputExtension", &XI_EXTENSIONS_OPCODE, &ev, &err))\r
+       {\r
+               os::Printer::log("X Input extension not available.", ELL_WARNING);\r
+               return;\r
+       }\r
+\r
+       int major = 2;\r
+       int minor = 3;\r
+       int rc = XIQueryVersion(XDisplay, &major, &minor);\r
+       if ( rc != Success )\r
+       {\r
+               os::Printer::log("No XI2 support.", ELL_WARNING);\r
+               return;\r
+       }\r
+\r
+       int cnt = 0;\r
+       XIDeviceInfo *di = XIQueryDevice(XDisplay, XIAllDevices, &cnt);\r
+       if ( di )\r
+       {\r
+               for (int i = 0; i < cnt; ++i)\r
+               {\r
+                       bool hasTouchClass = false;\r
+                       XIDeviceInfo *dev = &di[i];\r
+                       for (int j = 0; j < dev->num_classes; ++j)\r
+                       {\r
+                               if (dev->classes[j]->type == XITouchClass)\r
+                               {\r
+                                       hasTouchClass = true;\r
+                                       break;\r
+                               }\r
+                       }\r
+                       if ( hasTouchClass )\r
+                       {\r
+                               XIEventMask eventMask;\r
+                               unsigned char mask[XIMaskLen(XI_TouchEnd)];\r
+                               memset(mask, 0, sizeof(mask));\r
+                               eventMask.deviceid = dev->deviceid;\r
+                               eventMask.mask_len = sizeof(mask);\r
+                               eventMask.mask = mask;\r
+                               XISetMask(eventMask.mask, XI_TouchBegin);\r
+                               XISetMask(eventMask.mask, XI_TouchUpdate);\r
+                               XISetMask(eventMask.mask, XI_TouchEnd);\r
+\r
+                               XISelectEvents(XDisplay, XWindow, &eventMask, 1);\r
+                       }\r
+               }\r
+               XIFreeDeviceInfo(di);\r
+       }\r
+#endif\r
+}\r
+\r
 \r
 #ifdef _IRR_COMPILE_WITH_X11_\r
 \r
index 344149e1a9357f63c3f0046036d691b1d296b714..67c65859df2026a788f5342b8c989b2d751bc7eb 100644 (file)
@@ -146,6 +146,8 @@ namespace irr
 \r
                void initXAtoms();\r
 \r
+               void initXInput2();\r
+\r
                bool switchToFullscreen(bool reset=false);\r
 \r
 #ifdef _IRR_COMPILE_WITH_X11_\r