From bf06976ef0d1073df2ced481bfbdf3faae9bf2c4 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Tue, 19 Jul 2022 17:57:08 +0000 Subject: [PATCH] Revert "Drop call to setPlatformScreen in QHighDpiScaling::setScreenFactor" MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 7b2ae3faab15913e006ece25d785e6a8453dd27a. Reason for revert: this breaks multi-monitor XCB with HighDPI. Fixes: QTBUG-105079 Change-Id: I386c9480c33d1f67b3478332c8e03fe3eeeeee39 Reviewed-by: Tor Arne Vestbø Reviewed-by: Fushan Wen (cherry picked from commit 392566cf61204dd28be0a6f2a252f9b5bd064e00) Reviewed-by: Qt Cherry-pick Bot --- src/gui/kernel/qhighdpiscaling.cpp | 3 ++- src/gui/kernel/qplatformscreen.h | 2 +- src/gui/kernel/qscreen.cpp | 40 +++++++++++++++--------------- src/gui/kernel/qscreen_p.h | 2 +- 4 files changed, 24 insertions(+), 23 deletions(-) diff --git a/src/gui/kernel/qhighdpiscaling.cpp b/src/gui/kernel/qhighdpiscaling.cpp index 2f759158ee6..8d6bb625944 100644 --- a/src/gui/kernel/qhighdpiscaling.cpp +++ b/src/gui/kernel/qhighdpiscaling.cpp @@ -555,8 +555,9 @@ void QHighDpiScaling::setScreenFactor(QScreen *screen, qreal factor) else QHighDpiScaling::m_namedScreenScaleFactors.insert(name, factor); + // hack to force re-evaluation of screen geometry if (screen->handle()) - screen->d_func()->updateLogicalDpi(); + screen->d_func()->setPlatformScreen(screen->handle()); // updates geometries based on scale factor } QPoint QHighDpiScaling::mapPositionToNative(const QPoint &pos, const QPlatformScreen *platformScreen) diff --git a/src/gui/kernel/qplatformscreen.h b/src/gui/kernel/qplatformscreen.h index 1d8e1036066..ca828171ff7 100644 --- a/src/gui/kernel/qplatformscreen.h +++ b/src/gui/kernel/qplatformscreen.h @@ -135,7 +135,7 @@ protected: QScopedPointer d_ptr; private: - friend QScreen; + friend class QScreenPrivate; }; // Qt doesn't currently support running with no platform screen diff --git a/src/gui/kernel/qscreen.cpp b/src/gui/kernel/qscreen.cpp index cb4615e0ed1..2b22816e3e6 100644 --- a/src/gui/kernel/qscreen.cpp +++ b/src/gui/kernel/qscreen.cpp @@ -41,26 +41,7 @@ QScreen::QScreen(QPlatformScreen *screen) : QObject(*new QScreenPrivate(), nullptr) { Q_D(QScreen); - d->platformScreen = screen; - d->platformScreen->d_func()->screen = this; - d->orientation = d->platformScreen->orientation(); - - d->logicalDpi = QPlatformScreen::overrideDpi(d->platformScreen->logicalDpi()); - - d->refreshRate = d->platformScreen->refreshRate(); - // safeguard ourselves against buggy platform behavior... - if (d->refreshRate < 1.0) - d->refreshRate = 60.0; - - d->updateHighDpi(); - d->updatePrimaryOrientation(); // derived from the geometry -} - -void QScreenPrivate::updateLogicalDpi() -{ - Q_Q(QScreen); - logicalDpi = QPlatformScreen::overrideDpi(q->handle()->logicalDpi()); - updateGeometriesWithSignals(); // updates geometries based on scale factor + d->setPlatformScreen(screen); } void QScreenPrivate::updateGeometriesWithSignals() @@ -90,6 +71,25 @@ void QScreenPrivate::emitGeometryChangeSignals(bool geometryChanged, bool availa emit q->physicalDotsPerInchChanged(q->physicalDotsPerInch()); } +void QScreenPrivate::setPlatformScreen(QPlatformScreen *screen) +{ + Q_Q(QScreen); + platformScreen = screen; + platformScreen->d_func()->screen = q; + orientation = platformScreen->orientation(); + + logicalDpi = QPlatformScreen::overrideDpi(platformScreen->logicalDpi()); + + refreshRate = platformScreen->refreshRate(); + // safeguard ourselves against buggy platform behavior... + if (refreshRate < 1.0) + refreshRate = 60.0; + + updateHighDpi(); + updatePrimaryOrientation(); // derived from the geometry +} + + /*! Destroys the screen. */ diff --git a/src/gui/kernel/qscreen_p.h b/src/gui/kernel/qscreen_p.h index 9d7ab504b27..1ba0c7c4421 100644 --- a/src/gui/kernel/qscreen_p.h +++ b/src/gui/kernel/qscreen_p.h @@ -28,12 +28,12 @@ class QScreenPrivate : public QObjectPrivate { Q_DECLARE_PUBLIC(QScreen) public: + void setPlatformScreen(QPlatformScreen *screen); void updateHighDpi() { geometry = platformScreen->deviceIndependentGeometry(); availableGeometry = QHighDpi::fromNative(platformScreen->availableGeometry(), QHighDpiScaling::factor(platformScreen), geometry.topLeft()); } - void updateLogicalDpi(); void updatePrimaryOrientation(); void updateGeometriesWithSignals();