From ea1978c7f9111f47823c9906d7070ded0970dc4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tor=20Arne=20Vestb=C3=B8?= Date: Thu, 4 Jul 2024 19:43:18 +0200 Subject: [PATCH] visionOS: Report size of root view as screen size Even though we've decoupled QIOSScreen from managing UIWindows, we still have one UIWindow per screen, so we can pull out the bounds of that root view to determine Qt's screen geometry. Change-Id: I05993ad6d629dd2158681dd17355b7e216bfbb49 Reviewed-by: Timur Pocheptsov (cherry picked from commit 16483487c4e37546cf296a72e137d49d28b55e05) Reviewed-by: Qt Cherry-pick Bot --- src/plugins/platforms/ios/qiosglobal.h | 2 +- src/plugins/platforms/ios/qiosglobal.mm | 6 ++++-- src/plugins/platforms/ios/qiosscreen.mm | 4 ++-- src/plugins/platforms/ios/qioswindow.mm | 2 +- 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/plugins/platforms/ios/qiosglobal.h b/src/plugins/platforms/ios/qiosglobal.h index 9428487a00d..32b735c4bca 100644 --- a/src/plugins/platforms/ios/qiosglobal.h +++ b/src/plugins/platforms/ios/qiosglobal.h @@ -39,7 +39,7 @@ int infoPlistValue(NSString* key, int defaultValue); class QWindow; class QScreen; UIWindow *presentationWindow(QWindow *); -UIView *rootViewForScreen(QScreen *); +UIView *rootViewForScreen(const QPlatformScreen *); QT_END_NAMESPACE diff --git a/src/plugins/platforms/ios/qiosglobal.mm b/src/plugins/platforms/ios/qiosglobal.mm index 1722e09aaab..9ab490b2970 100644 --- a/src/plugins/platforms/ios/qiosglobal.mm +++ b/src/plugins/platforms/ios/qiosglobal.mm @@ -108,9 +108,11 @@ UIWindow *presentationWindow(QWindow *window) return uiWindow; } -UIView *rootViewForScreen(QScreen *screen) +UIView *rootViewForScreen(const QPlatformScreen *screen) { - const auto *iosScreen = static_cast(screen->handle()); + Q_ASSERT(screen); + + const auto *iosScreen = static_cast(screen); for (UIScene *scene in [qt_apple_sharedApplication().connectedScenes allObjects]) { if (![scene isKindOfClass:UIWindowScene.class]) continue; diff --git a/src/plugins/platforms/ios/qiosscreen.mm b/src/plugins/platforms/ios/qiosscreen.mm index 8f3081e276c..c5944ba1a7e 100644 --- a/src/plugins/platforms/ios/qiosscreen.mm +++ b/src/plugins/platforms/ios/qiosscreen.mm @@ -209,7 +209,7 @@ void QIOSScreen::updateProperties() #if defined(Q_OS_VISIONOS) // Based on what iPad app reports - m_geometry = QRect(0, 0, 1194, 834); + m_geometry = QRectF::fromCGRect(rootViewForScreen(this).bounds).toRect(); m_depth = 24; #else m_geometry = QRectF::fromCGRect(m_uiScreen.bounds).toRect(); @@ -377,7 +377,7 @@ QPixmap QIOSScreen::grabWindow(WId window, int x, int y, int width, int height) return QPixmap(); UIView *view = window ? reinterpret_cast(window) - : rootViewForScreen(screen()); + : rootViewForScreen(this); if (width < 0) width = qMax(view.bounds.size.width - x, CGFloat(0)); diff --git a/src/plugins/platforms/ios/qioswindow.mm b/src/plugins/platforms/ios/qioswindow.mm index 7cd3d5f0b08..b2f2ea920ee 100644 --- a/src/plugins/platforms/ios/qioswindow.mm +++ b/src/plugins/platforms/ios/qioswindow.mm @@ -298,7 +298,7 @@ void QIOSWindow::setParent(const QPlatformWindow *parentWindow) if (parentWindow) superview = reinterpret_cast(parentWindow->winId()); else if (isQtApplication() && !isForeignWindow()) - superview = rootViewForScreen(window()->screen()); + superview = rootViewForScreen(window()->screen()->handle()); if (superview) [superview addSubview:m_view];