diff --git a/src/quick/items/qquickmultipointtoucharea.cpp b/src/quick/items/qquickmultipointtoucharea.cpp index 384c1c7ac8d379cf7718eed017aef4f5c2dc40b5..a6c92ac060098f1f9058eb467ee3df19b97e3173 100644 --- a/src/quick/items/qquickmultipointtoucharea.cpp +++ b/src/quick/items/qquickmultipointtoucharea.cpp @@ -47,6 +47,7 @@ #include <QMouseEvent> #include <math.h> #include <QDebug> +#include <qpa/qplatformnativeinterface.h> QT_BEGIN_NAMESPACE @@ -322,6 +323,7 @@ void QQuickTouchPoint::setSceneY(qreal sceneY) QQuickMultiPointTouchArea::QQuickMultiPointTouchArea(QQuickItem *parent) : QQuickItem(parent), + _currentWindow(0), _minimumTouchPoints(0), _maximumTouchPoints(INT_MAX), _stealMouse(false) @@ -331,6 +333,9 @@ QQuickMultiPointTouchArea::QQuickMultiPointTouchArea(QQuickItem *parent) if (qmlVisualTouchDebugging()) { setFlag(QQuickItem::ItemHasContents); } +#ifdef Q_OS_MAC + connect(this, &QQuickItem::windowChanged, this, &QQuickMultiPointTouchArea::setTouchEventsEnabledForWindow); +#endif } QQuickMultiPointTouchArea::~QQuickMultiPointTouchArea() @@ -542,6 +547,27 @@ void QQuickMultiPointTouchArea::addTouchPoint(const QTouchEvent::TouchPoint *p) _pressedTouchPoints.append(dtp); } +void QQuickMultiPointTouchArea::setTouchEventsEnabledForWindow(QWindow *window) +{ +#ifdef Q_OS_MAC + // Resolve function for enabling touch events from the (cocoa) platform plugin. + typedef void (*RegisterTouchWindowFunction)(QWindow *, bool); + RegisterTouchWindowFunction registerTouchWindow = reinterpret_cast<RegisterTouchWindowFunction>( + QGuiApplication::platformNativeInterface()->nativeResourceFunctionForIntegration("registertouchwindow")); + if (!registerTouchWindow) + return; // Not necessarily an error, Qt migh be using a different platform plugin. + + // Disable touch on the old window, enable on the new window. + if (_currentWindow) + registerTouchWindow(_currentWindow, false); + if (window) + registerTouchWindow(window, true); + // Save the current window, setTouchEventsEnabledForWindow will be called + // with a null window on disable. + _currentWindow = window; +#endif +} + void QQuickMultiPointTouchArea::addTouchPrototype(QQuickTouchPoint *prototype) { int id = _touchPrototypes.count(); diff --git a/src/quick/items/qquickmultipointtoucharea_p.h b/src/quick/items/qquickmultipointtoucharea_p.h index e2ae5ed24e8a5dbff74abc00a7dab641c278a08b..afe7d4b77bc77fd4d97a3a3424b30dc228c30973 100644 --- a/src/quick/items/qquickmultipointtoucharea_p.h +++ b/src/quick/items/qquickmultipointtoucharea_p.h @@ -251,6 +251,9 @@ protected: void grabGesture(); virtual QSGNode *updatePaintNode(QSGNode *, UpdatePaintNodeData *); +protected slots: + void setTouchEventsEnabledForWindow(QWindow *window); + private: void ungrab(); QMap<int,QQuickTouchPoint*> _touchPrototypes; //TouchPoints defined in QML @@ -258,6 +261,7 @@ private: QList<QObject*> _releasedTouchPoints; QList<QObject*> _pressedTouchPoints; QList<QObject*> _movedTouchPoints; + QWindow *_currentWindow; int _minimumTouchPoints; int _maximumTouchPoints; bool _stealMouse;