From 9bd3752029ce4c4fbd0f8b63cc56943918a5ac7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tor=20Arne=20Vestb=C3=B8?= Date: Wed, 5 Jun 2024 13:28:26 +0200 Subject: [PATCH] iOS: Compute window level when needed instead of up front in member var When a popup widget is shown, it's first raised(), and then made visible. In this scenario, the logic in QIOSWindow::setVisible() to compute the window level was too late, and we ended up showing the popup below other popups. Instead of moving the window level computation earlier, we remove the member variable and just compute the level when needed, as we do in the Cocoa platform plugin. Fixes: QTBUG-126052 Fixes: QTBUG-126044 Pick-to: 6.7 Change-Id: If5dbcdcf0500aed57b725bb8eb636fe076459130 Reviewed-by: Richard Moe Gustavsen (cherry picked from commit 0e656164e640ff2aca00e82b51b0f1019fd7802f) Reviewed-by: Qt Cherry-pick Bot --- src/plugins/platforms/ios/qioswindow.h | 3 +- src/plugins/platforms/ios/qioswindow.mm | 48 ++++++++++++------------- 2 files changed, 24 insertions(+), 27 deletions(-) diff --git a/src/plugins/platforms/ios/qioswindow.h b/src/plugins/platforms/ios/qioswindow.h index 88afee80c32..86bcc111d35 100644 --- a/src/plugins/platforms/ios/qioswindow.h +++ b/src/plugins/platforms/ios/qioswindow.h @@ -71,10 +71,9 @@ private: UIView *m_view; QRect m_normalGeometry; - int m_windowLevel; void raiseOrLower(bool raise); - void updateWindowLevel(); + int windowLevel() const; bool blockedByModal(); friend class QIOSScreen; diff --git a/src/plugins/platforms/ios/qioswindow.mm b/src/plugins/platforms/ios/qioswindow.mm index 60bebd144f5..7cd3d5f0b08 100644 --- a/src/plugins/platforms/ios/qioswindow.mm +++ b/src/plugins/platforms/ios/qioswindow.mm @@ -36,7 +36,6 @@ enum { QIOSWindow::QIOSWindow(QWindow *window, WId nativeHandle) : QPlatformWindow(window) - , m_windowLevel(0) { if (nativeHandle) { m_view = reinterpret_cast(nativeHandle); @@ -127,11 +126,6 @@ void QIOSWindow::setVisible(bool visible) if (!isQtApplication() || !window()->isTopLevel()) return; - // Since iOS doesn't do window management the way a Qt application - // expects, we need to raise and activate windows ourselves: - if (visible) - updateWindowLevel(); - if (blockedByModal()) { if (visible) raise(); @@ -343,8 +337,8 @@ void QIOSWindow::raiseOrLower(bool raise) UIView *view = static_cast([subviews objectAtIndex:i]); if (view.hidden || view == m_view || !view.qwindow) continue; - int level = static_cast(view.qwindow->handle())->m_windowLevel; - if (m_windowLevel > level || (raise && m_windowLevel == level)) { + int level = static_cast(view.qwindow->handle())->windowLevel(); + if (windowLevel() > level || (raise && windowLevel() == level)) { [m_view.superview insertSubview:m_view aboveSubview:view]; return; } @@ -359,30 +353,34 @@ void QIOSWindow::raiseOrLower(bool raise) } } -void QIOSWindow::updateWindowLevel() +int QIOSWindow::windowLevel() const { Qt::WindowType type = window()->type(); - if (type == Qt::ToolTip) - m_windowLevel = 120; - else if (window()->flags() & Qt::WindowStaysOnTopHint) - m_windowLevel = 100; - else if (window()->isModal()) - m_windowLevel = 40; - else if (type == Qt::Popup) - m_windowLevel = 30; - else if (type == Qt::SplashScreen) - m_windowLevel = 20; - else if (type == Qt::Tool) - m_windowLevel = 10; - else - m_windowLevel = 0; + int level = 0; - // A window should be in at least the same m_windowLevel as its parent: + if (type == Qt::ToolTip) + level = 120; + else if (window()->flags() & Qt::WindowStaysOnTopHint) + level = 100; + else if (window()->isModal()) + level = 40; + else if (type == Qt::Popup) + level = 30; + else if (type == Qt::SplashScreen) + level = 20; + else if (type == Qt::Tool) + level = 10; + else + level = 0; + + // A window should be in at least the same window level as its parent QWindow *transientParent = window()->transientParent(); QIOSWindow *transientParentWindow = transientParent ? static_cast(transientParent->handle()) : 0; if (transientParentWindow) - m_windowLevel = qMax(transientParentWindow->m_windowLevel, m_windowLevel); + level = qMax(transientParentWindow->windowLevel(), level); + + return level; } void QIOSWindow::applicationStateChanged(Qt::ApplicationState)