From a0b34a86b684d36fed5d11ce063b2629fd4e4598 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tor=20Arne=20Vestb=C3=B8?= Date: Wed, 7 Sep 2022 15:17:32 +0200 Subject: [PATCH] Move QPlatformScreen::deviceIndependentGeometry() logic to QScreen Having the logic in QPlatformScreen was inconsistent with how the high-DPI scaling logic sits on top of the platform layer, and also made the implementation of QScreenPrivate::updateHighDpi() a bit inconsistent in how the geometry vs available geometry was resolved. Change-Id: I683ab34dfc8579e2c887cb8fe3059c9c9fdb71a7 Reviewed-by: Volker Hilsheimer --- src/gui/kernel/qplatformscreen.cpp | 7 ------- src/gui/kernel/qplatformscreen.h | 3 --- src/gui/kernel/qscreen.cpp | 6 ++++-- src/plugins/platforms/xcb/qxcbwindow.cpp | 4 +++- 4 files changed, 7 insertions(+), 13 deletions(-) diff --git a/src/gui/kernel/qplatformscreen.cpp b/src/gui/kernel/qplatformscreen.cpp index fd9b63c450..9e038b4032 100644 --- a/src/gui/kernel/qplatformscreen.cpp +++ b/src/gui/kernel/qplatformscreen.cpp @@ -435,13 +435,6 @@ QRect QPlatformScreen::mapBetween(Qt::ScreenOrientation a, Qt::ScreenOrientation return rect; } -QRect QPlatformScreen::deviceIndependentGeometry() const -{ - qreal scaleFactor = QHighDpiScaling::factor(this); - QRect nativeGeometry = geometry(); - return QRect(nativeGeometry.topLeft(), QHighDpi::fromNative(nativeGeometry.size(), scaleFactor)); -} - /*! Returns a hint about this screen's subpixel layout structure. diff --git a/src/gui/kernel/qplatformscreen.h b/src/gui/kernel/qplatformscreen.h index ca828171ff..3ef5798aa1 100644 --- a/src/gui/kernel/qplatformscreen.h +++ b/src/gui/kernel/qplatformscreen.h @@ -124,9 +124,6 @@ public: static QTransform transformBetween(Qt::ScreenOrientation a, Qt::ScreenOrientation b, const QRect &target); static QRect mapBetween(Qt::ScreenOrientation a, Qt::ScreenOrientation b, const QRect &rect); - // The platform screen's geometry in device independent coordinates - QRect deviceIndependentGeometry() const; - static QDpi overrideDpi(const QDpi &in); protected: diff --git a/src/gui/kernel/qscreen.cpp b/src/gui/kernel/qscreen.cpp index 601d2f1718..c8e5c98f45 100644 --- a/src/gui/kernel/qscreen.cpp +++ b/src/gui/kernel/qscreen.cpp @@ -91,8 +91,10 @@ void QScreenPrivate::setPlatformScreen(QPlatformScreen *screen) void QScreenPrivate::updateHighDpi() { - geometry = platformScreen->deviceIndependentGeometry(); - availableGeometry = QHighDpi::fromNative(platformScreen->availableGeometry(), QHighDpiScaling::factor(platformScreen), geometry.topLeft()); + qreal scaleFactor = QHighDpiScaling::factor(platformScreen); + QRect nativeGeometry = platformScreen->geometry(); + geometry = QRect(nativeGeometry.topLeft(), QHighDpi::fromNative(nativeGeometry.size(), scaleFactor)); + availableGeometry = QHighDpi::fromNative(platformScreen->availableGeometry(), scaleFactor, geometry.topLeft()); } /*! diff --git a/src/plugins/platforms/xcb/qxcbwindow.cpp b/src/plugins/platforms/xcb/qxcbwindow.cpp index a37c03cc60..7ea0b3a29b 100644 --- a/src/plugins/platforms/xcb/qxcbwindow.cpp +++ b/src/plugins/platforms/xcb/qxcbwindow.cpp @@ -97,9 +97,11 @@ QXcbScreen *QXcbWindow::parentScreen() return parent() ? static_cast(parent())->parentScreen() : xcbScreen(); } -//QPlatformWindow::screenForGeometry version that uses deviceIndependentGeometry QXcbScreen *QXcbWindow::initialScreen() const { + // Resolve initial screen via QWindowPrivate::screenForGeometry(), + // which works in platform independent coordinates, as opposed to + // QPlatformWindow::screenForGeometry() that uses native coordinates. QWindowPrivate *windowPrivate = qt_window_private(window()); QScreen *screen = windowPrivate->screenForGeometry(window()->geometry()); return static_cast(screen->handle());