summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms/wasm/qwasmwindowstack.cpp
diff options
context:
space:
mode:
authorEven Oscar Andersen <[email protected]>2025-05-23 12:37:25 +0200
committerEven Oscar Andersen <[email protected]>2025-05-26 13:27:17 +0200
commite48c19449e3856661f4fe2ccd30d94ba9d61301f (patch)
tree91ca8efd1b4072dcdfc55c83eca67095a7b50de5 /src/plugins/platforms/wasm/qwasmwindowstack.cpp
parent3ad9d5777fe0771d14e89bb5601d602f2451bd49 (diff)
wasm: Fix stacking order problem for transient parent windows
Windows with a transient parent does not reflect the relationship in the stacking order. Essentially AboveTransientParent is missing as a configuration choice. What makes this slightly convoluted is that the window stack does not depend on the window (for testability). We solve this problem by making the stack and treenode templates, and provide test class as arguments when testing. QWasmWindow and QWasmScreen are not templated as before. There is also a new order type StayAboveTransientParent. Which means that we can no longer use order type to get to the group location (Since StayAboveTransientParent can map to either of the three types). The window stack tests have been updated to handle the StayAboveTransientParent type. Finally, we do not do anything with a normal parent child relationship as this should already work correctly. Fixes: QTBUG-131699 Change-Id: Ie08e18f9e0a2339175c4a09da0a831f031df71e1 Reviewed-by: Lorn Potter <[email protected]>
Diffstat (limited to 'src/plugins/platforms/wasm/qwasmwindowstack.cpp')
-rw-r--r--src/plugins/platforms/wasm/qwasmwindowstack.cpp203
1 files changed, 0 insertions, 203 deletions
diff --git a/src/plugins/platforms/wasm/qwasmwindowstack.cpp b/src/plugins/platforms/wasm/qwasmwindowstack.cpp
deleted file mode 100644
index d3769c7a1bb..00000000000
--- a/src/plugins/platforms/wasm/qwasmwindowstack.cpp
+++ /dev/null
@@ -1,203 +0,0 @@
-// Copyright (C) 2022 The Qt Company Ltd.
-// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
-
-#include "qwasmwindowstack.h"
-
-QT_BEGIN_NAMESPACE
-
-QWasmWindowStack::QWasmWindowStack(WindowOrderChangedCallbackType windowOrderChangedCallback)
- : m_windowOrderChangedCallback(std::move(windowOrderChangedCallback)),
- m_regularWindowsBegin(m_windowStack.begin()),
- m_alwaysOnTopWindowsBegin(m_windowStack.begin())
-{
-}
-
-QWasmWindowStack::~QWasmWindowStack() = default;
-
-void QWasmWindowStack::pushWindow(QWasmWindow *window, PositionPreference position)
-{
- Q_ASSERT(m_windowStack.count(window) == 0);
-
- if (position == PositionPreference::StayOnTop) {
- const auto stayOnTopDistance =
- std::distance(m_windowStack.begin(), m_alwaysOnTopWindowsBegin);
- const auto regularDistance = std::distance(m_windowStack.begin(), m_regularWindowsBegin);
- m_windowStack.push_back(window);
- m_alwaysOnTopWindowsBegin = m_windowStack.begin() + stayOnTopDistance;
- m_regularWindowsBegin = m_windowStack.begin() + regularDistance;
- } else if (position == PositionPreference::Regular) {
- const auto regularDistance = std::distance(m_windowStack.begin(), m_regularWindowsBegin);
- m_alwaysOnTopWindowsBegin = m_windowStack.insert(m_alwaysOnTopWindowsBegin, window) + 1;
- m_regularWindowsBegin = m_windowStack.begin() + regularDistance;
- } else {
- const auto stayOnTopDistance =
- std::distance(m_windowStack.begin(), m_alwaysOnTopWindowsBegin);
- m_regularWindowsBegin = m_windowStack.insert(m_regularWindowsBegin, window) + 1;
- m_alwaysOnTopWindowsBegin = m_windowStack.begin() + stayOnTopDistance + 1;
- }
-
- m_windowOrderChangedCallback();
-}
-
-void QWasmWindowStack::removeWindow(QWasmWindow *window)
-{
- Q_ASSERT(m_windowStack.count(window) == 1);
-
- auto it = std::find(m_windowStack.begin(), m_windowStack.end(), window);
- const auto position = getWindowPositionPreference(it);
- const auto stayOnTopDistance = std::distance(m_windowStack.begin(), m_alwaysOnTopWindowsBegin);
- const auto regularDistance = std::distance(m_windowStack.begin(), m_regularWindowsBegin);
-
- m_windowStack.erase(it);
-
- m_alwaysOnTopWindowsBegin = m_windowStack.begin() + stayOnTopDistance
- - (position != PositionPreference::StayOnTop ? 1 : 0);
- m_regularWindowsBegin = m_windowStack.begin() + regularDistance
- - (position == PositionPreference::StayOnBottom ? 1 : 0);
-
- m_windowOrderChangedCallback();
-}
-
-void QWasmWindowStack::raise(QWasmWindow *window)
-{
- Q_ASSERT(m_windowStack.count(window) == 1);
-
- if (window == topWindow())
- return;
-
- auto it = std::find(m_windowStack.begin(), m_windowStack.end(), window);
- auto itEnd = ([this, position = getWindowPositionPreference(it)]() {
- switch (position) {
- case PositionPreference::StayOnTop:
- return m_windowStack.end();
- case PositionPreference::Regular:
- return m_alwaysOnTopWindowsBegin;
- case PositionPreference::StayOnBottom:
- return m_regularWindowsBegin;
- }
- })();
- std::rotate(it, it + 1, itEnd);
- m_windowOrderChangedCallback();
-}
-
-void QWasmWindowStack::lower(QWasmWindow *window)
-{
- Q_ASSERT(m_windowStack.count(window) == 1);
-
- if (window == *m_windowStack.begin())
- return;
-
- auto it = std::find(m_windowStack.begin(), m_windowStack.end(), window);
- auto itBegin = ([this, position = getWindowPositionPreference(it)]() {
- switch (position) {
- case PositionPreference::StayOnTop:
- return m_alwaysOnTopWindowsBegin;
- case PositionPreference::Regular:
- return m_regularWindowsBegin;
- case PositionPreference::StayOnBottom:
- return m_windowStack.begin();
- }
- })();
-
- std::rotate(itBegin, it, it + 1);
- m_windowOrderChangedCallback();
-}
-
-void QWasmWindowStack::windowPositionPreferenceChanged(QWasmWindow *window,
- PositionPreference position)
-{
- auto it = std::find(m_windowStack.begin(), m_windowStack.end(), window);
- const auto currentPosition = getWindowPositionPreference(it);
-
- const auto zones = static_cast<int>(position) - static_cast<int>(currentPosition);
- Q_ASSERT(zones != 0);
-
- if (zones < 0) {
- // Perform right rotation so that the window lands on top of regular windows
- const auto begin = std::make_reverse_iterator(it + 1);
- const auto end = position == PositionPreference::Regular
- ? std::make_reverse_iterator(m_alwaysOnTopWindowsBegin)
- : std::make_reverse_iterator(m_regularWindowsBegin);
- std::rotate(begin, begin + 1, end);
- if (zones == -2) {
- ++m_alwaysOnTopWindowsBegin;
- ++m_regularWindowsBegin;
- } else if (position == PositionPreference::Regular) {
- ++m_alwaysOnTopWindowsBegin;
- } else {
- ++m_regularWindowsBegin;
- }
- } else {
- // Perform left rotation so that the window lands at the bottom of always on top windows
- const auto begin = it;
- const auto end = position == PositionPreference::Regular ? m_regularWindowsBegin
- : m_alwaysOnTopWindowsBegin;
- std::rotate(begin, begin + 1, end);
- if (zones == 2) {
- --m_alwaysOnTopWindowsBegin;
- --m_regularWindowsBegin;
- } else if (position == PositionPreference::Regular) {
- --m_regularWindowsBegin;
- } else {
- --m_alwaysOnTopWindowsBegin;
- }
- }
- m_windowOrderChangedCallback();
-}
-
-QWasmWindowStack::iterator QWasmWindowStack::begin()
-{
- return m_windowStack.rbegin();
-}
-
-QWasmWindowStack::iterator QWasmWindowStack::end()
-{
- return m_windowStack.rend();
-}
-
-QWasmWindowStack::const_iterator QWasmWindowStack::begin() const
-{
- return m_windowStack.rbegin();
-}
-
-QWasmWindowStack::const_iterator QWasmWindowStack::end() const
-{
- return m_windowStack.rend();
-}
-
-QWasmWindowStack::const_reverse_iterator QWasmWindowStack::rbegin() const
-{
- return m_windowStack.begin();
-}
-
-QWasmWindowStack::const_reverse_iterator QWasmWindowStack::rend() const
-{
- return m_windowStack.end();
-}
-
-bool QWasmWindowStack::empty() const
-{
- return m_windowStack.empty();
-}
-
-size_t QWasmWindowStack::size() const
-{
- return m_windowStack.size();
-}
-
-QWasmWindow *QWasmWindowStack::topWindow() const
-{
- return m_windowStack.empty() ? nullptr : m_windowStack.last();
-}
-
-QWasmWindowStack::PositionPreference
-QWasmWindowStack::getWindowPositionPreference(StorageType::iterator windowIt) const
-{
- if (windowIt >= m_alwaysOnTopWindowsBegin)
- return PositionPreference::StayOnTop;
- if (windowIt >= m_regularWindowsBegin)
- return PositionPreference::Regular;
- return PositionPreference::StayOnBottom;
-}
-
-QT_END_NAMESPACE