Make QCursor::setPos() use the correct screen

setPos() takes a screen argument, however this argument
indicates which cursor should be moved only and is
not usable as an argument to toNativePixels() since
the position may be on a sibling screen.

Add call to QScreen::virtualSiblingAt to get the target
screen.

Task-number: QTBUG-99009
Pick-to: 6.3 6.2 5.15
Change-Id: I8714ebc93a283c58bc67911315f787c484fb0dd8
Reviewed-by: Liang Qi <liang.qi@qt.io>
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
This commit is contained in:
Morten Johan Sørvig 2022-01-05 23:10:33 +01:00
parent 38a66aa53a
commit eef865cdc5
2 changed files with 21 additions and 1 deletions

View File

@ -251,7 +251,8 @@ void QCursor::setPos(QScreen *screen, int x, int y)
{
if (screen) {
if (QPlatformCursor *cursor = screen->handle()->cursor()) {
const QPoint devicePos = QHighDpi::toNativePixels(QPoint(x, y), screen);
const QPoint pos(x, y);
const QPoint devicePos = QHighDpi::toNativePixels(pos, screen->virtualSiblingAt(pos));
// Need to check, since some X servers generate null mouse move
// events, causing looping in applications which call setPos() on
// every mouse move event.

View File

@ -76,6 +76,8 @@ private slots:
void mouseEvents();
void mouseVelocity();
void mouseVelocity_data();
void setCursor();
void setCursor_data();
};
/// Offscreen platform plugin test setup
@ -805,5 +807,22 @@ void tst_QHighDpi::mouseVelocity()
}
}
void tst_QHighDpi::setCursor_data()
{
standardScreenDpiTestData();
}
void tst_QHighDpi::setCursor()
{
QFETCH(QList<qreal>, dpiValues);
std::unique_ptr<QGuiApplication> app(createStandardOffscreenApp(dpiValues));
for (QScreen *screen : app->screens()) {
QPoint center = screen->geometry().center();
QCursor::setPos(center.x(), center.y());
QCOMPARE(QCursor::pos(), center);
}
}
#include "tst_qhighdpi.moc"
QTEST_APPLESS_MAIN(tst_QHighDpi);