From 862dae455a7d3fa8cfc82e37563b1e1920751cd4 Mon Sep 17 00:00:00 2001 From: David Edmundson Date: Fri, 24 May 2024 17:49:53 +0300 Subject: [PATCH] effects: Use unique device for replaying events to QQuickView When a new mouse event is made it updates the global position of that device. This causes issues if a mouse event is forwarded with an adjusted position then used afterwards. `QPointingDevice::primaryPointingDevice` creates a new pointer device internally if the seat name does not exist. It is then shared between future usages. BUG: 480864 --- src/effect/offscreenquickview.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/effect/offscreenquickview.cpp b/src/effect/offscreenquickview.cpp index af39755e53..82db66972c 100644 --- a/src/effect/offscreenquickview.cpp +++ b/src/effect/offscreenquickview.cpp @@ -271,13 +271,15 @@ void OffscreenQuickView::forwardMouseEvent(QEvent *e) if (!d->m_visible) { return; } + auto replayDevice = QPointingDevice::primaryPointingDevice("mouseReplayDevice"); switch (e->type()) { case QEvent::MouseMove: case QEvent::MouseButtonPress: case QEvent::MouseButtonRelease: { QMouseEvent *me = static_cast(e); const QPoint widgetPos = d->m_view->mapFromGlobal(me->pos()); - QMouseEvent cloneEvent(me->type(), widgetPos, me->pos(), me->button(), me->buttons(), me->modifiers()); + + QMouseEvent cloneEvent(me->type(), widgetPos, me->pos(), me->button(), me->buttons(), me->modifiers(), replayDevice); cloneEvent.setAccepted(false); QCoreApplication::sendEvent(d->m_view.get(), &cloneEvent); e->setAccepted(cloneEvent.isAccepted()); @@ -289,7 +291,7 @@ void OffscreenQuickView::forwardMouseEvent(QEvent *e) d->lastMousePressButton = me->button(); if (doubleClick) { d->lastMousePressButton = Qt::NoButton; - QMouseEvent doubleClickEvent(QEvent::MouseButtonDblClick, me->localPos(), me->windowPos(), me->screenPos(), me->button(), me->buttons(), me->modifiers()); + QMouseEvent doubleClickEvent(QEvent::MouseButtonDblClick, me->localPos(), me->windowPos(), me->screenPos(), me->button(), me->buttons(), me->modifiers(), replayDevice); QCoreApplication::sendEvent(d->m_view.get(), &doubleClickEvent); } } @@ -312,7 +314,7 @@ void OffscreenQuickView::forwardMouseEvent(QEvent *e) QWheelEvent *we = static_cast(e); const QPointF widgetPos = d->m_view->mapFromGlobal(we->position().toPoint()); QWheelEvent cloneEvent(widgetPos, we->globalPosition(), we->pixelDelta(), we->angleDelta(), we->buttons(), - we->modifiers(), we->phase(), we->inverted()); + we->modifiers(), we->phase(), we->inverted(), Qt::MouseEventNotSynthesized, replayDevice); cloneEvent.setAccepted(false); QCoreApplication::sendEvent(d->m_view.get(), &cloneEvent); e->setAccepted(cloneEvent.isAccepted());