diff options
-rw-r--r-- | src/plugins/platforms/wasm/qwasmcompositor.cpp | 38 | ||||
-rw-r--r-- | src/plugins/platforms/wasm/qwasmcompositor.h | 9 | ||||
-rw-r--r-- | src/plugins/platforms/wasm/qwasmwindow.cpp | 7 | ||||
-rw-r--r-- | src/plugins/platforms/wasm/qwasmwindow.h | 1 |
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; |