| Line | Source | Count |
| 1 | | - |
| 2 | | - |
| 3 | | - |
| 4 | | - |
| 5 | const QLoggingCategory &lcScaling() { static const QLoggingCategory category("qt.scaling"); return category; }; | - |
| 6 | | - |
| 7 | | - |
| 8 | static const char legacyDevicePixelEnvVar[] = "QT_DEVICE_PIXEL_RATIO"; | - |
| 9 | static const char scaleFactorEnvVar[] = "QT_SCALE_FACTOR"; | - |
| 10 | static const char autoScreenEnvVar[] = "QT_AUTO_SCREEN_SCALE_FACTOR"; | - |
| 11 | static const char screenFactorsEnvVar[] = "QT_SCREEN_SCALE_FACTORS"; | - |
| 12 | | - |
| 13 | static inline qreal initialGlobalScaleFactor() | - |
| 14 | { | - |
| 15 | | - |
| 16 | qreal result = 1; | - |
| 17 | if (qEnvironmentVariableIsSet(scaleFactorEnvVar)) { | - |
| 18 | bool ok; | - |
| 19 | const qreal f = qgetenv(scaleFactorEnvVar).toDouble(&ok); | - |
| 20 | if (ok && f > 0) { | - |
| 21 | for (bool qt_category_enabled = lcScaling().isDebugEnabled(); qt_category_enabled; qt_category_enabled = false) QMessageLogger(__FILE__, 6066, __PRETTY_FUNCTION__, lcScaling().categoryName()).debug() << "Apply " << scaleFactorEnvVar << f; | - |
| 22 | result = f; | - |
| 23 | } | - |
| 24 | } else { | - |
| 25 | if (qEnvironmentVariableIsSet(legacyDevicePixelEnvVar)) { | - |
| 26 | QMessageLogger(__FILE__, 6571, __PRETTY_FUNCTION__).warning() << "Warning:" << legacyDevicePixelEnvVar << "is deprecated. Instead use:" << endl | - |
| 27 | << " " << autoScreenEnvVar << "to enable platform plugin controlled per-screen factors." << endl | - |
| 28 | << " " << screenFactorsEnvVar << "to set per-screen factors." << endl | - |
| 29 | << " " << scaleFactorEnvVar << "to set the application global scale factor."; | - |
| 30 | | - |
| 31 | int dpr = qEnvironmentVariableIntValue(legacyDevicePixelEnvVar); | - |
| 32 | if (dpr > 0) | - |
| 33 | result = dpr; | - |
| 34 | } | - |
| 35 | } | - |
| 36 | return result; | - |
| 37 | } | - |
| 38 | qreal QHighDpiScaling::m_factor = 1.0; | - |
| 39 | bool QHighDpiScaling::m_active = false; | - |
| 40 | bool QHighDpiScaling::m_usePixelDensity = false; | - |
| 41 | bool QHighDpiScaling::m_pixelDensityScalingActive = false; | - |
| 42 | bool QHighDpiScaling::m_globalScalingActive = false; | - |
| 43 | bool QHighDpiScaling::m_screenFactorSet = false; | - |
| 44 | QDpi QHighDpiScaling::m_logicalDpi = QDpi(-1,-1); | - |
| 45 | | - |
| 46 | | - |
| 47 | | - |
| 48 | | - |
| 49 | | - |
| 50 | | - |
| 51 | static inline bool usePixelDensity() | - |
| 52 | { | - |
| 53 | | - |
| 54 | | - |
| 55 | | - |
| 56 | if (QCoreApplication::testAttribute(Qt::AA_DisableHighDpiScaling)) | - |
| 57 | return false; | - |
| 58 | bool screenEnvValueOk; | - |
| 59 | const int screenEnvValue = qEnvironmentVariableIntValue(autoScreenEnvVar, &screenEnvValueOk); | - |
| 60 | if (screenEnvValueOk && screenEnvValue < 1) | - |
| 61 | return false; | - |
| 62 | return QCoreApplication::testAttribute(Qt::AA_EnableHighDpiScaling) | - |
| 63 | || (screenEnvValueOk && screenEnvValue > 0) | - |
| 64 | || (qEnvironmentVariableIsSet(legacyDevicePixelEnvVar) && qgetenv(legacyDevicePixelEnvVar).toLower() == "auto"); | - |
| 65 | } | - |
| 66 | | - |
| 67 | void QHighDpiScaling::initHighDpiScaling() | - |
| 68 | { | - |
| 69 | | - |
| 70 | m_factor = initialGlobalScaleFactor(); | - |
| 71 | m_globalScalingActive = !qFuzzyCompare(m_factor, qreal(1)); | - |
| 72 | | - |
| 73 | m_usePixelDensity = usePixelDensity(); | - |
| 74 | | - |
| 75 | m_pixelDensityScalingActive = false; | - |
| 76 | | - |
| 77 | | - |
| 78 | | - |
| 79 | m_active = m_globalScalingActive || m_usePixelDensity; | - |
| 80 | } | - |
| 81 | | - |
| 82 | void QHighDpiScaling::updateHighDpiScaling() | - |
| 83 | { | - |
| 84 | if (QCoreApplication::testAttribute(Qt::AA_DisableHighDpiScaling)| TRUE | never evaluated | | FALSE | never evaluated |
) | 0 |
| 85 | return; never executed: return; | 0 |
| 86 | | - |
| 87 | if (m_usePixelDensity| TRUE | never evaluated | | FALSE | never evaluated |
&& !m_pixelDensityScalingActive| TRUE | never evaluated | | FALSE | never evaluated |
) { | 0 |
| 88 | for (QForeachContainer<typename QtPrivate::remove_reference<decltype(QGuiApplication::const auto screens ())>::type> _container_((= QGuiApplication::screens())); _container_.control && _container_.i != _container_.e; ++_container_.i, _container_.control ^= 1)(); | - |
| 89 | for (QScreen *screen = *_container_.i; _container_.control; _container_.control = 0: screens) { | - |
| 90 | if (!qFuzzyCompare(screenSubfactor(screen->handle()), qreal(1))| TRUE | never evaluated | | FALSE | never evaluated |
) { | 0 |
| 91 | m_pixelDensityScalingActive = true; | - |
| 92 | break; never executed: break; | 0 |
| 93 | } | - |
| 94 | } never executed: end of block | 0 |
| 95 | } never executed: end of block | 0 |
| 96 | if (qEnvironmentVariableIsSet(screenFactorsEnvVar)| TRUE | never evaluated | | FALSE | never evaluated |
) { | 0 |
| 97 | int i = 0; | - |
| for (QForeachContainer<typename QtPrivate::remove_reference<decltype(qgetenv(screenFactorsEnvVar).split('; | |
| 98 | '))>::type> _container_((const auto specs = qgetenv(screenFactorsEnvVar).split(';'))); _container_.control && _container_.i != _container_.e; ++_container_.i, _container_.control ^= 1)); | - |
| 99 | for (const QByteArray &spec = *_container_.i; _container_.control; _container_.control = 0: specs) { | - |
| 100 | QScreen *screen = 0; | - |
| 101 | int equalsPos = spec.lastIndexOf('='); | - |
| 102 | double factor = 0; | - |
| 103 | if (equalsPos > 0| TRUE | never evaluated | | FALSE | never evaluated |
) { | 0 |
| 104 | | - |
| 105 | QByteArray name = spec.mid(0, equalsPos); | - |
| 106 | QByteArray f = spec.mid(equalsPos + 1); | - |
| 107 | bool ok; | - |
| 108 | factor = f.toDouble(&ok); | - |
| 109 | if (ok| TRUE | never evaluated | | FALSE | never evaluated |
) { | 0 |
| 110 | for (QForeachContainer<typename QtPrivate::remove_reference<decltype(QGuiApplication::const auto screens ())>::type> _container_((= QGuiApplication::screens())); _container_.control && _container_.i != _container_.e; ++_container_.i, _container_.control ^= 1)(); | - |
| 111 | for (QScreen *s = *_container_.i; _container_.control; _container_.control = 0: screens) { | - |
| 112 | if (s->name() == QString::fromLocal8Bit(name)| TRUE | never evaluated | | FALSE | never evaluated |
) { | 0 |
| 113 | screen = s; | - |
| 114 | break; never executed: break; | 0 |
| 115 | } | - |
| 116 | } never executed: end of block | 0 |
| 117 | } never executed: end of block | 0 |
| 118 | } never executed: end of block else { | 0 |
| 119 | | - |
| 120 | bool ok; | - |
| 121 | factor = spec.toDouble(&ok); | - |
| 122 | if (ok| TRUE | never evaluated | | FALSE | never evaluated |
&& i < QGuiApplication::screens().count()| TRUE | never evaluated | | FALSE | never evaluated |
) | 0 |
| 123 | screen = QGuiApplication::screens().at(i); never executed: screen = QGuiApplication::screens().at(i); | 0 |
| 124 | } never executed: end of block | 0 |
| 125 | if (screen| TRUE | never evaluated | | FALSE | never evaluated |
) | 0 |
| 126 | setScreenFactor(screen, factor); never executed: setScreenFactor(screen, factor); | 0 |
| 127 | ++i; | - |
| 128 | } never executed: end of block | 0 |
| 129 | } never executed: end of block | 0 |
| 130 | m_active = m_globalScalingActive| TRUE | never evaluated | | FALSE | never evaluated |
|| m_screenFactorSet| TRUE | never evaluated | | FALSE | never evaluated |
|| m_pixelDensityScalingActive| TRUE | never evaluated | | FALSE | never evaluated |
; | 0 |
| 131 | | - |
| 132 | QPlatformScreen *primaryScreen = QGuiApplication::primaryScreen()->handle(); | - |
| 133 | qreal sf = screenSubfactor(primaryScreen); | - |
| 134 | QDpi primaryDpi = primaryScreen->logicalDpi(); | - |
| 135 | m_logicalDpi = QDpi(primaryDpi.first / sf, primaryDpi.second / sf); | - |
| 136 | } never executed: end of block | 0 |
| 137 | | - |
| 138 | | - |
| 139 | | - |
| 140 | | - |
| 141 | void QHighDpiScaling::setGlobalFactor(qreal factor) | - |
| 142 | { | - |
| 143 | if (qFuzzyCompare(factor, m_factor)| TRUE | never evaluated | | FALSE | never evaluated |
) | 0 |
| 144 | return; never executed: return; | 0 |
| 145 | if (!QGuiApplication::allWindows().isEmpty()| TRUE | never evaluated | | FALSE | never evaluated |
) | 0 |
| 146 | QMessageLogger(__FILE__, 319328, __PRETTY_FUNCTION__).warning("QHighDpiScaling::setFactor: Should only be called when no windows exist."); never executed: QMessageLogger(__FILE__, 328, __PRETTY_FUNCTION__).warning("QHighDpiScaling::setFactor: Should only be called when no windows exist."); | 0 |
| 147 | | - |
| 148 | m_globalScalingActive = !qFuzzyCompare(factor, qreal(1)); | - |
| 149 | m_factor = m_globalScalingActive| TRUE | never evaluated | | FALSE | never evaluated |
? factor : qreal(1); | 0 |
| 150 | m_active = m_globalScalingActive| TRUE | never evaluated | | FALSE | never evaluated |
|| m_screenFactorSet| TRUE | never evaluated | | FALSE | never evaluated |
|| m_pixelDensityScalingActive| TRUE | never evaluated | | FALSE | never evaluated |
; | 0 |
| 151 | for (QForeachContainer<typename QtPrivate::remove_reference<decltype(QGuiApplication::const auto screens ())>::type> _container_((= QGuiApplication::screens())); _container_.control && _container_.i != _container_.e; ++_container_.i, _container_.control ^= 1)(); | - |
| 152 | for (QScreen *screen = *_container_.i; _container_.control; _container_.control = 0: screens) | - |
| 153 | screen->d_func()->updateHighDpi(); never executed: screen->d_func()->updateHighDpi(); | 0 |
| 154 | } never executed: end of block | 0 |
| 155 | | - |
| 156 | static const char scaleFactorProperty[] = "_q_scaleFactor"; | - |
| 157 | | - |
| 158 | | - |
| 159 | | - |
| 160 | | - |
| 161 | void QHighDpiScaling::setScreenFactor(QScreen *screen, qreal factor) | - |
| 162 | { | - |
| 163 | if (!qFuzzyCompare(factor, qreal(1))) { | - |
| 164 | m_screenFactorSet = true; | - |
| 165 | m_active = true; | - |
| 166 | } | - |
| 167 | screen->setProperty(scaleFactorProperty, QVariant(factor)); | - |
| 168 | | - |
| 169 | | - |
| 170 | if (screen->handle()) | - |
| 171 | screen->d_func()->setPlatformScreen(screen->handle()); | - |
| 172 | } | - |
| 173 | | - |
| 174 | QPoint QHighDpiScaling::mapPositionToNative(const QPoint &pos, const QPlatformScreen *platformScreen) | - |
| 175 | { | - |
| 176 | if (!platformScreen) | - |
| 177 | return pos; | - |
| 178 | const qreal scaleFactor = factor(platformScreen); | - |
| 179 | const QPoint topLeft = platformScreen->geometry().topLeft(); | - |
| 180 | return (pos - topLeft) * scaleFactor + topLeft; | - |
| 181 | } | - |
| 182 | | - |
| 183 | QPoint QHighDpiScaling::mapPositionFromNative(const QPoint &pos, const QPlatformScreen *platformScreen) | - |
| 184 | { | - |
| 185 | if (!platformScreen) | - |
| 186 | return pos; | - |
| 187 | const qreal scaleFactor = factor(platformScreen); | - |
| 188 | const QPoint topLeft = platformScreen->geometry().topLeft(); | - |
| 189 | return (pos - topLeft) / scaleFactor + topLeft; | - |
| 190 | } | - |
| 191 | | - |
| 192 | qreal QHighDpiScaling::screenSubfactor(const QPlatformScreen *screen) | - |
| 193 | { | - |
| 194 | qreal factor = qreal(1.0); | - |
| 195 | if (screen) { | - |
| 196 | if (m_usePixelDensity) | - |
| 197 | factor *= screen->pixelDensity(); | - |
| 198 | if (m_screenFactorSet) { | - |
| 199 | QVariant screenFactor = screen->screen()->property(scaleFactorProperty); | - |
| 200 | if (screenFactor.isValid()) | - |
| 201 | factor *= screenFactor.toReal(); | - |
| 202 | } | - |
| 203 | } | - |
| 204 | return factor; | - |
| 205 | } | - |
| 206 | | - |
| 207 | QDpi QHighDpiScaling::logicalDpi() | - |
| 208 | { | - |
| 209 | return m_logicalDpi; | - |
| 210 | } | - |
| 211 | | - |
| 212 | qreal QHighDpiScaling::factor(const QScreen *screen) | - |
| 213 | { | - |
| 214 | | - |
| 215 | if (!m_active) | - |
| 216 | return qreal(1.0); | - |
| 217 | | - |
| 218 | | - |
| 219 | | - |
| 220 | qreal factor = m_factor; | - |
| 221 | if (screen) | - |
| 222 | factor *= screenSubfactor(screen->handle()); | - |
| 223 | return factor; | - |
| 224 | } | - |
| 225 | | - |
| 226 | qreal QHighDpiScaling::factor(const QPlatformScreen *platformScreen) | - |
| 227 | { | - |
| 228 | if (!m_active) | - |
| 229 | return qreal(1.0); | - |
| 230 | | - |
| 231 | return m_factor * screenSubfactor(platformScreen); | - |
| 232 | } | - |
| 233 | | - |
| 234 | qreal QHighDpiScaling::factor(const QWindow *window) | - |
| 235 | { | - |
| 236 | if (!m_active) | - |
| 237 | return qreal(1.0); | - |
| 238 | | - |
| 239 | return factor(window ? window->screen() : QGuiApplication::primaryScreen()); | - |
| 240 | } | - |
| 241 | | - |
| 242 | QPoint QHighDpiScaling::origin(const QScreen *screen) | - |
| 243 | { | - |
| 244 | return screen->geometry().topLeft(); | - |
| 245 | } | - |
| 246 | | - |
| 247 | QPoint QHighDpiScaling::origin(const QPlatformScreen *platformScreen) | - |
| 248 | { | - |
| 249 | return platformScreen->geometry().topLeft(); | - |
| 250 | } | - |
| 251 | | - |
| 252 | | - |
| 253 | | - |
| | |