Commit ee677dc8 authored by Morten Johan Sørvig's avatar Morten Johan Sørvig Committed by The Qt Project
Browse files

Enable touch events on Mac for MultiPointTouchArea


Enabling touch events on a window causes scroll event
lag so we want to avoid avoid it as far as possible.

Enable/disable on scene changes, similar to what we
do for WA_AcceptTouchEvents for widgets.

Task-number: QTBUG-28483

Change-Id: I2e5b5e2b093cccfc5253f7228f5ec0c588c60371
Reviewed-by: default avatarShawn Rutledge <shawn.rutledge@digia.com>
Reviewed-by: default avatarGabriel de Dietrich <gabriel.dedietrich@digia.com>
parent 885f3251
dev 5.10 5.11 5.12 5.12.1 5.12.10 5.12.11 5.12.12 5.12.2 5.12.3 5.12.4 5.12.5 5.12.6 5.12.7 5.12.8 5.12.9 5.13 5.13.0 5.13.1 5.13.2 5.14 5.14.0 5.14.1 5.14.2 5.15 5.15.0 5.15.1 5.15.2 5.3 5.4 5.5 5.6 5.7 5.8 5.9 5.9.8 6.0 6.0.0 6.1 6.1.0 6.1.1 6.1.2 6.1.3 6.2 6.2.0 6.2.1 6.2.2 old/5.1 old/5.2 wip/cmake wip/dbus wip/gc wip/itemviews wip/nacl wip/new-backend wip/pointerhandler wip/propertycache-refactor wip/qquickdeliveryagent wip/scenegraphng wip/tizen wip/webassembly v5.15.0-alpha1 v5.14.1 v5.14.0 v5.14.0-rc2 v5.14.0-rc1 v5.14.0-beta3 v5.14.0-beta2 v5.14.0-beta1 v5.14.0-alpha1 v5.13.2 v5.13.1 v5.13.0 v5.13.0-rc3 v5.13.0-rc2 v5.13.0-rc1 v5.13.0-beta4 v5.13.0-beta3 v5.13.0-beta2 v5.13.0-beta1 v5.13.0-alpha1 v5.12.7 v5.12.6 v5.12.5 v5.12.4 v5.12.3 v5.12.2 v5.12.1 v5.12.0 v5.12.0-rc2 v5.12.0-rc1 v5.12.0-beta4 v5.12.0-beta3 v5.12.0-beta2 v5.12.0-beta1 v5.12.0-alpha1 v5.11.3 v5.11.2 v5.11.1 v5.11.0 v5.11.0-rc2 v5.11.0-rc1 v5.11.0-beta4 v5.11.0-beta3 v5.11.0-beta2 v5.11.0-beta1 v5.11.0-alpha1 v5.10.1 v5.10.0 v5.10.0-rc3 v5.10.0-rc2 v5.10.0-rc1 v5.10.0-beta4 v5.10.0-beta3 v5.10.0-beta2 v5.10.0-beta1 v5.10.0-alpha1 v5.9.9 v5.9.8 v5.9.7 v5.9.6 v5.9.5 v5.9.4 v5.9.3 v5.9.2 v5.9.1 v5.9.0 v5.9.0-rc2 v5.9.0-rc1 v5.9.0-beta4 v5.9.0-beta3 v5.9.0-beta2 v5.9.0-beta1 v5.9.0-alpha1 v5.8.0 v5.8.0-rc1 v5.8.0-beta1 v5.8.0-alpha1 v5.7.1 v5.7.0 v5.7.0-rc1 v5.7.0-beta1 v5.7.0-alpha1 v5.6.3 v5.6.2 v5.6.1 v5.6.1-1 v5.6.0 v5.6.0-rc1 v5.6.0-beta1 v5.6.0-alpha1 v5.5.1 v5.5.0 v5.5.0-rc1 v5.5.0-beta1 v5.5.0-alpha1 v5.4.2 v5.4.1 v5.4.0 v5.4.0-rc1 v5.4.0-beta1 v5.4.0-alpha1 v5.3.2 v5.3.1 v5.3.0 v5.3.0-rc1 v5.3.0-beta1 v5.3.0-alpha1 v5.2.1 v5.2.0 v5.2.0-rc1 v5.2.0-beta1 v5.2.0-alpha1 v5.1.1 v5.1.0 v5.1.0-rc2 v5.1.0-rc1 v5.1.0-beta1
No related merge requests found
Showing with 30 additions and 0 deletions
...@@ -47,6 +47,7 @@ ...@@ -47,6 +47,7 @@
#include <QMouseEvent> #include <QMouseEvent>
#include <math.h> #include <math.h>
#include <QDebug> #include <QDebug>
#include <qpa/qplatformnativeinterface.h>
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
...@@ -322,6 +323,7 @@ void QQuickTouchPoint::setSceneY(qreal sceneY) ...@@ -322,6 +323,7 @@ void QQuickTouchPoint::setSceneY(qreal sceneY)
QQuickMultiPointTouchArea::QQuickMultiPointTouchArea(QQuickItem *parent) QQuickMultiPointTouchArea::QQuickMultiPointTouchArea(QQuickItem *parent)
: QQuickItem(parent), : QQuickItem(parent),
_currentWindow(0),
_minimumTouchPoints(0), _minimumTouchPoints(0),
_maximumTouchPoints(INT_MAX), _maximumTouchPoints(INT_MAX),
_stealMouse(false) _stealMouse(false)
...@@ -331,6 +333,9 @@ QQuickMultiPointTouchArea::QQuickMultiPointTouchArea(QQuickItem *parent) ...@@ -331,6 +333,9 @@ QQuickMultiPointTouchArea::QQuickMultiPointTouchArea(QQuickItem *parent)
if (qmlVisualTouchDebugging()) { if (qmlVisualTouchDebugging()) {
setFlag(QQuickItem::ItemHasContents); setFlag(QQuickItem::ItemHasContents);
} }
#ifdef Q_OS_MAC
connect(this, &QQuickItem::windowChanged, this, &QQuickMultiPointTouchArea::setTouchEventsEnabledForWindow);
#endif
} }
QQuickMultiPointTouchArea::~QQuickMultiPointTouchArea() QQuickMultiPointTouchArea::~QQuickMultiPointTouchArea()
...@@ -542,6 +547,27 @@ void QQuickMultiPointTouchArea::addTouchPoint(const QTouchEvent::TouchPoint *p) ...@@ -542,6 +547,27 @@ void QQuickMultiPointTouchArea::addTouchPoint(const QTouchEvent::TouchPoint *p)
_pressedTouchPoints.append(dtp); _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) void QQuickMultiPointTouchArea::addTouchPrototype(QQuickTouchPoint *prototype)
{ {
int id = _touchPrototypes.count(); int id = _touchPrototypes.count();
......
...@@ -251,6 +251,9 @@ protected: ...@@ -251,6 +251,9 @@ protected:
void grabGesture(); void grabGesture();
virtual QSGNode *updatePaintNode(QSGNode *, UpdatePaintNodeData *); virtual QSGNode *updatePaintNode(QSGNode *, UpdatePaintNodeData *);
protected slots:
void setTouchEventsEnabledForWindow(QWindow *window);
private: private:
void ungrab(); void ungrab();
QMap<int,QQuickTouchPoint*> _touchPrototypes; //TouchPoints defined in QML QMap<int,QQuickTouchPoint*> _touchPrototypes; //TouchPoints defined in QML
...@@ -258,6 +261,7 @@ private: ...@@ -258,6 +261,7 @@ private:
QList<QObject*> _releasedTouchPoints; QList<QObject*> _releasedTouchPoints;
QList<QObject*> _pressedTouchPoints; QList<QObject*> _pressedTouchPoints;
QList<QObject*> _movedTouchPoints; QList<QObject*> _movedTouchPoints;
QWindow *_currentWindow;
int _minimumTouchPoints; int _minimumTouchPoints;
int _maximumTouchPoints; int _maximumTouchPoints;
bool _stealMouse; bool _stealMouse;
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment