From 7b00eab5933cb46061dd15334edd3a083fe446cc Mon Sep 17 00:00:00 2001 From: Oliver Wolff Date: Thu, 13 Sep 2018 15:18:04 +0200 Subject: qwinrtcursor: Use QPointF as much as possible in pos/setPos Using QPoint for calculations can lead to rounding errors which can result in a situation where "QCursor::setPos(somePos); QCOMPARE(pos, somePos)" fails. Change-Id: Iaba499f67abcf5ec66adfe93bfbd79ef0102e6d0 Reviewed-by: Friedemann Kleint --- src/plugins/platforms/winrt/qwinrtcursor.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/plugins/platforms/winrt/qwinrtcursor.cpp b/src/plugins/platforms/winrt/qwinrtcursor.cpp index b73cd3f759..180905945b 100644 --- a/src/plugins/platforms/winrt/qwinrtcursor.cpp +++ b/src/plugins/platforms/winrt/qwinrtcursor.cpp @@ -179,14 +179,15 @@ QPoint QWinRTCursor::pos() const return hr; }); Q_ASSERT_SUCCEEDED(hr); - QPoint position = QPoint(int(point.X), int(point.Y)); + QPointF position(qreal(point.X), qreal(point.Y)); // If no cursor get_PointerPosition returns SHRT_MIN for x and y - if ((position.x() == SHRT_MIN && position.y() == SHRT_MIN) || FAILED(hr)) + if ((int(position.x()) == SHRT_MIN && int(position.y()) == SHRT_MIN) + || FAILED(hr)) return QPointF(Q_INFINITY, Q_INFINITY).toPoint(); - position.rx() -= bounds.X; - position.ry() -= bounds.Y; + position.rx() -= qreal(bounds.X); + position.ry() -= qreal(bounds.Y); position *= screen->scaleFactor(); - return position; + return position.toPoint(); } void QWinRTCursor::setPos(const QPoint &pos) @@ -195,7 +196,7 @@ void QWinRTCursor::setPos(const QPoint &pos) Q_ASSERT(screen); ComPtr coreWindow = screen->coreWindow(); Q_ASSERT(coreWindow); - const QPointF scaledPos = pos / screen->scaleFactor(); + const QPointF scaledPos = QPointF(pos) / screen->scaleFactor(); QWinRTScreen::MousePositionTransition t; HRESULT hr = QEventDispatcherWinRT::runOnXamlThread([coreWindow, scaledPos, &t]() { ComPtr coreWindow2; -- cgit v1.2.3