diff options
Diffstat (limited to 'src/plugins/platforms/cocoa')
-rw-r--r-- | src/plugins/platforms/cocoa/qcocoawindow.mm | 14 | ||||
-rw-r--r-- | src/plugins/platforms/cocoa/qnsview.mm | 21 |
2 files changed, 31 insertions, 4 deletions
diff --git a/src/plugins/platforms/cocoa/qcocoawindow.mm b/src/plugins/platforms/cocoa/qcocoawindow.mm index 667db88a91..af490d49b5 100644 --- a/src/plugins/platforms/cocoa/qcocoawindow.mm +++ b/src/plugins/platforms/cocoa/qcocoawindow.mm @@ -1212,9 +1212,17 @@ void QCocoaWindow::windowDidBecomeKey() QWindowSystemInterface::handleEnterEvent(m_enterLeaveTargetWindow, windowPoint, screenPoint); } - if (!windowIsPopupType()) - QWindowSystemInterface::handleWindowActivated<QWindowSystemInterface::SynchronousDelivery>( - window(), Qt::ActiveWindowFocusReason); + QNSView *firstResponderView = qt_objc_cast<QNSView *>(m_view.window.firstResponder); + if (!firstResponderView) + return; + + const QCocoaWindow *focusCocoaWindow = firstResponderView.platformWindow; + if (focusCocoaWindow->windowIsPopupType()) + return; + + // See also [QNSView becomeFirstResponder] + QWindowSystemInterface::handleWindowActivated<QWindowSystemInterface::SynchronousDelivery>( + focusCocoaWindow->window(), Qt::ActiveWindowFocusReason); } void QCocoaWindow::windowDidResignKey() diff --git a/src/plugins/platforms/cocoa/qnsview.mm b/src/plugins/platforms/cocoa/qnsview.mm index bd7e10e2c7..471fa368c3 100644 --- a/src/plugins/platforms/cocoa/qnsview.mm +++ b/src/plugins/platforms/cocoa/qnsview.mm @@ -310,8 +310,27 @@ QT_NAMESPACE_ALIAS_OBJC_CLASS(QNSViewMouseMoveHelper); return NO; if ([self isTransparentForUserInput]) return NO; - if (!m_platformWindow->windowIsPopupType()) + + if (!m_platformWindow->windowIsPopupType() + && (!self.window.canBecomeKeyWindow || self.window.keyWindow)) { + // Calling handleWindowActivated for a QWindow has two effects: first, it + // will set the QWindow (and all other QWindows in the same hierarchy) + // as Active. Being Active means that the window should appear active from + // a style perspective (according to QWindow::isActive()). The second + // effect is that it will set QQuiApplication::focusWindow() to point to + // the QWindow. The latter means that the QWindow should have keyboard + // focus. But those two are not necessarily the same; A tool window could e.g be + // rendered as Active while the parent window, which is also Active, has + // input focus. But we currently don't distiguish between that cleanly in Qt. + // Since we don't want a QWindow to be rendered as Active when the NSWindow + // it belongs to is not key, we skip calling handleWindowActivated when + // that is the case. Instead, we wait for the window to become key, and handle + // QWindow activation from QCocoaWindow::windowDidBecomeKey instead. The only + // exception is if the window can never become key, in which case we naturally + // cannot wait for that to happen. QWindowSystemInterface::handleWindowActivated([self topLevelWindow], Qt::ActiveWindowFocusReason); + } + return YES; } |