Fix highdpi conversion of QTabletEvent coordinates on xcb

Amends 1535fc9fb9 : 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.

Pick-to: 6.0
Pick-to: 5.15
Pick-to: 5.12
Task-number: QTBUG-77826
Change-Id: Ic8743b9e5c4041065f530ed1d9d6c49337b0207a
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
Reviewed-by: Morten Johan Sørvig <morten.sorvig@qt.io>
bb10
Shawn Rutledge 2020-12-04 10:28:26 +01:00
parent ae3594436b
commit 9d51fb579b
1 changed files with 2 additions and 4 deletions

View File

@ -1286,16 +1286,14 @@ 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)));
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)));
local.setY(xcbWindow->mapFromGlobalF(global).y());
}
break;
case QXcbAtom::AbsPressure: