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 <gabriel.dedietrich@digia.com>
This commit is contained in:
parent
b2c73c73cd
commit
03d057ff01
@ -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
|
||||
|
@ -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<NSView *>(contentView));
|
||||
}
|
||||
|
||||
void QCocoaNativeInterface::registerTouchWindow(QWindow *window, bool enable)
|
||||
{
|
||||
QCocoaWindow *cocoaWindow = static_cast<QCocoaWindow *>(window->handle());
|
||||
if (cocoaWindow)
|
||||
cocoaWindow->registerTouch(enable);
|
||||
}
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -3367,6 +3367,34 @@ bool QApplication::notify(QObject *receiver, QEvent *e)
|
||||
break;
|
||||
}
|
||||
#endif // QT_NO_GESTURES
|
||||
#ifdef Q_OS_MAC
|
||||
// Enable touch events on enter, disable on leave.
|
||||
typedef void (*RegisterTouchWindowFn)(QWindow *, bool);
|
||||
case QEvent::Enter:
|
||||
if (receiver->isWidgetType()) {
|
||||
QWidget *w = static_cast<QWidget *>(receiver);
|
||||
if (w->testAttribute(Qt::WA_AcceptTouchEvents)) {
|
||||
RegisterTouchWindowFn registerTouchWindow = reinterpret_cast<RegisterTouchWindowFn>
|
||||
(platformNativeInterface()->nativeResourceFunctionForIntegration("registertouchwindow"));
|
||||
if (registerTouchWindow)
|
||||
registerTouchWindow(w->window()->windowHandle(), true);
|
||||
}
|
||||
}
|
||||
res = d->notify_helper(receiver, e);
|
||||
break;
|
||||
case QEvent::Leave:
|
||||
if (receiver->isWidgetType()) {
|
||||
QWidget *w = static_cast<QWidget *>(receiver);
|
||||
if (w->testAttribute(Qt::WA_AcceptTouchEvents)) {
|
||||
RegisterTouchWindowFn registerTouchWindow = reinterpret_cast<RegisterTouchWindowFn>
|
||||
(platformNativeInterface()->nativeResourceFunctionForIntegration("registertouchwindow"));
|
||||
if (registerTouchWindow)
|
||||
registerTouchWindow(w->window()->windowHandle(), false);
|
||||
}
|
||||
}
|
||||
res = d->notify_helper(receiver, e);
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
res = d->notify_helper(receiver, e);
|
||||
break;
|
||||
|
Loading…
Reference in New Issue
Block a user