diff options
| author | Mikolaj Boc <mikolaj.boc@qt.io> | 2023-06-14 14:54:34 +0200 |
|---|---|---|
| committer | Mikolaj Boc <mikolaj.boc@qt.io> | 2023-06-15 09:41:06 +0200 |
| commit | fc4fca6d9dc22839ca73898c362faff96c81214c (patch) | |
| tree | a30fcc5804cf28f81631f970d54e2c6207549f9a /src/plugins/platforms/wasm/qwasmcompositor.cpp | |
| parent | eb92d52dc7190efefae0fae89c7c6eb9e16cdd9d (diff) | |
Support child windows on WASM
Setting parents for WASM platform windows is now supported. This means
that windows now reside in a hierarchical window tree, with the screen
and individual windows being nodes (QWasmWindowTreeNode), each
maintaining their own child window stack.
The divs backing windows are properly reparented in response to Qt
window parent changes, so that the html structure reflects what is
happening in Qt.
Change-Id: I55c91d90caf58714342dcd747043967ebfdf96bb
Reviewed-by: Morten Johan Sørvig <morten.sorvig@qt.io>
Diffstat (limited to 'src/plugins/platforms/wasm/qwasmcompositor.cpp')
| -rw-r--r-- | src/plugins/platforms/wasm/qwasmcompositor.cpp | 108 |
1 files changed, 14 insertions, 94 deletions
diff --git a/src/plugins/platforms/wasm/qwasmcompositor.cpp b/src/plugins/platforms/wasm/qwasmcompositor.cpp index 92e31507388..66eaea62faa 100644 --- a/src/plugins/platforms/wasm/qwasmcompositor.cpp +++ b/src/plugins/platforms/wasm/qwasmcompositor.cpp @@ -8,21 +8,9 @@ #include <emscripten/html5.h> -namespace { +using namespace emscripten; -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 - -QWasmCompositor::QWasmCompositor(QWasmScreen *screen) - : QObject(screen), m_windowStack(std::bind(&QWasmCompositor::onTopWindowChanged, this)) +QWasmCompositor::QWasmCompositor(QWasmScreen *screen) : QObject(screen) { QWindowSystemInterface::setSynchronousWindowSystemEvents(true); } @@ -37,80 +25,20 @@ QWasmCompositor::~QWasmCompositor() m_isEnabled = false; // prevent frame() from creating a new m_context } -void QWasmCompositor::addWindow(QWasmWindow *window) -{ - if (m_windowStack.empty()) - window->window()->setFlag(Qt::WindowStaysOnBottomHint); - m_windowStack.pushWindow(window, positionPreferenceFromWindowFlags(window->window()->flags())); - window->requestActivateWindow(); - setActive(window); - - updateEnabledState(); -} - -void QWasmCompositor::removeWindow(QWasmWindow *window) -{ - m_requestUpdateWindows.remove(window); - m_windowStack.removeWindow(window); - 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) { - return !window->context2d().isUndefined(); - }); -} - -void QWasmCompositor::raise(QWasmWindow *window) -{ - m_windowStack.raise(window); -} - -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 +void QWasmCompositor::onWindowTreeChanged(QWasmWindowTreeNodeChangeType changeType, + QWasmWindow *window) { - const auto found = std::find_if( - m_windowStack.begin(), m_windowStack.end(), - [padding, &targetPointInScreenCoords](const QWasmWindow *window) { - const QRect geometry = window->windowFrameGeometry().adjusted(-padding, -padding, - padding, padding); - - return window->isVisible() && geometry.contains(targetPointInScreenCoords); - }); - return found != m_windowStack.end() ? (*found)->window() : nullptr; + auto allWindows = screen()->allWindows(); + setEnabled(std::any_of(allWindows.begin(), allWindows.end(), [](QWasmWindow *element) { + return !element->context2d().isUndefined(); + })); + if (changeType == QWasmWindowTreeNodeChangeType::NodeRemoval) + m_requestUpdateWindows.remove(window); } -QWindow *QWasmCompositor::keyWindow() const +void QWasmCompositor::setEnabled(bool enabled) { - return m_activeWindow ? m_activeWindow->window() : nullptr; + m_isEnabled = enabled; } void QWasmCompositor::requestUpdateWindow(QWasmWindow *window, UpdateRequestDeliveryType updateType) @@ -159,7 +87,6 @@ void QWasmCompositor::deliverUpdateRequests() // update type: QWindow subclasses expect that requested and delivered updateRequests matches // exactly. m_inDeliverUpdateRequest = true; - for (auto it = requestUpdateWindows.constBegin(); it != requestUpdateWindows.constEnd(); ++it) { auto *window = it.key(); UpdateRequestDeliveryType updateType = it.value(); @@ -200,15 +127,8 @@ void QWasmCompositor::frame(const QList<QWasmWindow *> &windows) if (!m_isEnabled || !screen()) return; - std::for_each(windows.begin(), windows.end(), [](QWasmWindow *window) { window->paint(); }); -} - -void QWasmCompositor::onTopWindowChanged() -{ - constexpr int zOrderForElementInFrontOfScreen = 3; - int z = zOrderForElementInFrontOfScreen; - std::for_each(m_windowStack.rbegin(), m_windowStack.rend(), - [&z](QWasmWindow *window) { window->setZOrder(z++); }); + for (QWasmWindow *window : windows) + window->paint(); } QWasmScreen *QWasmCompositor::screen() |
