summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/plugins/platforms/cocoa/qcocoawindow.mm29
1 files changed, 29 insertions, 0 deletions
diff --git a/src/plugins/platforms/cocoa/qcocoawindow.mm b/src/plugins/platforms/cocoa/qcocoawindow.mm
index 4d0458a4aa..19d0f7a987 100644
--- a/src/plugins/platforms/cocoa/qcocoawindow.mm
+++ b/src/plugins/platforms/cocoa/qcocoawindow.mm
@@ -80,6 +80,32 @@ static bool isMouseEvent(NSEvent *ev)
}
}
+static void selectNextKeyWindow(NSWindow *currentKeyWindow)
+{
+ if (!currentKeyWindow)
+ return;
+
+ const QCocoaAutoReleasePool pool;
+
+ if ([[NSApplication sharedApplication] keyWindow] != currentKeyWindow)
+ return;//currentKeyWindow is not a key window actually.
+
+ NSArray *const windows = [[NSApplication sharedApplication] windows];
+ bool startLookup = false;
+ for (NSWindow *candidate in [windows reverseObjectEnumerator]) {
+ if (!startLookup) {
+ if (candidate == currentKeyWindow)
+ startLookup = true;
+ } else {
+ if ([candidate isVisible] && [candidate canBecomeKeyWindow]) {
+ [candidate makeKeyWindow];
+ break;
+ }
+ }
+ }
+}
+
+
@interface NSWindow (CocoaWindowCategory)
- (NSRect) legacyConvertRectFromScreen:(NSRect) rect;
@end
@@ -588,6 +614,9 @@ void QCocoaWindow::hide(bool becauseOfAncestor)
foreach (QCocoaWindow *childWindow, m_childWindows)
childWindow->hide(true);
+ if (window()->transientParent() && m_nsWindow == [[NSApplication sharedApplication] keyWindow])
+ selectNextKeyWindow(m_nsWindow); // Otherwise, Cocoa can do it wrong.
+
[m_nsWindow orderOut:nil];
}