\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
//! 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
\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
//! 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
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
#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
#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
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
if (WMCheck != None)\r
HasNetWM = true;\r
\r
+ initXInput2();\r
+\r
#endif // #ifdef _IRR_COMPILE_WITH_X11_\r
return true;\r
}\r
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
#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
\r
void initXAtoms();\r
\r
+ void initXInput2();\r
+\r
bool switchToFullscreen(bool reset=false);\r
\r
#ifdef _IRR_COMPILE_WITH_X11_\r