macOS: Activate all windows on launch, not just key/main windows

The default macOS behavior when an application is activated is to
bring key and main windows to the front. Any window shown after
that is order to the front as normal.

For Qt apps we show windows in main() instead of waiting for the
application to become active first, and the request to show
the window may reach the window server before or after Finder
has made the application active. If it arrives first, the window
may end up behind the currently frontmost application.

This is particularly noticeable when the application is not
activated by Finder, and we do our own activation workaround.
In this case all our windows are hidden, except for the key
window.

To ensure a consistent behavior here, we explicitly activate
all windows of the application on launch.

Pick-to: 6.5 6.6
Change-Id: Ice55f7d03e077c5a5ca843f75f1a7296ebb47aa7
Reviewed-by: Timur Pocheptsov <timur.pocheptsov@qt.io>
This commit is contained in:
Tor Arne Vestbø 2023-10-26 15:42:23 +02:00
parent 6343caae25
commit b49211c125

View File

@ -203,6 +203,14 @@ QT_USE_NAMESPACE
<< "as frontmost application. Activating" << currentApplication << "instead.";
[NSApplication.sharedApplication activateIgnoringOtherApps:YES];
}
// Qt windows are typically shown in main(), at which point the application
// is not active yet. When the application is activated, either externally
// or via the override above, it will only bring the main and key windows
// forward, which differs from the behavior if these windows had been shown
// once the application was already active. To work around this, we explicitly
// activate the current application again, bringing all windows to the front.
[currentApplication activateWithOptions:NSApplicationActivateAllWindows];
}
QCocoaMenuBar::insertWindowMenu();