| 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 |