diff --git a/src/gui/kernel/qguiapplication.cpp b/src/gui/kernel/qguiapplication.cpp index 7866f65b7e5ece5e99c7eb0af29bfb75af1e35d1..448a71fe6b15be6a3cd367664f344936d6a4c522 100644 --- a/src/gui/kernel/qguiapplication.cpp +++ b/src/gui/kernel/qguiapplication.cpp @@ -1119,7 +1119,7 @@ void QGuiApplicationPrivate::createPlatformIntegration() QCoreApplication::setAttribute(Qt::AA_DontUseNativeMenuBar, true); - QHighDpiScaling::initHighDPiScaling(); + QHighDpiScaling::initHighDpiScaling(); // Load the platform integration QString platformPluginPath = QLatin1String(qgetenv("QT_QPA_PLATFORM_PLUGIN_PATH")); @@ -1183,6 +1183,8 @@ void QGuiApplicationPrivate::createPlatformIntegration() if (!icon.isEmpty()) forcedWindowIcon = QDir::isAbsolutePath(icon) ? QIcon(icon) : QIcon::fromTheme(icon); + + QHighDpiScaling::updateHighDpiScaling(); } /*! diff --git a/src/gui/kernel/qhighdpiscaling.cpp b/src/gui/kernel/qhighdpiscaling.cpp index 56fd38486d9445b5f8c75f1d0c39f2995653cd67..2fee06c77d695734a94ad58f56b8d212e6a7e252 100644 --- a/src/gui/kernel/qhighdpiscaling.cpp +++ b/src/gui/kernel/qhighdpiscaling.cpp @@ -124,23 +124,41 @@ static inline qreal initialScaleFactor() qreal QHighDpiScaling::m_factor; bool QHighDpiScaling::m_active; //"overall active" - is there any scale factor set. -bool QHighDpiScaling::m_perScreenActive; // different screens may have different scale bool QHighDpiScaling::m_usePixelDensity; // use scale factor from platform plugin +bool QHighDpiScaling::m_pixelDensityScalingActive; // pixel density scale factor > 1 +bool QHighDpiScaling::m_globalScalingActive; // global scale factor is active +bool QHighDpiScaling::m_screenFactorSet; // QHighDpiScaling::setScreenFactor has been used /* Initializes the QHighDpiScaling global variables. Called before the platform plugin is created. */ -void QHighDpiScaling::initHighDPiScaling() +void QHighDpiScaling::initHighDpiScaling() { m_factor = initialScaleFactor(); bool usePlatformPluginPixelDensity = qEnvironmentVariableIsSet(autoScreenEnvVar) || qgetenv(legacyDevicePixelEnvVar).toLower() == "auto"; - // m_active below is "overall active" - is there any scale factor set. - m_active = !qFuzzyCompare(m_factor, qreal(1)) || usePlatformPluginPixelDensity; + m_globalScalingActive = !qFuzzyCompare(m_factor, qreal(1)); m_usePixelDensity = usePlatformPluginPixelDensity; - m_perScreenActive = m_usePixelDensity; + m_pixelDensityScalingActive = false; //set in updateHighDpiScaling below + + // we update m_active in updateHighDpiScaling, but while we create the + // screens, we have to assume that m_usePixelDensity implies scaling + m_active = m_globalScalingActive || m_usePixelDensity; +} + +void QHighDpiScaling::updateHighDpiScaling() +{ + if (m_usePixelDensity && !m_pixelDensityScalingActive) { + Q_FOREACH (QScreen *screen, QGuiApplication::screens()) { + if (!qFuzzyCompare(screenSubfactor(screen->handle()), qreal(1))) { + m_pixelDensityScalingActive = true; + break; + } + } + } + m_active = m_globalScalingActive || m_screenFactorSet || m_pixelDensityScalingActive; } /* @@ -148,14 +166,15 @@ void QHighDpiScaling::initHighDPiScaling() */ void QHighDpiScaling::setGlobalFactor(qreal factor) { - if (qFuzzyCompare(factor, QHighDpiScaling::m_factor)) + if (qFuzzyCompare(factor, m_factor)) return; if (!QGuiApplication::allWindows().isEmpty()) { qWarning() << Q_FUNC_INFO << "QHighDpiScaling::setFactor: Should only be called when no windows exist."; } - QHighDpiScaling::m_active = !qFuzzyCompare(factor, qreal(1)); - QHighDpiScaling::m_factor = QHighDpiScaling::m_active ? factor : qreal(1); + m_globalScalingActive = !qFuzzyCompare(factor, qreal(1)); + m_factor = m_globalScalingActive ? factor : qreal(1); + m_active = m_globalScalingActive || m_screenFactorSet || m_pixelDensityScalingActive; Q_FOREACH (QScreen *screen, QGuiApplication::screens()) screen->d_func()->updateHighDpi(); } @@ -167,8 +186,8 @@ static const char *scaleFactorProperty = "_q_scaleFactor"; */ void QHighDpiScaling::setScreenFactor(QScreen *screen, qreal factor) { + m_screenFactorSet = true; m_active = true; - m_perScreenActive = true; screen->setProperty(scaleFactorProperty, QVariant(factor)); //### dirty hack to force re-evaluation of screen geometry @@ -215,12 +234,14 @@ QPoint QHighDpiScaling::mapPositionFromNative(const QPoint &pos, const QPlatform qreal QHighDpiScaling::screenSubfactor(const QPlatformScreen *screen) { qreal factor = qreal(1.0); - if (m_perScreenActive && screen) { + if (screen) { if (m_usePixelDensity) factor *= screen->pixelDensity(); - QVariant screenFactor = screen->screen()->property(scaleFactorProperty); - if (screenFactor.isValid()) - factor *= screenFactor.toReal(); + if (m_screenFactorSet) { + QVariant screenFactor = screen->screen()->property(scaleFactorProperty); + if (screenFactor.isValid()) + factor *= screenFactor.toReal(); + } } return factor; } diff --git a/src/gui/kernel/qhighdpiscaling_p.h b/src/gui/kernel/qhighdpiscaling_p.h index bf967d10ade5b047ea3cee2b0b11ed5b2c682794..d60be8651829112344d280394bab9a88b3a64f8f 100644 --- a/src/gui/kernel/qhighdpiscaling_p.h +++ b/src/gui/kernel/qhighdpiscaling_p.h @@ -60,7 +60,8 @@ class QPlatformScreen; class Q_GUI_EXPORT QHighDpiScaling { public: - static void initHighDPiScaling(); + static void initHighDpiScaling(); + static void updateHighDpiScaling(); static void setGlobalFactor(qreal factor); static void setScreenFactor(QScreen *window, qreal factor); @@ -77,8 +78,10 @@ private: static qreal m_factor; static bool m_active; - static bool m_perScreenActive; static bool m_usePixelDensity; + static bool m_globalScalingActive; + static bool m_pixelDensityScalingActive; + static bool m_screenFactorSet; }; // Coordinate system conversion functions: diff --git a/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp b/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp index 112bb8e0a638dcb26ea11c963e7ea45d88a56f78..c40bbf41b183b9cbea79b3cbcade1b8f57b6766b 100644 --- a/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp +++ b/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp @@ -33,6 +33,7 @@ #include "qfontconfigdatabase_p.h" #include "qfontenginemultifontconfig_p.h" +#include "qhighdpiscaling_p.h" #include <QtCore/QList> #include <QtCore/QElapsedTimer> @@ -553,10 +554,8 @@ QFontEngine::HintStyle defaultHintStyleFromMatch(QFont::HintingPreference hintin break; } - if (QGuiApplication::platformNativeInterface()->nativeResourceForScreen("nofonthinting", - QGuiApplication::primaryScreen())) { + if (QHighDpiScaling::isActive()) return QFontEngine::HintNone; - } int hint_style = 0; if (FcPatternGetInteger (match, FC_HINT_STYLE, 0, &hint_style) == FcResultMatch) {