summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMikolaj Boc <mikolaj.boc@qt.io>2022-08-23 14:24:36 +0200
committerMikolaj Boc <mikolaj.boc@qt.io>2022-08-24 17:50:25 +0200
commit11f12521bcd9c76f0ff5c60fb8785aba33ec7ca7 (patch)
tree5cf2eb6ccad5143628146c793f84ae64e2b73261 /src
parent0acb56518d72c09650dd83ca34a7d5bb0763b06a (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.cpp20
-rw-r--r--src/plugins/platforms/wasm/qwasmcompositor.h2
-rw-r--r--src/plugins/platforms/wasm/qwasmwindow.cpp6
-rw-r--r--src/plugins/platforms/wasm/qwasmwindowstack.cpp8
-rw-r--r--src/plugins/platforms/wasm/qwasmwindowstack.h2
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 *>;