summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms/wasm/qwasmcompositor.cpp
diff options
context:
space:
mode:
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()