From 776734576c2ba7bd4bdba6e09bc5dad5e093670a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Morten=20Johan=20S=C3=B8rvig?= Date: Tue, 16 Mar 2021 17:17:53 +0100 Subject: [PATCH] Call updateHighDpiScaling() on screenAdded() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit QHighDpiScaling has two init/update functions: - initHighDpiScaling(): called once during QGuiApplication construction - updateHighDpiScaling(): called whenever (relevant) screen configuration changes Currently the calls to updateHighDpiScaling() are made from multiple places including platform code. Simplify by calling it from two locations: - QWindowSystemInterface::handleScreenAdded() - QGuiApplicationPrivate::processScreenLogicalDotsPerInchChange() Replace comment about early calls to qt_defaultDpi with a test which calls qt_defaultDpiX/Y with no screens attached. (Looking at the qt_defaultDpiX() implementation, it is unlikely that there will be a problem as long as updateHighDpiScaling() is called before QGuiApplication::primaryScreen() starts returning a non-null value.) Change-Id: I447db42894617495843a5cb531a1322b000fed62 Reviewed-by: Tor Arne Vestbø --- src/gui/kernel/qguiapplication.cpp | 15 --------------- src/gui/kernel/qguiapplication_p.h | 1 - src/gui/kernel/qwindowsysteminterface.cpp | 1 + src/plugins/platforms/windows/qwindowsscreen.cpp | 1 - .../platforms/xcb/qxcbconnection_screens.cpp | 1 - tests/auto/gui/kernel/qhighdpi/tst_qhighdpi.cpp | 10 ++++++++++ 6 files changed, 11 insertions(+), 18 deletions(-) diff --git a/src/gui/kernel/qguiapplication.cpp b/src/gui/kernel/qguiapplication.cpp index 247d9a8d1b7..114beb6dde6 100644 --- a/src/gui/kernel/qguiapplication.cpp +++ b/src/gui/kernel/qguiapplication.cpp @@ -153,8 +153,6 @@ Qt::ApplicationState QGuiApplicationPrivate::applicationState = Qt::ApplicationI Qt::HighDpiScaleFactorRoundingPolicy QGuiApplicationPrivate::highDpiScaleFactorRoundingPolicy = Qt::HighDpiScaleFactorRoundingPolicy::PassThrough; -bool QGuiApplicationPrivate::highDpiScalingUpdated = false; - QPointer QGuiApplicationPrivate::currentDragWindow; QList QGuiApplicationPrivate::tabletDevicePoints; // TODO remove @@ -709,7 +707,6 @@ QGuiApplication::~QGuiApplication() QGuiApplicationPrivate::lastCursorPosition = {qreal(qInf()), qreal(qInf())}; QGuiApplicationPrivate::currentMousePressWindow = QGuiApplicationPrivate::currentMouseWindow = nullptr; QGuiApplicationPrivate::applicationState = Qt::ApplicationInactive; - QGuiApplicationPrivate::highDpiScalingUpdated = false; QGuiApplicationPrivate::currentDragWindow = nullptr; QGuiApplicationPrivate::tabletDevicePoints.clear(); } @@ -1245,13 +1242,6 @@ static void init_platform(const QString &pluginNamesWithArguments, const QString return; } - // Many platforms have created QScreens at this point. Finish initializing - // QHighDpiScaling to be prepared for early calls to qt_defaultDpi(). - if (QGuiApplication::primaryScreen()) { - QGuiApplicationPrivate::highDpiScalingUpdated = true; - QHighDpiScaling::updateHighDpiScaling(); - } - // Create the platform theme: // 1) Fetch the platform name from the environment if present. @@ -1526,11 +1516,6 @@ void QGuiApplicationPrivate::eventDispatcherReady() createPlatformIntegration(); platform_integration->initialize(); - - // All platforms should have added screens at this point. Finish - // QHighDpiScaling initialization if it has not been done so already. - if (!QGuiApplicationPrivate::highDpiScalingUpdated) - QHighDpiScaling::updateHighDpiScaling(); } void QGuiApplicationPrivate::init() diff --git a/src/gui/kernel/qguiapplication_p.h b/src/gui/kernel/qguiapplication_p.h index 57f1b1cc47a..39bc5f36a46 100644 --- a/src/gui/kernel/qguiapplication_p.h +++ b/src/gui/kernel/qguiapplication_p.h @@ -233,7 +233,6 @@ public: static QWindow *currentMousePressWindow; static Qt::ApplicationState applicationState; static Qt::HighDpiScaleFactorRoundingPolicy highDpiScaleFactorRoundingPolicy; - static bool highDpiScalingUpdated; static QPointer currentDragWindow; // TODO remove this: QPointingDevice can store what we need directly diff --git a/src/gui/kernel/qwindowsysteminterface.cpp b/src/gui/kernel/qwindowsysteminterface.cpp index dcce42ffe0e..58bb0f1cc99 100644 --- a/src/gui/kernel/qwindowsysteminterface.cpp +++ b/src/gui/kernel/qwindowsysteminterface.cpp @@ -788,6 +788,7 @@ void QWindowSystemInterface::handleScreenAdded(QPlatformScreen *ps, bool isPrima QGuiApplicationPrivate::screen_list.append(screen); QGuiApplicationPrivate::resetCachedDevicePixelRatio(); + QHighDpiScaling::updateHighDpiScaling(); emit qGuiApp->screenAdded(screen); diff --git a/src/plugins/platforms/windows/qwindowsscreen.cpp b/src/plugins/platforms/windows/qwindowsscreen.cpp index 19557bfcd05..2544dd6200c 100644 --- a/src/plugins/platforms/windows/qwindowsscreen.cpp +++ b/src/plugins/platforms/windows/qwindowsscreen.cpp @@ -641,7 +641,6 @@ bool QWindowsScreenManager::handleScreenChanges() if (auto theme = QWindowsTheme::instance()) // QTBUG-85734/Wine theme->refreshFonts(); } - QHighDpiScaling::updateHighDpiScaling(); return true; } diff --git a/src/plugins/platforms/xcb/qxcbconnection_screens.cpp b/src/plugins/platforms/xcb/qxcbconnection_screens.cpp index 2e488266354..867bbef020d 100644 --- a/src/plugins/platforms/xcb/qxcbconnection_screens.cpp +++ b/src/plugins/platforms/xcb/qxcbconnection_screens.cpp @@ -156,7 +156,6 @@ void QXcbConnection::updateScreens(const xcb_randr_notify_event_t *event) screen = createScreen(virtualDesktop, output, outputInfo.get()); qCDebug(lcQpaScreen) << "output" << screen->name() << "is connected and enabled"; } - QHighDpiScaling::updateHighDpiScaling(); } } else if (screen) { if (output.crtc == XCB_NONE && output.mode == XCB_NONE) { diff --git a/tests/auto/gui/kernel/qhighdpi/tst_qhighdpi.cpp b/tests/auto/gui/kernel/qhighdpi/tst_qhighdpi.cpp index 31a41eeff64..4082611a0a9 100644 --- a/tests/auto/gui/kernel/qhighdpi/tst_qhighdpi.cpp +++ b/tests/auto/gui/kernel/qhighdpi/tst_qhighdpi.cpp @@ -314,6 +314,11 @@ void tst_QHighDpi::minimumDpr() } } +QT_BEGIN_NAMESPACE +extern int qt_defaultDpiX(); +extern int qt_defaultDpiY(); +QT_END_NAMESPACE + void tst_QHighDpi::noscreens() { // Create application object with a no-screens configuration (should not crash) @@ -321,6 +326,11 @@ void tst_QHighDpi::noscreens() std::unique_ptr app(createStandardOffscreenApp(noScreens)); QCOMPARE(qApp->devicePixelRatio(), 1); + + // Test calling qt_defaultDpiX/Y: These may be called early during QGuiApplication + // initialization, before the platform plugin has created screen objects. They + // should then 1) not crash and 2) return some default value. + QCOMPARE(qt_defaultDpiX(), qt_defaultDpiY()); } void tst_QHighDpi::screenAt_data()