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 |