From aab71c7bb8e47b6e432fa7945bdf19fbce31a2f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tor=20Arne=20Vestb=C3=B8?= Date: Wed, 7 Sep 2022 18:59:40 +0200 Subject: [PATCH] Ensure QHighDpiScaling::set(Screen/Global)Factor() results in QScreen signals MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I328b288b3fd83df0cc81c62bce1d946f90f1cd0d Reviewed-by: Morten Johan Sørvig --- src/gui/kernel/qhighdpiscaling.cpp | 12 ++++--- .../auto/gui/kernel/qhighdpi/tst_qhighdpi.cpp | 32 +++++++++++++++++++ 2 files changed, 40 insertions(+), 4 deletions(-) diff --git a/src/gui/kernel/qhighdpiscaling.cpp b/src/gui/kernel/qhighdpiscaling.cpp index f20bd842637..31626ec2229 100644 --- a/src/gui/kernel/qhighdpiscaling.cpp +++ b/src/gui/kernel/qhighdpiscaling.cpp @@ -541,15 +541,17 @@ void QHighDpiScaling::setGlobalFactor(qreal factor) if (!QGuiApplication::allWindows().isEmpty()) qWarning("QHighDpiScaling::setFactor: Should only be called when no windows exist."); + const auto screens = QGuiApplication::screens(); + + std::vector updateEmitters; + for (QScreen *screen : screens) + updateEmitters.emplace_back(screen); + m_globalScalingActive = !qFuzzyCompare(factor, qreal(1)); m_factor = m_globalScalingActive ? factor : qreal(1); m_active = m_globalScalingActive || m_screenFactorSet || m_platformPluginDpiScalingActive ; - const auto screens = QGuiApplication::screens(); for (QScreen *screen : screens) screen->d_func()->updateGeometry(); - - // FIXME: The geometry has been updated based on the new scale factor, - // but we don't emit any geometry change signals for the screens. } static const char scaleFactorProperty[] = "_q_scaleFactor"; @@ -566,6 +568,8 @@ void QHighDpiScaling::setScreenFactor(QScreen *screen, qreal factor) m_active = true; } + QScreenPrivate::UpdateEmitter updateEmitter(screen); + // Prefer associating the factor with screen name over the object // since the screen object may be deleted on screen disconnects. const QString name = screen->name(); diff --git a/tests/auto/gui/kernel/qhighdpi/tst_qhighdpi.cpp b/tests/auto/gui/kernel/qhighdpi/tst_qhighdpi.cpp index b062a88c1fc..9a2482b03e4 100644 --- a/tests/auto/gui/kernel/qhighdpi/tst_qhighdpi.cpp +++ b/tests/auto/gui/kernel/qhighdpi/tst_qhighdpi.cpp @@ -10,6 +10,7 @@ #include #include #include +#include Q_LOGGING_CATEGORY(lcTests, "qt.gui.tests") @@ -55,6 +56,8 @@ private slots: void mouseVelocity_data(); void setCursor(); void setCursor_data(); + void setGlobalFactorEmits(); + void setScreenFactorEmits(); }; /// Offscreen platform plugin test setup @@ -811,5 +814,34 @@ void tst_QHighDpi::setCursor() } } +void tst_QHighDpi::setGlobalFactorEmits() +{ + QList dpiValues { 96, 96, 96 }; + std::unique_ptr app(createStandardOffscreenApp(dpiValues)); + + std::vector> spies; + for (QScreen *screen : app->screens()) + spies.push_back(std::make_unique(screen, &QScreen::geometryChanged)); + + QHighDpiScaling::setGlobalFactor(2); + + for (const auto &spy : spies) + QCOMPARE(spy->count(), 1); + + QHighDpiScaling::setGlobalFactor(1); +} + +void tst_QHighDpi::setScreenFactorEmits() +{ + QList dpiValues { 96, 96, 96 }; + std::unique_ptr app(createStandardOffscreenApp(dpiValues)); + + for (QScreen *screen : app->screens()) { + QSignalSpy spy(screen, &QScreen::geometryChanged); + QHighDpiScaling::setScreenFactor(screen, 2); + QCOMPARE(spy.count(), 1); + } +} + #include "tst_qhighdpi.moc" QTEST_APPLESS_MAIN(tst_QHighDpi);