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_usePixelDensityTRUE | never evaluated | FALSE | never evaluated |
&& !m_pixelDensityScalingActiveTRUE | 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 > 0TRUE | 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 (okTRUE | 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 (okTRUE | 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 (screenTRUE | 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_globalScalingActiveTRUE | never evaluated | FALSE | never evaluated |
|| m_screenFactorSetTRUE | never evaluated | FALSE | never evaluated |
|| m_pixelDensityScalingActiveTRUE | 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_globalScalingActiveTRUE | never evaluated | FALSE | never evaluated |
? factor : qreal(1); | 0 |
150 | m_active = m_globalScalingActiveTRUE | never evaluated | FALSE | never evaluated |
|| m_screenFactorSetTRUE | never evaluated | FALSE | never evaluated |
|| m_pixelDensityScalingActiveTRUE | 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 | | - |
| | |