macOS: lower the splash screen when a modal dialog blocks it
This fixes the usability issue of a modal dialog showing up behind a splash screen, not visible to the user, but blocking user input and the application startup sequence until discarded. [ChangeLog][QtWidgets][QSlashScreen] On macOS, lower the splash screen when a modal dialog is shown to make sure the user sees the dialog. Change-Id: Ibae768f76909d930cb25dcf5cee31edc5f15c29a Fixes: QTBUG-49576 Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
This commit is contained in:
parent
cc13b99781
commit
2a756e294e
@ -217,6 +217,25 @@ QCocoaIntegration::QCocoaIntegration(const QStringList ¶mList)
|
|||||||
|
|
||||||
connect(qGuiApp, &QGuiApplication::focusWindowChanged,
|
connect(qGuiApp, &QGuiApplication::focusWindowChanged,
|
||||||
this, &QCocoaIntegration::focusWindowChanged);
|
this, &QCocoaIntegration::focusWindowChanged);
|
||||||
|
|
||||||
|
static auto splashScreenHider = QMacKeyValueObserver(NSApp, @"modalWindow", []{
|
||||||
|
const QWindowList allWindows = QGuiApplication::topLevelWindows();
|
||||||
|
for (QWindow *window : allWindows) {
|
||||||
|
if ((window->flags() & Qt::SplashScreen) == Qt::SplashScreen) {
|
||||||
|
QCocoaWindow *platformWindow = static_cast<QCocoaWindow*>(window->handle());
|
||||||
|
NSWindow *splashWindow = platformWindow->view().window;
|
||||||
|
if (!splashWindow)
|
||||||
|
continue;
|
||||||
|
if (NSApp.modalWindow) {
|
||||||
|
NSInteger originalLevel = splashWindow.level;
|
||||||
|
splashWindow.level = NSNormalWindowLevel;
|
||||||
|
window->setProperty("_q_levelBeforeModalSession", (qlonglong)originalLevel);
|
||||||
|
} else if (NSInteger originalLevel = window->property("_q_levelBeforeModalSession").toLongLong()) {
|
||||||
|
splashWindow.level = originalLevel;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
QCocoaIntegration::~QCocoaIntegration()
|
QCocoaIntegration::~QCocoaIntegration()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user