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();