summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms/wasm/qwasmcompositor.cpp
diff options
context:
space:
mode:
authorMikolaj Boc <mikolaj.boc@qt.io>2022-07-20 14:29:06 +0200
committerMikolaj Boc <mikolaj.boc@qt.io>2022-07-27 14:08:08 +0200
commit19507dc6788f252cd0795d80d9a39d22f1306882 (patch)
tree5d8acf4982a0f380afb9addfcc783d86fb8f3bb6 /src/plugins/platforms/wasm/qwasmcompositor.cpp
parent434595865bdeeb4a822621be40b18dfa3179b9c0 (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.cpp67
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;