From eb9923c67ed919c4072a22857d4c32419de3d521 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tor=20Arne=20Vestb=C3=B8?= Date: Fri, 5 Apr 2024 16:28:31 +0200 Subject: [PATCH] iOS: Support message box at startup without relying on screen's window Task-number: QTBUG-121781 Change-Id: Iafc911dad6c668799383f423e38ab389c29688b4 Reviewed-by: Doris Verria --- src/plugins/platforms/ios/qiosglobal.mm | 13 ++++++---- .../platforms/ios/qiosmessagedialog.mm | 24 +++++++------------ 2 files changed, 17 insertions(+), 20 deletions(-) diff --git a/src/plugins/platforms/ios/qiosglobal.mm b/src/plugins/platforms/ios/qiosglobal.mm index 169c292a008..8d0df38dbe6 100644 --- a/src/plugins/platforms/ios/qiosglobal.mm +++ b/src/plugins/platforms/ios/qiosglobal.mm @@ -88,10 +88,15 @@ int infoPlistValue(NSString* key, int defaultValue) UIWindow *presentationWindow(QWindow *window) { UIWindow *uiWindow = window ? reinterpret_cast(window->winId()).window : nullptr; -#if !defined(Q_OS_VISIONOS) - if (!uiWindow) - uiWindow = qt_apple_sharedApplication().keyWindow; -#endif + if (!uiWindow) { + auto *scenes = [qt_apple_sharedApplication().connectedScenes allObjects]; + if (scenes.count > 0) { + auto *windowScene = static_cast(scenes[0]); + uiWindow = windowScene.keyWindow; + if (!uiWindow && windowScene.windows.count) + uiWindow = windowScene.windows[0]; + } + } return uiWindow; } diff --git a/src/plugins/platforms/ios/qiosmessagedialog.mm b/src/plugins/platforms/ios/qiosmessagedialog.mm index 979829377a9..7fbd5d87298 100644 --- a/src/plugins/platforms/ios/qiosmessagedialog.mm +++ b/src/plugins/platforms/ios/qiosmessagedialog.mm @@ -117,25 +117,17 @@ bool QIOSMessageDialog::show(Qt::WindowFlags windowFlags, Qt::WindowModality win } UIWindow *window = presentationWindow(parent); - if (!window) { - qCDebug(lcQpaWindow, "Attempting to exec a dialog without any window/widget visible."); - - auto *primaryScreen = static_cast(QGuiApplication::primaryScreen()->handle()); - Q_ASSERT(primaryScreen); - - window = primaryScreen->uiWindow(); - if (window.hidden) { - // With a window hidden, an attempt to present view controller - // below fails with a warning, that a view "is not a part of - // any view hierarchy". The UIWindow is initially hidden, - // as unhiding it is what hides the splash screen. - window.hidden = NO; - } - } - if (!window) return false; + if (window.hidden) { + // With a window hidden, an attempt to present view controller + // below fails with a warning, that a view "is not a part of + // any view hierarchy". The UIWindow is initially hidden, + // as unhiding it is what hides the splash screen. + window.hidden = NO; + } + [window.rootViewController presentViewController:m_alertController animated:YES completion:nil]; return true; }