summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms/wasm/qwasmcompositor.cpp
diff options
context:
space:
mode:
authorMikolaj Boc <mikolaj.boc@qt.io>2023-01-26 18:38:21 +0100
committerMikolaj Boc <mikolaj.boc@qt.io>2023-02-22 18:07:35 +0100
commita596ea0fe278416b4827ddbb0fffd9c497bd4d88 (patch)
treea1cd4d50ecf318ba8cb03ebec1c42b50a52be6bd /src/plugins/platforms/wasm/qwasmcompositor.cpp
parent96e031edd74e8e1eaea79d95320637eb27e8e2ba (diff)
Support always on top/bottom window flags on WASM
The window stack will now upkeep three groups of windows, always on bottom (1), regular (2), always on top (3). Windows belonging to (3) will always appear on top of (2) and (1), and windows from (2) will always appear on top of (1). The first window created in the application gets the (1) status, which is in line with the root window mechanism used before. Activation has now been decoupled from the top position on the window stack as a window in (1) or (2) may be active, in spite of the top window belonging to a higher group. Fixes: QTBUG-110098 Change-Id: I51f4d2d47163fab26ce5ef28f7a4f23a522c7f91 Reviewed-by: Lorn Potter <lorn.potter@gmail.com>
Diffstat (limited to 'src/plugins/platforms/wasm/qwasmcompositor.cpp')
-rw-r--r--src/plugins/platforms/wasm/qwasmcompositor.cpp51
1 files changed, 37 insertions, 14 deletions
diff --git a/src/plugins/platforms/wasm/qwasmcompositor.cpp b/src/plugins/platforms/wasm/qwasmcompositor.cpp
index 56b0592d6b0..922e802732c 100644
--- a/src/plugins/platforms/wasm/qwasmcompositor.cpp
+++ b/src/plugins/platforms/wasm/qwasmcompositor.cpp
@@ -22,6 +22,16 @@ QWasmWindow *asWasmWindow(QWindow *window)
{
return static_cast<QWasmWindow*>(window->handle());
}
+
+QWasmWindowStack::PositionPreference positionPreferenceFromWindowFlags(Qt::WindowFlags flags)
+{
+ if (flags.testFlag(Qt::WindowStaysOnTopHint))
+ return QWasmWindowStack::PositionPreference::StayOnTop;
+ if (flags.testFlag(Qt::WindowStaysOnBottomHint))
+ return QWasmWindowStack::PositionPreference::StayOnBottom;
+ return QWasmWindowStack::PositionPreference::Regular;
+}
+
} // namespace
using namespace emscripten;
@@ -67,8 +77,11 @@ void QWasmCompositor::destroy()
void QWasmCompositor::addWindow(QWasmWindow *window)
{
- m_windowStack.pushWindow(window);
- m_windowStack.topWindow()->requestActivateWindow();
+ if (m_windowStack.empty())
+ window->window()->setFlag(Qt::WindowStaysOnBottomHint);
+ m_windowStack.pushWindow(window, positionPreferenceFromWindowFlags(window->window()->flags()));
+ window->requestActivateWindow();
+ setActive(window);
updateEnabledState();
}
@@ -77,12 +90,27 @@ void QWasmCompositor::removeWindow(QWasmWindow *window)
{
m_requestUpdateWindows.remove(window);
m_windowStack.removeWindow(window);
- if (m_windowStack.topWindow())
+ if (m_windowStack.topWindow()) {
m_windowStack.topWindow()->requestActivateWindow();
+ setActive(m_windowStack.topWindow());
+ }
updateEnabledState();
}
+void QWasmCompositor::setActive(QWasmWindow *window)
+{
+ m_activeWindow = window;
+
+ auto it = m_windowStack.begin();
+ if (it == m_windowStack.end()) {
+ return;
+ }
+ for (; it != m_windowStack.end(); ++it) {
+ (*it)->onActivationChanged(*it == m_activeWindow);
+ }
+}
+
void QWasmCompositor::updateEnabledState()
{
m_isEnabled = std::any_of(m_windowStack.begin(), m_windowStack.end(), [](QWasmWindow *window) {
@@ -100,6 +128,11 @@ void QWasmCompositor::lower(QWasmWindow *window)
m_windowStack.lower(window);
}
+void QWasmCompositor::windowPositionPreferenceChanged(QWasmWindow *window, Qt::WindowFlags flags)
+{
+ m_windowStack.windowPositionPreferenceChanged(window, positionPreferenceFromWindowFlags(flags));
+}
+
QWindow *QWasmCompositor::windowAt(QPoint targetPointInScreenCoords, int padding) const
{
const auto found = std::find_if(
@@ -115,7 +148,7 @@ QWindow *QWasmCompositor::windowAt(QPoint targetPointInScreenCoords, int padding
QWindow *QWasmCompositor::keyWindow() const
{
- return m_windowStack.topWindow() ? m_windowStack.topWindow()->window() : nullptr;
+ return m_activeWindow ? m_activeWindow->window() : nullptr;
}
void QWasmCompositor::requestUpdateAllWindows()
@@ -234,16 +267,6 @@ void QWasmCompositor::onTopWindowChanged()
int z = zOrderForElementInFrontOfScreen;
std::for_each(m_windowStack.rbegin(), m_windowStack.rend(),
[&z](QWasmWindow *window) { window->setZOrder(z++); });
-
- auto it = m_windowStack.begin();
- if (it == m_windowStack.end()) {
- return;
- }
- (*it)->onActivationChanged(true);
- ++it;
- for (; it != m_windowStack.end(); ++it) {
- (*it)->onActivationChanged(false);
- }
}
QWasmScreen *QWasmCompositor::screen()