From 815d6c2192ea647dd2edc334c3bd0c69a8a18fe6 Mon Sep 17 00:00:00 2001 From: Wei Wei Date: Wed, 24 May 2023 10:58:09 +0800 Subject: [PATCH] Fix highdpi conversion of QTabletEvent coordinates on xcb when high-dpi scaling is enabled, there was an offset from the cursor position to the event position, because QWindow::mapFromGlobal() works in device-independent pixels, but we are using actual screen pixels here. Task-number: QTBUG-77826 Backport from upstream: Change-Id: Ic8743b9e5c4041065f530ed1d9d6c49337b0207a Commit: 9d51fb579bb4655f6740096f17f1ced50258c28f --- src/gui/kernel/qplatformwindow.cpp | 7 +++++++ src/gui/kernel/qplatformwindow.h | 1 + src/plugins/platforms/xcb/qxcbconnection_xi2.cpp | 8 ++++---- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/gui/kernel/qplatformwindow.cpp b/src/gui/kernel/qplatformwindow.cpp index 7207ff4d..dfbd7d50 100644 --- a/src/gui/kernel/qplatformwindow.cpp +++ b/src/gui/kernel/qplatformwindow.cpp @@ -266,6 +266,13 @@ QPoint QPlatformWindow::mapToGlobal(const QPoint &pos) const return result; } +QPointF QPlatformWindow::mapFromGlobalF(const QPointF &pos) const +{ + const QPoint posPt = pos.toPoint(); + const QPointF delta = pos - posPt; + return mapFromGlobal(posPt) + delta; +} + /*! Translates the global screen coordinate \a pos to window coordinates using native methods. This is required for embedded windows, diff --git a/src/gui/kernel/qplatformwindow.h b/src/gui/kernel/qplatformwindow.h index 7b85090c..a92de4ef 100644 --- a/src/gui/kernel/qplatformwindow.h +++ b/src/gui/kernel/qplatformwindow.h @@ -114,6 +114,7 @@ public: virtual bool isForeignWindow() const { return false; }; virtual QPoint mapToGlobal(const QPoint &pos) const; virtual QPoint mapFromGlobal(const QPoint &pos) const; + QPointF mapFromGlobalF(const QPointF &pos) const; virtual void propagateSizeHints(); diff --git a/src/plugins/platforms/xcb/qxcbconnection_xi2.cpp b/src/plugins/platforms/xcb/qxcbconnection_xi2.cpp index a9455eca..954a1f42 100644 --- a/src/plugins/platforms/xcb/qxcbconnection_xi2.cpp +++ b/src/plugins/platforms/xcb/qxcbconnection_xi2.cpp @@ -1270,16 +1270,16 @@ void QXcbConnection::xi2ReportTabletEvent(const void *event, TabletData *tabletD if (Q_LIKELY(useValuators)) { const qreal value = scaleOneValuator(normalizedValue, physicalScreenArea.x(), physicalScreenArea.width()); global.setX(value); - // mapFromGlobal is ok for nested/embedded windows, but works only with whole-number QPoint; - // so map it first, then add back the sub-pixel position - local.setX(window->mapFromGlobal(QPoint(int(value), 0)).x() + (value - int(value))); + //! \note Fix QTBUG-77826 + local.setX(xcbWindow->mapFromGlobalF(global).x()); } break; case QXcbAtom::AbsY: if (Q_LIKELY(useValuators)) { qreal value = scaleOneValuator(normalizedValue, physicalScreenArea.y(), physicalScreenArea.height()); global.setY(value); - local.setY(window->mapFromGlobal(QPoint(0, int(value))).y() + (value - int(value))); + //! \note Fix QTBUG-77826 + local.setY(xcbWindow->mapFromGlobalF(global).y()); } break; case QXcbAtom::AbsPressure: