summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTor Arne Vestbø <tor.arne.vestbo@qt.io>2020-09-03 16:29:23 +0200
committerTor Arne Vestbø <tor.arne.vestbo@qt.io>2020-09-14 20:41:55 +0000
commit0d7248345dfde075122b135370e77f76334bba38 (patch)
tree27b198d71d49c935a30e4ddb082c46d486ec214a
parent7a7996beb54fe077ac8767a4b46481031a07609f (diff)
macOS: Don't assume we will get didBecomeKey for non-Qt NSWindows
The optimization resulted in losing out on window focus changes when for example a native file dialog was shown, resulting in the cursor blinking both in the parent window, and in the native file dialog. Change-Id: I9c1f9df20fbc5c4b80f906ded70d9a2658b70438 Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io> Reviewed-by: Timur Pocheptsov <timur.pocheptsov@qt.io> (cherry picked from commit 5fbb17c39785ed2c80219c9c0ea97879e371d490) Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
-rw-r--r--src/plugins/platforms/cocoa/qcocoawindow.mm20
1 files changed, 11 insertions, 9 deletions
diff --git a/src/plugins/platforms/cocoa/qcocoawindow.mm b/src/plugins/platforms/cocoa/qcocoawindow.mm
index a3120f4ccc..23c5a2fdda 100644
--- a/src/plugins/platforms/cocoa/qcocoawindow.mm
+++ b/src/plugins/platforms/cocoa/qcocoawindow.mm
@@ -1197,15 +1197,17 @@ void QCocoaWindow::windowDidResignKey()
if (isForeignWindow())
return;
- // Key window will be non-nil if another window became key, so do not
- // set the active window to zero here -- the new key window's
- // NSWindowDidBecomeKeyNotification hander will change the active window.
- NSWindow *keyWindow = [NSApp keyWindow];
- if (!keyWindow || keyWindow == m_view.window) {
- // No new key window, go ahead and set the active window to zero
- if (!windowIsPopupType())
- QWindowSystemInterface::handleWindowActivated<QWindowSystemInterface::SynchronousDelivery>(0);
- }
+ // The current key window will be non-nil if another window became key. If that
+ // window is a Qt window, we delay the window activation event until the didBecomeKey
+ // notification is delivered to the active window, to ensure an atomic update.
+ NSWindow *newKeyWindow = [NSApp keyWindow];
+ if (newKeyWindow && newKeyWindow != m_view.window
+ && [newKeyWindow conformsToProtocol:@protocol(QNSWindowProtocol)])
+ return;
+
+ // Lost key window, go ahead and set the active window to zero
+ if (!windowIsPopupType())
+ QWindowSystemInterface::handleWindowActivated<QWindowSystemInterface::SynchronousDelivery>(nullptr);
}
void QCocoaWindow::windowDidOrderOnScreen()