From 03d057ff01332333b98f5298c3d0bd85b5604ac9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Morten=20Johan=20S=C3=B8rvig?= Date: Thu, 24 Jan 2013 11:24:00 +0100 Subject: Cocoa: Make touch events work again. Bring back the ref-counted enable on enter/leave workaround we had in Qt 4: If any widget in a window sets WA_AcceptTouchEvents then that window will start processing touch events. Enabling touch events has implications for delivery of other events, for example by causing scrolling event lag. Change-Id: I307488937f417612eff624bf9892b82a7f69c1b7 Reviewed-by: Gabriel de Dietrich --- src/plugins/platforms/cocoa/qcocoanativeinterface.h | 9 +++++++++ src/plugins/platforms/cocoa/qcocoanativeinterface.mm | 9 +++++++++ src/plugins/platforms/cocoa/qcocoawindow.h | 3 +++ src/plugins/platforms/cocoa/qcocoawindow.mm | 10 ++++++++++ 4 files changed, 31 insertions(+) (limited to 'src/plugins') diff --git a/src/plugins/platforms/cocoa/qcocoanativeinterface.h b/src/plugins/platforms/cocoa/qcocoanativeinterface.h index b1b8dccca5..ca84312059 100644 --- a/src/plugins/platforms/cocoa/qcocoanativeinterface.h +++ b/src/plugins/platforms/cocoa/qcocoanativeinterface.h @@ -112,6 +112,15 @@ private: // Embedding NSViews as child QWindows static void setWindowContentView(QPlatformWindow *window, void *nsViewContentView); + + // Register if a window should deliver touch events. Enabling + // touch events has implications for delivery of other events, + // for example by causing scrolling event lag. + // + // The registration is ref-counted: multiple widgets can enable + // touch events, which then will be delivered until the widget + // deregisters. + static void registerTouchWindow(QWindow *window, bool enable); }; #endif // QCOCOANATIVEINTERFACE_H diff --git a/src/plugins/platforms/cocoa/qcocoanativeinterface.mm b/src/plugins/platforms/cocoa/qcocoanativeinterface.mm index a7f4d3b823..ededb63487 100644 --- a/src/plugins/platforms/cocoa/qcocoanativeinterface.mm +++ b/src/plugins/platforms/cocoa/qcocoanativeinterface.mm @@ -119,6 +119,8 @@ QPlatformNativeInterface::NativeResourceForIntegrationFunction QCocoaNativeInter return NativeResourceForIntegrationFunction(QCocoaNativeInterface::cgImageToQImage); if (resource.toLower() == "setwindowcontentview") return NativeResourceForIntegrationFunction(QCocoaNativeInterface::setWindowContentView); + if (resource.toLower() == "registertouchwindow") + return NativeResourceForIntegrationFunction(QCocoaNativeInterface::registerTouchWindow); return 0; } @@ -227,4 +229,11 @@ void QCocoaNativeInterface::setWindowContentView(QPlatformWindow *window, void * cocoaPlatformWindow->setContentView(reinterpret_cast(contentView)); } +void QCocoaNativeInterface::registerTouchWindow(QWindow *window, bool enable) +{ + QCocoaWindow *cocoaWindow = static_cast(window->handle()); + if (cocoaWindow) + cocoaWindow->registerTouch(enable); +} + QT_END_NAMESPACE diff --git a/src/plugins/platforms/cocoa/qcocoawindow.h b/src/plugins/platforms/cocoa/qcocoawindow.h index 5029321247..e1de5f0add 100644 --- a/src/plugins/platforms/cocoa/qcocoawindow.h +++ b/src/plugins/platforms/cocoa/qcocoawindow.h @@ -147,6 +147,8 @@ public: void setMenubar(QCocoaMenuBar *mb); QCocoaMenuBar *menubar() const; + void registerTouch(bool enable); + qreal devicePixelRatio() const; void exposeWindow(); void obscureWindow(); @@ -187,6 +189,7 @@ public: // for QNSView bool m_hasModalSession; bool m_frameStrutEventsEnabled; bool m_isExposed; + int m_registerTouchCount; }; QT_END_NAMESPACE diff --git a/src/plugins/platforms/cocoa/qcocoawindow.mm b/src/plugins/platforms/cocoa/qcocoawindow.mm index 9988cea597..e74f9dcfe0 100644 --- a/src/plugins/platforms/cocoa/qcocoawindow.mm +++ b/src/plugins/platforms/cocoa/qcocoawindow.mm @@ -201,6 +201,7 @@ QCocoaWindow::QCocoaWindow(QWindow *tlw) , m_hasModalSession(false) , m_frameStrutEventsEnabled(false) , m_isExposed(false) + , m_registerTouchCount(0) { #ifdef QT_COCOA_ENABLE_WINDOW_DEBUG qDebug() << "QCocoaWindow::QCocoaWindow" << this; @@ -899,6 +900,15 @@ QCocoaMenuBar *QCocoaWindow::menubar() const return m_menubar; } +void QCocoaWindow::registerTouch(bool enable) +{ + m_registerTouchCount += enable ? 1 : -1; + if (m_registerTouchCount == 1) + [m_contentView setAcceptsTouchEvents:YES]; + else if (m_registerTouchCount == 0) + [m_contentView setAcceptsTouchEvents:NO]; +} + qreal QCocoaWindow::devicePixelRatio() const { #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_7 -- cgit v1.2.3