diff options
author | Mikolaj Boc <mikolaj.boc@qt.io> | 2022-08-23 14:24:36 +0200 |
---|---|---|
committer | Mikolaj Boc <mikolaj.boc@qt.io> | 2022-08-24 17:50:25 +0200 |
commit | 11f12521bcd9c76f0ff5c60fb8785aba33ec7ca7 (patch) | |
tree | 5cf2eb6ccad5143628146c793f84ae64e2b73261 /src | |
parent | 0acb56518d72c09650dd83ca34a7d5bb0763b06a (diff) |
Resolve window focusing problems on WASM
- Moved the modal window resolution to
QWasmWindow::requestActivateWindow so that multiple async activation
events are not issued in unpredictable patterns.
- Request activation on added windows and on stack top in case of
window removal
Pick-to: 6.4
Change-Id: I6f02cf1b7e83abb7961caf311ffc83e91c8bf810
Reviewed-by: Morten Johan Sørvig <morten.sorvig@qt.io>
Diffstat (limited to 'src')
-rw-r--r-- | src/plugins/platforms/wasm/qwasmcompositor.cpp | 20 | ||||
-rw-r--r-- | src/plugins/platforms/wasm/qwasmcompositor.h | 2 | ||||
-rw-r--r-- | src/plugins/platforms/wasm/qwasmwindow.cpp | 6 | ||||
-rw-r--r-- | src/plugins/platforms/wasm/qwasmwindowstack.cpp | 8 | ||||
-rw-r--r-- | src/plugins/platforms/wasm/qwasmwindowstack.h | 2 |
5 files changed, 17 insertions, 21 deletions
diff --git a/src/plugins/platforms/wasm/qwasmcompositor.cpp b/src/plugins/platforms/wasm/qwasmcompositor.cpp index fff448ddef..270f8e65e7 100644 --- a/src/plugins/platforms/wasm/qwasmcompositor.cpp +++ b/src/plugins/platforms/wasm/qwasmcompositor.cpp @@ -53,7 +53,7 @@ EMSCRIPTEN_BINDINGS(qtMouseModule) { QWasmCompositor::QWasmCompositor(QWasmScreen *screen) : QObject(screen), m_windowManipulation(screen), - m_windowStack(std::bind(&QWasmCompositor::onTopWindowChanged, this, std::placeholders::_1)), + m_windowStack(std::bind(&QWasmCompositor::onTopWindowChanged, this)), m_blitter(new QOpenGLTextureBlitter), m_eventTranslator(std::make_unique<QWasmEventTranslator>()) { @@ -174,6 +174,7 @@ void QWasmCompositor::addWindow(QWasmWindow *window) { m_windowVisibility.insert(window, false); m_windowStack.pushWindow(window); + m_windowStack.topWindow()->requestActivateWindow(); } void QWasmCompositor::removeWindow(QWasmWindow *window) @@ -181,6 +182,8 @@ void QWasmCompositor::removeWindow(QWasmWindow *window) m_windowVisibility.remove(window); m_requestUpdateWindows.remove(window); m_windowStack.removeWindow(window); + if (m_windowStack.topWindow()) + m_windowStack.topWindow()->requestActivateWindow(); } void QWasmCompositor::setVisible(QWasmWindow *window, bool visible) @@ -755,21 +758,8 @@ void QWasmCompositor::WindowManipulation::resizeWindow(const QPoint& amount) )); } -void QWasmCompositor::onTopWindowChanged(QWasmWindow *window) +void QWasmCompositor::onTopWindowChanged() { - if (!QGuiApplication::focusWindow()) - window->requestActivateWindow(); - - QWindow *modalWindow; - const bool isTargetWindowBlocked = - QGuiApplicationPrivate::instance()->isWindowBlocked(window->window(), &modalWindow); - - if (isTargetWindowBlocked) { - modalWindow->requestActivate(); - raise(asWasmWindow(modalWindow)); - return; - } - requestUpdate(); } diff --git a/src/plugins/platforms/wasm/qwasmcompositor.h b/src/plugins/platforms/wasm/qwasmcompositor.h index cb6a66281e..0e7bd0eeec 100644 --- a/src/plugins/platforms/wasm/qwasmcompositor.h +++ b/src/plugins/platforms/wasm/qwasmcompositor.h @@ -176,7 +176,7 @@ private: std::unique_ptr<OperationState> m_state; }; - void onTopWindowChanged(QWasmWindow *window); + void onTopWindowChanged(); void drawWindow(QOpenGLTextureBlitter *blitter, QWasmScreen *screen, const QWasmWindow *window); void drawWindowContent(QOpenGLTextureBlitter *blitter, QWasmScreen *screen, const QWasmWindow *window); diff --git a/src/plugins/platforms/wasm/qwasmwindow.cpp b/src/plugins/platforms/wasm/qwasmwindow.cpp index fd62c63d1b..4e429db65f 100644 --- a/src/plugins/platforms/wasm/qwasmwindow.cpp +++ b/src/plugins/platforms/wasm/qwasmwindow.cpp @@ -421,6 +421,12 @@ bool QWasmWindow::windowIsPopupType(Qt::WindowFlags flags) const void QWasmWindow::requestActivateWindow() { + QWindow *modalWindow; + if (QGuiApplicationPrivate::instance()->isWindowBlocked(window(), &modalWindow)) { + static_cast<QWasmWindow *>(modalWindow->handle())->requestActivateWindow(); + return; + } + if (window()->isTopLevel()) raise(); QPlatformWindow::requestActivateWindow(); diff --git a/src/plugins/platforms/wasm/qwasmwindowstack.cpp b/src/plugins/platforms/wasm/qwasmwindowstack.cpp index 9ce6689c8d..cc1a3cad6a 100644 --- a/src/plugins/platforms/wasm/qwasmwindowstack.cpp +++ b/src/plugins/platforms/wasm/qwasmwindowstack.cpp @@ -18,7 +18,7 @@ void QWasmWasmWindowStack::pushWindow(QWasmWindow *window) m_windowStack.push_back(window); - m_topWindowChangedCallback(window); + m_topWindowChangedCallback(); } void QWasmWasmWindowStack::removeWindow(QWasmWindow *window) @@ -34,7 +34,7 @@ void QWasmWasmWindowStack::removeWindow(QWasmWindow *window) m_windowStack.erase(it); if (removingTop) - m_topWindowChangedCallback(topWindow()); + m_topWindowChangedCallback(); } void QWasmWasmWindowStack::raise(QWasmWindow *window) @@ -46,7 +46,7 @@ void QWasmWasmWindowStack::raise(QWasmWindow *window) auto it = std::find(regularWindowsBegin(), m_windowStack.end(), window); std::rotate(it, it + 1, m_windowStack.end()); - m_topWindowChangedCallback(topWindow()); + m_topWindowChangedCallback(); } void QWasmWasmWindowStack::lower(QWasmWindow *window) @@ -60,7 +60,7 @@ void QWasmWasmWindowStack::lower(QWasmWindow *window) auto it = std::find(regularWindowsBegin(), m_windowStack.end(), window); std::rotate(regularWindowsBegin(), it, it + 1); if (loweringTopWindow && topWindow() != window) - m_topWindowChangedCallback(topWindow()); + m_topWindowChangedCallback(); } QWasmWasmWindowStack::iterator QWasmWasmWindowStack::begin() diff --git a/src/plugins/platforms/wasm/qwasmwindowstack.h b/src/plugins/platforms/wasm/qwasmwindowstack.h index 68ce4a51b7..4193089056 100644 --- a/src/plugins/platforms/wasm/qwasmwindowstack.h +++ b/src/plugins/platforms/wasm/qwasmwindowstack.h @@ -24,7 +24,7 @@ class QWasmWindow; Q_AUTOTEST_EXPORT class QWasmWasmWindowStack { public: - using TopWindowChangedCallbackType = std::function<void(QWasmWindow *window)>; + using TopWindowChangedCallbackType = std::function<void()>; using StorageType = QList<QWasmWindow *>; |