summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMorten Johan Sørvig <morten.sorvig@qt.io>2021-03-16 17:17:53 +0100
committerMorten Johan Sørvig <morten.sorvig@qt.io>2021-04-28 18:23:39 +0200
commit776734576c2ba7bd4bdba6e09bc5dad5e093670a (patch)
tree028b1e49034726bf3c26e3040af4dffad191312d
parentdd24b61d355cad2cbd29c82fc30b2335b059a187 (diff)
Call updateHighDpiScaling() on screenAdded()
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ø <tor.arne.vestbo@qt.io>
-rw-r--r--src/gui/kernel/qguiapplication.cpp15
-rw-r--r--src/gui/kernel/qguiapplication_p.h1
-rw-r--r--src/gui/kernel/qwindowsysteminterface.cpp1
-rw-r--r--src/plugins/platforms/windows/qwindowsscreen.cpp1
-rw-r--r--src/plugins/platforms/xcb/qxcbconnection_screens.cpp1
-rw-r--r--tests/auto/gui/kernel/qhighdpi/tst_qhighdpi.cpp10
6 files changed, 11 insertions, 18 deletions
diff --git a/src/gui/kernel/qguiapplication.cpp b/src/gui/kernel/qguiapplication.cpp
index 247d9a8d1b..114beb6dde 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<QWindow> QGuiApplicationPrivate::currentDragWindow;
QList<QGuiApplicationPrivate::TabletPointData> 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 57f1b1cc47..39bc5f36a4 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<QWindow> 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 dcce42ffe0..58bb0f1cc9 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 19557bfcd0..2544dd6200 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 2e48826635..867bbef020 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 31a41eeff6..4082611a0a 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<QGuiApplication> 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()