| Absolute File Name: | /home/qt/qt5_coco/qt5/qtbase/src/gui/kernel/qhighdpiscaling.cpp |
| Switch to Source code | Preprocessed file |
| Line | Source | Count | ||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | - | |||||||||||||||||||
| 2 | - | |||||||||||||||||||
| 3 | - | |||||||||||||||||||
| 4 | - | |||||||||||||||||||
| 5 | const QLoggingCategory &lcScaling() { static const QLoggingCategory category("qt.scaling"); return never executed: category;return category;never executed: };return category; | 0 | ||||||||||||||||||
| 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)
| 0 | ||||||||||||||||||
| 18 | bool ok; | - | ||||||||||||||||||
| 19 | const qreal f = qgetenv(scaleFactorEnvVar).toDouble(&ok); | - | ||||||||||||||||||
| 20 | if (ok
| 0 | ||||||||||||||||||
| 21 | for (bool qt_category_enabled = lcScaling().isDebugEnabled(); qt_category_enabled
never executed: QMessageLogger(__FILE__, 60, __PRETTY_FUNCTION__, lcScaling().categoryName()).debug() << "Apply " << scaleFactorEnvVar << f; | 0 | ||||||||||||||||||
| 22 | result = f; | - | ||||||||||||||||||
| 23 | } never executed: end of block | 0 | ||||||||||||||||||
| 24 | } never executed: else {end of block | 0 | ||||||||||||||||||
| 25 | if (qEnvironmentVariableIsSet(legacyDevicePixelEnvVar)
| 0 | ||||||||||||||||||
| 26 | QMessageLogger(__FILE__, 65, __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
| 0 | ||||||||||||||||||
| 33 | result = dpr; never executed: result = dpr; | 0 | ||||||||||||||||||
| 34 | } never executed: end of block | 0 | ||||||||||||||||||
| 35 | } never executed: end of block | 0 | ||||||||||||||||||
| 36 | return never executed: result;return result;never executed: return result; | 0 | ||||||||||||||||||
| 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)
| 0 | ||||||||||||||||||
| 57 | return never executed: false;return false;never executed: return false; | 0 | ||||||||||||||||||
| 58 | bool screenEnvValueOk; | - | ||||||||||||||||||
| 59 | const int screenEnvValue = qEnvironmentVariableIntValue(autoScreenEnvVar, &screenEnvValueOk); | - | ||||||||||||||||||
| 60 | if (screenEnvValueOk
| 0 | ||||||||||||||||||
| 61 | return never executed: false;return false;never executed: return false; | 0 | ||||||||||||||||||
| 62 | return never executed: QCoreApplication::testAttribute(Qt::AA_EnableHighDpiScaling)return QCoreApplication::testAttribute(Qt::AA_EnableHighDpiScaling) || (screenEnvValueOk && screenEnvValue > 0) || (qEnvironmentVariableIsSet(legacyDevicePixelEnvVar) && qgetenv(legacyDevicePixelEnvVar).toLower() == "auto");
never executed: return QCoreApplication::testAttribute(Qt::AA_EnableHighDpiScaling) || (screenEnvValueOk && screenEnvValue > 0) || (qEnvironmentVariableIsSet(legacyDevicePixelEnvVar) && qgetenv(legacyDevicePixelEnvVar).toLower() == "auto"); | 0 | ||||||||||||||||||
| 63 | || (screenEnvValueOk
never executed: return QCoreApplication::testAttribute(Qt::AA_EnableHighDpiScaling) || (screenEnvValueOk && screenEnvValue > 0) || (qEnvironmentVariableIsSet(legacyDevicePixelEnvVar) && qgetenv(legacyDevicePixelEnvVar).toLower() == "auto"); | 0 | ||||||||||||||||||
| 64 | || (qEnvironmentVariableIsSet(legacyDevicePixelEnvVar)
never executed: return QCoreApplication::testAttribute(Qt::AA_EnableHighDpiScaling) || (screenEnvValueOk && screenEnvValue > 0) || (qEnvironmentVariableIsSet(legacyDevicePixelEnvVar) && qgetenv(legacyDevicePixelEnvVar).toLower() == "auto"); | 0 | ||||||||||||||||||
| 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
| 0 | ||||||||||||||||||
| 80 | } never executed: end of block | 0 | ||||||||||||||||||
| 81 | - | |||||||||||||||||||
| 82 | void QHighDpiScaling::updateHighDpiScaling() | - | ||||||||||||||||||
| 83 | { | - | ||||||||||||||||||
| 84 | if (QCoreApplication::testAttribute(Qt::AA_DisableHighDpiScaling)
| 0 | ||||||||||||||||||
| 85 | return; never executed: return; | 0 | ||||||||||||||||||
| 86 | - | |||||||||||||||||||
| 87 | if (m_usePixelDensity
| 0 | ||||||||||||||||||
| 88 | for (QForeachContainer<typename QtPrivate::remove_reference<decltype(QGuiApplication::screens())>::type> _container_((QGuiApplication::screens())); _container_.control && _container_.i != _container_.e; ++_container_.i, _container_.control ^= 1) for (QScreen *screen = *_container_.i; _container_.control; _container_.control = 0) { | - | ||||||||||||||||||
| 89 | if (!qFuzzyCompare(screenSubfactor(screen->handle()), qreal(1))
| 0 | ||||||||||||||||||
| 90 | m_pixelDensityScalingActive = true; | - | ||||||||||||||||||
| 91 | break; never executed: break; | 0 | ||||||||||||||||||
| 92 | } | - | ||||||||||||||||||
| 93 | } never executed: end of block | 0 | ||||||||||||||||||
| 94 | } never executed: end of block | 0 | ||||||||||||||||||
| 95 | if (qEnvironmentVariableIsSet(screenFactorsEnvVar)
| 0 | ||||||||||||||||||
| 96 | int i = 0; | - | ||||||||||||||||||
| 97 | for (QForeachContainer<typename QtPrivate::remove_reference<decltype(qgetenv(screenFactorsEnvVar).split(';'))>::type> _container_((qgetenv(screenFactorsEnvVar).split(';'))); _container_.control && _container_.i != _container_.e; ++_container_.i, _container_.control ^= 1) for (const QByteArray &spec = *_container_.i; _container_.control; _container_.control = 0) { | - | ||||||||||||||||||
| 98 | QScreen *screen = 0; | - | ||||||||||||||||||
| 99 | int equalsPos = spec.lastIndexOf('='); | - | ||||||||||||||||||
| 100 | double factor = 0; | - | ||||||||||||||||||
| 101 | if (equalsPos > 0
| 0 | ||||||||||||||||||
| 102 | - | |||||||||||||||||||
| 103 | QByteArray name = spec.mid(0, equalsPos); | - | ||||||||||||||||||
| 104 | QByteArray f = spec.mid(equalsPos + 1); | - | ||||||||||||||||||
| 105 | bool ok; | - | ||||||||||||||||||
| 106 | factor = f.toDouble(&ok); | - | ||||||||||||||||||
| 107 | if (ok
| 0 | ||||||||||||||||||
| 108 | for (QForeachContainer<typename QtPrivate::remove_reference<decltype(QGuiApplication::screens())>::type> _container_((QGuiApplication::screens())); _container_.control && _container_.i != _container_.e; ++_container_.i, _container_.control ^= 1) for (QScreen *s = *_container_.i; _container_.control; _container_.control = 0) { | - | ||||||||||||||||||
| 109 | if (s->name() == QString::fromLocal8Bit(name)
| 0 | ||||||||||||||||||
| 110 | screen = s; | - | ||||||||||||||||||
| 111 | break; never executed: break; | 0 | ||||||||||||||||||
| 112 | } | - | ||||||||||||||||||
| 113 | } never executed: end of block | 0 | ||||||||||||||||||
| 114 | } never executed: end of block | 0 | ||||||||||||||||||
| 115 | } never executed: else {end of block | 0 | ||||||||||||||||||
| 116 | - | |||||||||||||||||||
| 117 | bool ok; | - | ||||||||||||||||||
| 118 | factor = spec.toDouble(&ok); | - | ||||||||||||||||||
| 119 | if (ok
| 0 | ||||||||||||||||||
| 120 | screen = QGuiApplication::screens().at(i); never executed: screen = QGuiApplication::screens().at(i); | 0 | ||||||||||||||||||
| 121 | } never executed: end of block | 0 | ||||||||||||||||||
| 122 | if (screen
| 0 | ||||||||||||||||||
| 123 | setScreenFactor(screen, factor); never executed: setScreenFactor(screen, factor); | 0 | ||||||||||||||||||
| 124 | ++i; | - | ||||||||||||||||||
| 125 | } never executed: end of block | 0 | ||||||||||||||||||
| 126 | } never executed: end of block | 0 | ||||||||||||||||||
| 127 | m_active = m_globalScalingActive
| 0 | ||||||||||||||||||
| 128 | - | |||||||||||||||||||
| 129 | QPlatformScreen *primaryScreen = QGuiApplication::primaryScreen()->handle(); | - | ||||||||||||||||||
| 130 | qreal sf = screenSubfactor(primaryScreen); | - | ||||||||||||||||||
| 131 | QDpi primaryDpi = primaryScreen->logicalDpi(); | - | ||||||||||||||||||
| 132 | m_logicalDpi = QDpi(primaryDpi.first / sf, primaryDpi.second / sf); | - | ||||||||||||||||||
| 133 | } never executed: end of block | 0 | ||||||||||||||||||
| 134 | - | |||||||||||||||||||
| 135 | - | |||||||||||||||||||
| 136 | - | |||||||||||||||||||
| 137 | - | |||||||||||||||||||
| 138 | void QHighDpiScaling::setGlobalFactor(qreal factor) | - | ||||||||||||||||||
| 139 | { | - | ||||||||||||||||||
| 140 | if (qFuzzyCompare(factor, m_factor)
| 0 | ||||||||||||||||||
| 141 | return; never executed: return; | 0 | ||||||||||||||||||
| 142 | if (!QGuiApplication::allWindows().isEmpty()
| 0 | ||||||||||||||||||
| 143 | QMessageLogger(__FILE__, 319, __PRETTY_FUNCTION__).warning("QHighDpiScaling::setFactor: Should only be called when no windows exist."); never executed: QMessageLogger(__FILE__, 319, __PRETTY_FUNCTION__).warning("QHighDpiScaling::setFactor: Should only be called when no windows exist."); | 0 | ||||||||||||||||||
| 144 | - | |||||||||||||||||||
| 145 | m_globalScalingActive = !qFuzzyCompare(factor, qreal(1)); | - | ||||||||||||||||||
| 146 | m_factor = m_globalScalingActive
| 0 | ||||||||||||||||||
| 147 | m_active = m_globalScalingActive
| 0 | ||||||||||||||||||
| 148 | for (QForeachContainer<typename QtPrivate::remove_reference<decltype(QGuiApplication::screens())>::type> _container_((QGuiApplication::screens())); _container_.control && _container_.i != _container_.e; ++_container_.i, _container_.control ^= 1) for (QScreen *screen = *_container_.i; _container_.control; _container_.control = 0) | - | ||||||||||||||||||
| 149 | screen->d_func()->updateHighDpi(); never executed: screen->d_func()->updateHighDpi(); | 0 | ||||||||||||||||||
| 150 | } never executed: end of block | 0 | ||||||||||||||||||
| 151 | - | |||||||||||||||||||
| 152 | static const char scaleFactorProperty[] = "_q_scaleFactor"; | - | ||||||||||||||||||
| 153 | - | |||||||||||||||||||
| 154 | - | |||||||||||||||||||
| 155 | - | |||||||||||||||||||
| 156 | - | |||||||||||||||||||
| 157 | void QHighDpiScaling::setScreenFactor(QScreen *screen, qreal factor) | - | ||||||||||||||||||
| 158 | { | - | ||||||||||||||||||
| 159 | if (!qFuzzyCompare(factor, qreal(1))
| 0 | ||||||||||||||||||
| 160 | m_screenFactorSet = true; | - | ||||||||||||||||||
| 161 | m_active = true; | - | ||||||||||||||||||
| 162 | } never executed: end of block | 0 | ||||||||||||||||||
| 163 | screen->setProperty(scaleFactorProperty, QVariant(factor)); | - | ||||||||||||||||||
| 164 | - | |||||||||||||||||||
| 165 | - | |||||||||||||||||||
| 166 | if (screen->handle()
| 0 | ||||||||||||||||||
| 167 | screen->d_func()->setPlatformScreen(screen->handle()); never executed: screen->d_func()->setPlatformScreen(screen->handle()); | 0 | ||||||||||||||||||
| 168 | } never executed: end of block | 0 | ||||||||||||||||||
| 169 | - | |||||||||||||||||||
| 170 | QPoint QHighDpiScaling::mapPositionToNative(const QPoint &pos, const QPlatformScreen *platformScreen) | - | ||||||||||||||||||
| 171 | { | - | ||||||||||||||||||
| 172 | if (!platformScreen
| 0 | ||||||||||||||||||
| 173 | return never executed: pos;return pos;never executed: return pos; | 0 | ||||||||||||||||||
| 174 | const qreal scaleFactor = factor(platformScreen); | - | ||||||||||||||||||
| 175 | const QPoint topLeft = platformScreen->geometry().topLeft(); | - | ||||||||||||||||||
| 176 | return never executed: (pos - topLeft) * scaleFactor + topLeft;return (pos - topLeft) * scaleFactor + topLeft;never executed: return (pos - topLeft) * scaleFactor + topLeft; | 0 | ||||||||||||||||||
| 177 | } | - | ||||||||||||||||||
| 178 | - | |||||||||||||||||||
| 179 | QPoint QHighDpiScaling::mapPositionFromNative(const QPoint &pos, const QPlatformScreen *platformScreen) | - | ||||||||||||||||||
| 180 | { | - | ||||||||||||||||||
| 181 | if (!platformScreen
| 0 | ||||||||||||||||||
| 182 | return never executed: pos;return pos;never executed: return pos; | 0 | ||||||||||||||||||
| 183 | const qreal scaleFactor = factor(platformScreen); | - | ||||||||||||||||||
| 184 | const QPoint topLeft = platformScreen->geometry().topLeft(); | - | ||||||||||||||||||
| 185 | return never executed: (pos - topLeft) / scaleFactor + topLeft;return (pos - topLeft) / scaleFactor + topLeft;never executed: return (pos - topLeft) / scaleFactor + topLeft; | 0 | ||||||||||||||||||
| 186 | } | - | ||||||||||||||||||
| 187 | - | |||||||||||||||||||
| 188 | qreal QHighDpiScaling::screenSubfactor(const QPlatformScreen *screen) | - | ||||||||||||||||||
| 189 | { | - | ||||||||||||||||||
| 190 | qreal factor = qreal(1.0); | - | ||||||||||||||||||
| 191 | if (screen
| 0 | ||||||||||||||||||
| 192 | if (m_usePixelDensity
| 0 | ||||||||||||||||||
| 193 | factor *= screen->pixelDensity(); never executed: factor *= screen->pixelDensity(); | 0 | ||||||||||||||||||
| 194 | if (m_screenFactorSet
| 0 | ||||||||||||||||||
| 195 | QVariant screenFactor = screen->screen()->property(scaleFactorProperty); | - | ||||||||||||||||||
| 196 | if (screenFactor.isValid()
| 0 | ||||||||||||||||||
| 197 | factor *= screenFactor.toReal(); never executed: factor *= screenFactor.toReal(); | 0 | ||||||||||||||||||
| 198 | } never executed: end of block | 0 | ||||||||||||||||||
| 199 | } never executed: end of block | 0 | ||||||||||||||||||
| 200 | return never executed: factor;return factor;never executed: return factor; | 0 | ||||||||||||||||||
| 201 | } | - | ||||||||||||||||||
| 202 | - | |||||||||||||||||||
| 203 | QDpi QHighDpiScaling::logicalDpi() | - | ||||||||||||||||||
| 204 | { | - | ||||||||||||||||||
| 205 | return never executed: m_logicalDpi;return m_logicalDpi;never executed: return m_logicalDpi; | 0 | ||||||||||||||||||
| 206 | } | - | ||||||||||||||||||
| 207 | - | |||||||||||||||||||
| 208 | qreal QHighDpiScaling::factor(const QScreen *screen) | - | ||||||||||||||||||
| 209 | { | - | ||||||||||||||||||
| 210 | - | |||||||||||||||||||
| 211 | if (!m_active
| 0 | ||||||||||||||||||
| 212 | return never executed: qreal(1.0);return qreal(1.0);never executed: return qreal(1.0); | 0 | ||||||||||||||||||
| 213 | - | |||||||||||||||||||
| 214 | - | |||||||||||||||||||
| 215 | - | |||||||||||||||||||
| 216 | qreal factor = m_factor; | - | ||||||||||||||||||
| 217 | if (screen
| 0 | ||||||||||||||||||
| 218 | factor *= screenSubfactor(screen->handle()); never executed: factor *= screenSubfactor(screen->handle()); | 0 | ||||||||||||||||||
| 219 | return never executed: factor;return factor;never executed: return factor; | 0 | ||||||||||||||||||
| 220 | } | - | ||||||||||||||||||
| 221 | - | |||||||||||||||||||
| 222 | qreal QHighDpiScaling::factor(const QPlatformScreen *platformScreen) | - | ||||||||||||||||||
| 223 | { | - | ||||||||||||||||||
| 224 | if (!m_active
| 0 | ||||||||||||||||||
| 225 | return never executed: qreal(1.0);return qreal(1.0);never executed: return qreal(1.0); | 0 | ||||||||||||||||||
| 226 | - | |||||||||||||||||||
| 227 | return never executed: m_factor * screenSubfactor(platformScreen);return m_factor * screenSubfactor(platformScreen);never executed: return m_factor * screenSubfactor(platformScreen); | 0 | ||||||||||||||||||
| 228 | } | - | ||||||||||||||||||
| 229 | - | |||||||||||||||||||
| 230 | qreal QHighDpiScaling::factor(const QWindow *window) | - | ||||||||||||||||||
| 231 | { | - | ||||||||||||||||||
| 232 | if (!m_active
| 0 | ||||||||||||||||||
| 233 | return never executed: qreal(1.0);return qreal(1.0);never executed: return qreal(1.0); | 0 | ||||||||||||||||||
| 234 | - | |||||||||||||||||||
| 235 | return never executed: factor(window ? window->screen() : QGuiApplication::primaryScreen());return factor(window ? window->screen() : QGuiApplication::primaryScreen());never executed: return factor(window ? window->screen() : QGuiApplication::primaryScreen()); | 0 | ||||||||||||||||||
| 236 | } | - | ||||||||||||||||||
| 237 | - | |||||||||||||||||||
| 238 | QPoint QHighDpiScaling::origin(const QScreen *screen) | - | ||||||||||||||||||
| 239 | { | - | ||||||||||||||||||
| 240 | return never executed: screen->geometry().topLeft();return screen->geometry().topLeft();never executed: return screen->geometry().topLeft(); | 0 | ||||||||||||||||||
| 241 | } | - | ||||||||||||||||||
| 242 | - | |||||||||||||||||||
| 243 | QPoint QHighDpiScaling::origin(const QPlatformScreen *platformScreen) | - | ||||||||||||||||||
| 244 | { | - | ||||||||||||||||||
| 245 | return never executed: platformScreen->geometry().topLeft();return platformScreen->geometry().topLeft();never executed: return platformScreen->geometry().topLeft(); | 0 | ||||||||||||||||||
| 246 | } | - | ||||||||||||||||||
| 247 | - | |||||||||||||||||||
| 248 | - | |||||||||||||||||||
| 249 | - | |||||||||||||||||||
| Switch to Source code | Preprocessed file |