summaryrefslogtreecommitdiffstats
path: root/src/plugins
diff options
context:
space:
mode:
authorMikolaj Boc <mikolaj.boc@qt.io>2022-09-09 15:47:40 +0200
committerMikolaj Boc <mikolaj.boc@qt.io>2022-09-20 16:34:57 +0200
commitde560476208d43cf4dbfff45fcd8c6f6847e0631 (patch)
tree5bc0be728fabbd778432d68ae2c8e80df8e4bf2b /src/plugins
parent4a338aa1804a4d812cf1b9bb20274e480e3c8e9c (diff)
Redirect resize from QSizeGrip to system resize in wasm compositor
Using two different resizing techniques (one in QSizeGrip, one in QWasmCompositor) leads to strange behavior while resizing wasm windows. Redirect the QSizeGrip's resize to wasm's compositor resize (which might be considered system resize) to avoid that. Change-Id: Idfc062643caac3ceee879bfb875d943aade28378 Reviewed-by: David Skoland <david.skoland@qt.io> Reviewed-by: Morten Johan Sørvig <morten.sorvig@qt.io>
Diffstat (limited to 'src/plugins')
-rw-r--r--src/plugins/platforms/wasm/qwasmcompositor.cpp38
-rw-r--r--src/plugins/platforms/wasm/qwasmcompositor.h9
-rw-r--r--src/plugins/platforms/wasm/qwasmwindow.cpp7
-rw-r--r--src/plugins/platforms/wasm/qwasmwindow.h1
4 files changed, 55 insertions, 0 deletions
diff --git a/src/plugins/platforms/wasm/qwasmcompositor.cpp b/src/plugins/platforms/wasm/qwasmcompositor.cpp
index 8ba67040a5..8af49c5fc3 100644
--- a/src/plugins/platforms/wasm/qwasmcompositor.cpp
+++ b/src/plugins/platforms/wasm/qwasmcompositor.cpp
@@ -168,6 +168,11 @@ void QWasmCompositor::setEnabled(bool enabled)
m_isEnabled = enabled;
}
+void QWasmCompositor::startResize(Qt::Edges edges)
+{
+ m_windowManipulation.startResize(edges);
+}
+
void QWasmCompositor::addWindow(QWasmWindow *window)
{
m_windowVisibility.insert(window, false);
@@ -788,6 +793,11 @@ void QWasmCompositor::WindowManipulation::onPointerDown(
void QWasmCompositor::WindowManipulation::onPointerMove(
const PointerEvent& event)
{
+ m_systemDragInitData = {
+ .lastMouseMovePoint = m_screen->clipPoint(event.point),
+ .lastMousePointerId = event.pointerId,
+ };
+
if (operation() == Operation::None || event.pointerId != m_state->pointerId)
return;
@@ -822,6 +832,34 @@ void QWasmCompositor::WindowManipulation::onPointerUp(const PointerEvent& event)
m_state.reset();
}
+void QWasmCompositor::WindowManipulation::startResize(Qt::Edges edges)
+{
+ Q_ASSERT_X(operation() == Operation::None, Q_FUNC_INFO,
+ "Resize must not start anew when one is in progress");
+
+ auto *window = m_screen->compositor()->windowAt(m_systemDragInitData.lastMouseMovePoint);
+ if (Q_UNLIKELY(!window))
+ return;
+
+ m_state.reset(new OperationState{
+ .pointerId = m_systemDragInitData.lastMousePointerId,
+ .window = window,
+ .operationSpecific =
+ ResizeState{
+ .m_resizeEdges = edges,
+ .m_originInScreenCoords = m_systemDragInitData.lastMouseMovePoint,
+ .m_initialWindowBounds = window->geometry(),
+ .m_minShrink =
+ QPoint(window->minimumWidth() - window->geometry().width(),
+ window->minimumHeight() - window->geometry().height()),
+ .m_maxGrow =
+ QPoint(window->maximumWidth() - window->geometry().width(),
+ window->maximumHeight() - window->geometry().height()),
+ },
+ });
+ m_screen->canvas().call<void>("setPointerCapture", m_systemDragInitData.lastMousePointerId);
+}
+
bool QWasmCompositor::processKeyboard(int eventType, const EmscriptenKeyboardEvent *emKeyEvent)
{
constexpr bool ProceedToNativeEvent = false;
diff --git a/src/plugins/platforms/wasm/qwasmcompositor.h b/src/plugins/platforms/wasm/qwasmcompositor.h
index b2bb51fc52..07bce77a94 100644
--- a/src/plugins/platforms/wasm/qwasmcompositor.h
+++ b/src/plugins/platforms/wasm/qwasmcompositor.h
@@ -57,6 +57,7 @@ public:
};
void setEnabled(bool enabled);
+ void startResize(Qt::Edges edges);
void addWindow(QWasmWindow *window);
void removeWindow(QWasmWindow *window);
@@ -108,6 +109,7 @@ private:
void onPointerDown(const PointerEvent& event, QWindow* windowAtPoint);
void onPointerMove(const PointerEvent& event);
void onPointerUp(const PointerEvent& event);
+ void startResize(Qt::Edges edges);
Operation operation() const;
@@ -128,11 +130,18 @@ private:
QPointer<QWindow> window;
std::variant<ResizeState, MoveState> operationSpecific;
};
+ struct SystemDragInitData
+ {
+ QPoint lastMouseMovePoint;
+ int lastMousePointerId = -1;
+ };
void resizeWindow(const QPoint& amount);
+ ResizeState makeResizeState(Qt::Edges edges, const QPoint &startPoint, QWindow *window);
QWasmScreen *m_screen;
+ SystemDragInitData m_systemDragInitData;
std::unique_ptr<OperationState> m_state;
};
diff --git a/src/plugins/platforms/wasm/qwasmwindow.cpp b/src/plugins/platforms/wasm/qwasmwindow.cpp
index 8e3bc3f72c..0ba7f44684 100644
--- a/src/plugins/platforms/wasm/qwasmwindow.cpp
+++ b/src/plugins/platforms/wasm/qwasmwindow.cpp
@@ -212,6 +212,13 @@ void QWasmWindow::propagateSizeHints()
}
}
+bool QWasmWindow::startSystemResize(Qt::Edges edges)
+{
+ m_compositor->startResize(edges);
+
+ return true;
+}
+
void QWasmWindow::injectMousePressed(const QPoint &local, const QPoint &global,
Qt::MouseButton button, Qt::KeyboardModifiers mods)
{
diff --git a/src/plugins/platforms/wasm/qwasmwindow.h b/src/plugins/platforms/wasm/qwasmwindow.h
index 0148dc7d62..c86026cf1b 100644
--- a/src/plugins/platforms/wasm/qwasmwindow.h
+++ b/src/plugins/platforms/wasm/qwasmwindow.h
@@ -56,6 +56,7 @@ public:
Qt::MouseButton button, Qt::KeyboardModifiers mods);
void injectMouseReleased(const QPoint &local, const QPoint &global,
Qt::MouseButton button, Qt::KeyboardModifiers mods);
+ bool startSystemResize(Qt::Edges edges) final;
bool isPointOnTitle(QPoint point) const;
bool isPointOnResizeRegion(QPoint point) const;