From a812d1eb661ea5acedc3258405a1035781e3956b Mon Sep 17 00:00:00 2001 From: Mikolaj Boc Date: Mon, 28 Nov 2022 15:24:58 +0100 Subject: [PATCH] Don't tie compositor's enabled state to last added window MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently, the compositor gets enabled/disabled based on the last constructed window's surface type. This causes non-OpenGL windows not to be displayed if any OpenGL window is created last. The compositor should scan for any non-openGL windows on any change to the window set to decide if it needs to be disabled or not. Change-Id: I037470e39a3fbae50fd3a4e29cb6615130d7b114 Reviewed-by: Morten Johan Sørvig --- src/plugins/platforms/wasm/qwasmcompositor.cpp | 16 +++++++++++----- src/plugins/platforms/wasm/qwasmcompositor.h | 3 ++- src/plugins/platforms/wasm/qwasmwindow.cpp | 7 ++----- 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/src/plugins/platforms/wasm/qwasmcompositor.cpp b/src/plugins/platforms/wasm/qwasmcompositor.cpp index ad8a4508cee..b68f380fe7b 100644 --- a/src/plugins/platforms/wasm/qwasmcompositor.cpp +++ b/src/plugins/platforms/wasm/qwasmcompositor.cpp @@ -149,11 +149,6 @@ void QWasmCompositor::initEventHandlers() emscripten::val(quintptr(reinterpret_cast(screen())))); } -void QWasmCompositor::setEnabled(bool enabled) -{ - m_isEnabled = enabled; -} - void QWasmCompositor::startResize(Qt::Edges edges) { m_windowManipulation.startResize(edges); @@ -163,6 +158,8 @@ void QWasmCompositor::addWindow(QWasmWindow *window) { m_windowStack.pushWindow(window); m_windowStack.topWindow()->requestActivateWindow(); + + updateEnabledState(); } void QWasmCompositor::removeWindow(QWasmWindow *window) @@ -171,6 +168,15 @@ void QWasmCompositor::removeWindow(QWasmWindow *window) m_windowStack.removeWindow(window); if (m_windowStack.topWindow()) m_windowStack.topWindow()->requestActivateWindow(); + + updateEnabledState(); +} + +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) diff --git a/src/plugins/platforms/wasm/qwasmcompositor.h b/src/plugins/platforms/wasm/qwasmcompositor.h index 9ea07617711..c1fc62d3809 100644 --- a/src/plugins/platforms/wasm/qwasmcompositor.h +++ b/src/plugins/platforms/wasm/qwasmcompositor.h @@ -43,7 +43,6 @@ public: QPalette palette; }; - void setEnabled(bool enabled); void startResize(Qt::Edges edges); void addWindow(QWasmWindow *window); @@ -146,6 +145,8 @@ private: void enterWindow(QWindow *window, const QPoint &localPoint, const QPoint &globalPoint); void leaveWindow(QWindow *window); + void updateEnabledState(); + WindowManipulation m_windowManipulation; QWasmWindowStack m_windowStack; diff --git a/src/plugins/platforms/wasm/qwasmwindow.cpp b/src/plugins/platforms/wasm/qwasmwindow.cpp index 182ae38fea4..4f9a9272778 100644 --- a/src/plugins/platforms/wasm/qwasmwindow.cpp +++ b/src/plugins/platforms/wasm/qwasmwindow.cpp @@ -232,8 +232,8 @@ QWasmWindow::QWasmWindow(QWindow *w, QWasmCompositor *compositor, QWasmBackingSt compositor->screen()->element().call("appendChild", m_qtWindow); - m_needsCompositor = w->surfaceType() != QSurface::OpenGLSurface; - if (m_needsCompositor) + const bool rendersTo2dContext = w->surfaceType() != QSurface::OpenGLSurface; + if (rendersTo2dContext) m_context2d = m_canvas.call("getContext", emscripten::val("2d")); static int serialNo = 0; m_winId = ++serialNo; @@ -241,9 +241,6 @@ QWasmWindow::QWasmWindow(QWindow *w, QWasmCompositor *compositor, QWasmBackingSt emscripten::val::module_property("specialHTMLTargets").set(canvasSelector(), m_canvas); m_compositor->addWindow(this); - - // Pure OpenGL windows draw directly using egl, disable the compositor. - m_compositor->setEnabled(w->surfaceType() != QSurface::OpenGLSurface); } QWasmWindow::~QWasmWindow()