diff options
| author | Mikolaj Boc <mikolaj.boc@qt.io> | 2022-07-20 14:29:06 +0200 |
|---|---|---|
| committer | Mikolaj Boc <mikolaj.boc@qt.io> | 2022-07-27 14:08:08 +0200 |
| commit | 19507dc6788f252cd0795d80d9a39d22f1306882 (patch) | |
| tree | 5d8acf4982a0f380afb9addfcc783d86fb8f3bb6 /src/plugins/platforms/wasm/qwasmcompositor.cpp | |
| parent | 434595865bdeeb4a822621be40b18dfa3179b9c0 (diff) | |
Deliver non-client area mouse events to WASM windows
QWasmCompositor now delivers non-client area mouse events to windows as
it should, which fixes a lot of issues with window manipulation. One of
such issues is re-docking of dock widgets.
Fixes: QTBUG-105092
Change-Id: I9de45b7e1b1a80b64387031eb0cc0b31a4be2571
Reviewed-by: Lorn Potter <lorn.potter@gmail.com>
Diffstat (limited to 'src/plugins/platforms/wasm/qwasmcompositor.cpp')
| -rw-r--r-- | src/plugins/platforms/wasm/qwasmcompositor.cpp | 67 |
1 files changed, 42 insertions, 25 deletions
diff --git a/src/plugins/platforms/wasm/qwasmcompositor.cpp b/src/plugins/platforms/wasm/qwasmcompositor.cpp index 85c27834393..f804542b34d 100644 --- a/src/plugins/platforms/wasm/qwasmcompositor.cpp +++ b/src/plugins/platforms/wasm/qwasmcompositor.cpp @@ -939,8 +939,6 @@ bool QWasmCompositor::processPointer(const PointerEvent& event) const QPoint targetPointInScreenCoords = screen()->geometry().topLeft() + event.point; - QEvent::Type buttonEventType = QEvent::None; - QWindow *const targetWindow = ([this, &targetPointInScreenCoords]() -> QWindow * { auto *targetWindow = m_windowManipulation.operation() == WindowManipulation::Operation::None ? @@ -968,7 +966,6 @@ bool QWasmCompositor::processPointer(const PointerEvent& event) switch (event.type) { case EventType::PointerDown: { - buttonEventType = QEvent::MouseButtonPress; if (targetWindow) targetWindow->requestActivate(); @@ -981,8 +978,6 @@ bool QWasmCompositor::processPointer(const PointerEvent& event) } case EventType::PointerUp: { - buttonEventType = QEvent::MouseButtonRelease; - m_windowManipulation.onPointerUp(event); if (m_pressedWindow) { @@ -997,8 +992,6 @@ bool QWasmCompositor::processPointer(const PointerEvent& event) } case EventType::PointerMove: { - buttonEventType = QEvent::MouseMove; - if (wasmTargetWindow && event.mouseButtons.testFlag(Qt::NoButton)) { const bool isOnResizeRegion = wasmTargetWindow->isPointOnResizeRegion(targetPointInScreenCoords); @@ -1033,22 +1026,49 @@ bool QWasmCompositor::processPointer(const PointerEvent& event) leaveWindow(m_lastMouseTargetWindow); } - bool shouldDeliverEvent = pointerIsWithinTargetWindowBounds; - QWindow *eventTarget = targetWindow; - if (!eventTarget && event.type == EventType::PointerUp) { + const bool eventAccepted = deliverEventToTarget(event, targetWindow); + if (!eventAccepted && event.type == EventType::PointerDown) + QGuiApplicationPrivate::instance()->closeAllPopups(); + return eventAccepted; +} + +bool QWasmCompositor::deliverEventToTarget(const PointerEvent &event, QWindow *eventTarget) +{ + const QPoint pointInScreenCoords = screen()->geometry().topLeft() + event.point; + const QPoint targetPointClippedToScreen( + std::max(screen()->geometry().left(), + std::min(screen()->geometry().right(), pointInScreenCoords.x())), + std::max(screen()->geometry().top(), + std::min(screen()->geometry().bottom(), pointInScreenCoords.y()))); + + bool deliveringToPreviouslyClickedWindow = false; + + if (!eventTarget) { + if (event.type != EventType::PointerUp || !m_lastMouseTargetWindow) + return false; + eventTarget = m_lastMouseTargetWindow; m_lastMouseTargetWindow = nullptr; - shouldDeliverEvent = true; + deliveringToPreviouslyClickedWindow = true; } - const bool eventAccepted = - eventTarget != nullptr && shouldDeliverEvent && - QWindowSystemInterface::handleMouseEvent<QWindowSystemInterface::SynchronousDelivery>( - eventTarget, QWasmIntegration::getTimestamp(), pointInTargetWindowCoords, targetPointInScreenCoords, - event.mouseButtons, event.mouseButton, buttonEventType, event.modifiers); - if (!eventAccepted && event.type == EventType::PointerDown) - QGuiApplicationPrivate::instance()->closeAllPopups(); - return eventAccepted; + WindowArea windowArea = WindowArea::Client; + if (!eventTarget->geometry().contains(targetPointClippedToScreen) + && !deliveringToPreviouslyClickedWindow) { + if (!eventTarget->frameGeometry().contains(targetPointClippedToScreen)) + return false; + windowArea = WindowArea::NonClient; + } + + const QEvent::Type eventType = + MouseEvent::mouseEventTypeFromEventType(event.type, windowArea); + + return eventType != QEvent::None && + QWindowSystemInterface::handleMouseEvent<QWindowSystemInterface::SynchronousDelivery>( + eventTarget, QWasmIntegration::getTimestamp(), + eventTarget->mapFromGlobal(targetPointClippedToScreen), + targetPointClippedToScreen, event.mouseButtons, event.mouseButton, + eventType, event.modifiers); } QWasmCompositor::WindowManipulation::WindowManipulation(QWasmScreen *screen) @@ -1124,14 +1144,10 @@ void QWasmCompositor::WindowManipulation::onPointerMove( if (operation() == Operation::None || event.pointerId != m_state->pointerId) return; - const auto pointInScreenCoords = m_screen->geometry().topLeft() + event.point; - switch (operation()) { case Operation::Move: { - const QPoint targetPointClippedToScreen( - std::max(m_screen->geometry().left(), std::min(m_screen->geometry().right(), pointInScreenCoords.x())), - std::max(m_screen->geometry().top(), std::min(m_screen->geometry().bottom(), pointInScreenCoords.y()))); - + const QPoint targetPointClippedToScreen = + m_screen->translateAndClipGlobalPoint(event.point); const QPoint difference = targetPointClippedToScreen - std::get<MoveState>(m_state->operationSpecific).m_lastPointInScreenCoords; @@ -1141,6 +1157,7 @@ void QWasmCompositor::WindowManipulation::onPointerMove( break; } case Operation::Resize: { + const auto pointInScreenCoords = m_screen->geometry().topLeft() + event.point; resizeWindow(pointInScreenCoords - std::get<ResizeState>(m_state->operationSpecific).m_originInScreenCoords); break; |
