summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms/cocoa
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/platforms/cocoa')
-rw-r--r--src/plugins/platforms/cocoa/qcocoawindow.mm14
-rw-r--r--src/plugins/platforms/cocoa/qnsview.mm21
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;
}