diff options
Diffstat (limited to 'src/gui/kernel/qhighdpiscaling.cpp')
-rw-r--r-- | src/gui/kernel/qhighdpiscaling.cpp | 51 |
1 files changed, 28 insertions, 23 deletions
diff --git a/src/gui/kernel/qhighdpiscaling.cpp b/src/gui/kernel/qhighdpiscaling.cpp index 666a79463f..a0e1b48dcb 100644 --- a/src/gui/kernel/qhighdpiscaling.cpp +++ b/src/gui/kernel/qhighdpiscaling.cpp @@ -494,10 +494,11 @@ void QHighDpiScaling::updateHighDpiScaling() qCDebug(lcHighDpi) << "Applying screen factors" << m_screenFactors; int i = -1; const auto screens = QGuiApplication::screens(); - for (const auto &[name, factor] : m_screenFactors) { + for (const auto &[name, rawFactor]: m_screenFactors) { + const qreal factor = roundScaleFactor(rawFactor); ++i; if (name.isNull()) { - if (i < screens.count()) + if (i < screens.size()) setScreenFactor(screens.at(i), factor); } else { for (QScreen *screen : screens) { @@ -540,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<QScreenPrivate::UpdateEmitter> 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"; @@ -565,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(); @@ -573,9 +578,7 @@ 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()->setPlatformScreen(screen->handle()); // updates geometries based on scale factor + screen->d_func()->updateGeometry(); } QPoint QHighDpiScaling::mapPositionToNative(const QPoint &pos, const QPlatformScreen *platformScreen) @@ -696,7 +699,7 @@ QVector<QHighDpiScaling::ScreenFactor> QHighDpiScaling::parseScreenScaleFactorsS // - a semicolon-separated name=factor list: "foo=1.5;bar=2;baz=3" const auto specs = screenScaleFactors.split(u';'); for (const auto &spec : specs) { - const int equalsPos = spec.lastIndexOf(u'='); + const qsizetype equalsPos = spec.lastIndexOf(u'='); if (equalsPos == -1) { // screens in order bool ok; @@ -750,7 +753,20 @@ QHighDpiScaling::ScaleAndOrigin QHighDpiScaling::scaleAndOrigin(const QWindow *w return scaleAndOrigin(targetScreen, position); } -#else +#ifndef QT_NO_DEBUG_STREAM +QDebug operator<<(QDebug debug, const QHighDpiScaling::ScreenFactor &factor) +{ + const QDebugStateSaver saver(debug); + debug.nospace(); + if (!factor.name.isEmpty()) + debug << factor.name << "="; + debug << factor.factor; + return debug; +} +#endif + +#else // QT_NO_HIGHDPISCALING + QHighDpiScaling::ScaleAndOrigin QHighDpiScaling::scaleAndOrigin(const QPlatformScreen *, QPoint *) { return { qreal(1), QPoint() }; @@ -765,19 +781,8 @@ QHighDpiScaling::ScaleAndOrigin QHighDpiScaling::scaleAndOrigin(const QWindow *, { return { qreal(1), QPoint() }; } -#endif //QT_NO_HIGHDPISCALING -#ifndef QT_NO_DEBUG_STREAM -QDebug operator<<(QDebug debug, const QHighDpiScaling::ScreenFactor &factor) -{ - const QDebugStateSaver saver(debug); - debug.nospace(); - if (!factor.name.isEmpty()) - debug << factor.name << "="; - debug << factor.factor; - return debug; -} -#endif +#endif // QT_NO_HIGHDPISCALING QT_END_NAMESPACE |