summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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;