1From 4757dc87c9350e40621b633ae8ac5d8a1f5228b7 Mon Sep 17 00:00:00 2001
2From: =?UTF-8?q?Morten=20Johan=20S=C3=B8rvig?= <morten.sorvig@qt.io>
3Date: Thu, 2 Jun 2016 09:52:21 +0200
4Subject: [PATCH 24/27] Move QT_FONT_DPI to cross-platform code
5
6This makes it possible to test the effects of setting
7Qt::AA_HighDpiScaling/QT_AUTO_SCREEN_SCALE_FACTOR, with different DPI
8values on all platforms.
9
10This also makes it possible to access the actual DPI values reported
11by the OS/WS via the QPlatformScreen API.
12
13A drawback is that there is no single place to check the environment
14variable; currently done in three places. This may be
15further simplified later on.
16
17Done-with: Friedemann Kleint <Friedemann.Kleint@qt.io>
18Task-number: QTBUG-53022
19Change-Id: Idd6463219d3ae58fe0ab72c17686cce2eb9dbadd
20---
21 src/gui/kernel/qhighdpiscaling.cpp        | 4 ++--
22 src/gui/kernel/qplatformscreen.cpp        | 8 ++++++++
23 src/gui/kernel/qplatformscreen.h          | 2 ++
24 src/gui/kernel/qscreen.cpp                | 7 +++++--
25 src/gui/kernel/qwindowsysteminterface.cpp | 4 ++--
26 src/plugins/platforms/xcb/qxcbscreen.cpp  | 4 ----
27 6 files changed, 19 insertions(+), 10 deletions(-)
28
29diff --git a/src/gui/kernel/qhighdpiscaling.cpp b/src/gui/kernel/qhighdpiscaling.cpp
30index ae531569..fc8084c4 100644
31--- a/src/gui/kernel/qhighdpiscaling.cpp
32+++ b/src/gui/kernel/qhighdpiscaling.cpp
33@@ -274,7 +274,7 @@ qreal QHighDpiScaling::rawScaleFactor(const QPlatformScreen *screen)
34         qreal platformPhysicalDpi = screen->screen()->physicalDotsPerInch();
35         factor = qreal(platformPhysicalDpi) / qreal(platformBaseDpi.first);
36     } else {
37-        QDpi platformLogicalDpi = screen->logicalDpi();
38+        const QDpi platformLogicalDpi = QPlatformScreen::overrideDpi(screen->logicalDpi());
39         factor = qreal(platformLogicalDpi.first) / qreal(platformBaseDpi.first);
40     }
41
42@@ -587,7 +587,7 @@ QDpi QHighDpiScaling::logicalDpi(const QScreen *screen)
43         return QDpi(96, 96);
44
45     if (!m_usePixelDensity)
46-        return screen->handle()->logicalDpi();
47+        return QPlatformScreen::overrideDpi(screen->handle()->logicalDpi());
48
49     const qreal scaleFactor = rawScaleFactor(screen->handle());
50     const qreal roundedScaleFactor = roundScaleFactor(scaleFactor);
51diff --git a/src/gui/kernel/qplatformscreen.cpp b/src/gui/kernel/qplatformscreen.cpp
52index ff76528a..9e684c9f 100644
53--- a/src/gui/kernel/qplatformscreen.cpp
54+++ b/src/gui/kernel/qplatformscreen.cpp
55@@ -197,6 +197,14 @@ QDpi QPlatformScreen::logicalDpi() const
56                 25.4 * s.height() / ps.height());
57 }
58
59+// Helper function for accessing the platform screen logical dpi
60+// which accounts for QT_FONT_DPI.
61+QPair<qreal, qreal> QPlatformScreen::overrideDpi(const QPair<qreal, qreal> &in)
62+{
63+    static const int overrideDpi = qEnvironmentVariableIntValue("QT_FONT_DPI");
64+    return overrideDpi > 0 ?  QDpi(overrideDpi, overrideDpi) : in;
65+}
66+
67 /*!
68     Reimplement to return the base logical DPI for the platform. This
69     DPI value should correspond to a standard-DPI (1x) display. The
70diff --git a/src/gui/kernel/qplatformscreen.h b/src/gui/kernel/qplatformscreen.h
71index 63b5d5a4..32e6bf7e 100644
72--- a/src/gui/kernel/qplatformscreen.h
73+++ b/src/gui/kernel/qplatformscreen.h
74@@ -159,6 +159,8 @@ public:
75     // The platform screen's geometry in device independent coordinates
76     QRect deviceIndependentGeometry() const;
77
78+    static QDpi overrideDpi(const QDpi &in);
79+
80 protected:
81     void resizeMaximizedWindows();
82
83diff --git a/src/gui/kernel/qscreen.cpp b/src/gui/kernel/qscreen.cpp
84index 82ee62e6..b856435f 100644
85--- a/src/gui/kernel/qscreen.cpp
86+++ b/src/gui/kernel/qscreen.cpp
87@@ -84,8 +84,11 @@ void QScreenPrivate::setPlatformScreen(QPlatformScreen *screen)
88     platformScreen->d_func()->screen = q;
89     orientation = platformScreen->orientation();
90     geometry = platformScreen->deviceIndependentGeometry();
91-    availableGeometry = QHighDpi::fromNative(platformScreen->availableGeometry(), QHighDpiScaling::factor(platformScreen), geometry.topLeft());
92-    logicalDpi = platformScreen->logicalDpi();
93+    availableGeometry = QHighDpi::fromNative(platformScreen->availableGeometry(),
94+                        QHighDpiScaling::factor(platformScreen), geometry.topLeft());
95+
96+    logicalDpi = QPlatformScreen::overrideDpi(platformScreen->logicalDpi());
97+
98     refreshRate = platformScreen->refreshRate();
99     // safeguard ourselves against buggy platform behavior...
100     if (refreshRate < 1.0)
101diff --git a/src/gui/kernel/qwindowsysteminterface.cpp b/src/gui/kernel/qwindowsysteminterface.cpp
102index b3b6167c..efc1d90e 100644
103--- a/src/gui/kernel/qwindowsysteminterface.cpp
104+++ b/src/gui/kernel/qwindowsysteminterface.cpp
105@@ -860,8 +860,8 @@ void QWindowSystemInterface::handleScreenGeometryChange(QScreen *screen, const Q
106
107 void QWindowSystemInterface::handleScreenLogicalDotsPerInchChange(QScreen *screen, qreal dpiX, qreal dpiY)
108 {
109-    QWindowSystemInterfacePrivate::ScreenLogicalDotsPerInchEvent *e =
110-            new QWindowSystemInterfacePrivate::ScreenLogicalDotsPerInchEvent(screen, dpiX, dpiY); // ### tja
111+    const QDpi effectiveDpi = QPlatformScreen::overrideDpi(QDpi{dpiX, dpiY});
112+    auto e = new QWindowSystemInterfacePrivate::ScreenLogicalDotsPerInchEvent(screen, effectiveDpi.first, effectiveDpi.second);
113     QWindowSystemInterfacePrivate::handleWindowSystemEvent(e);
114 }
115
116diff --git a/src/plugins/platforms/xcb/qxcbscreen.cpp b/src/plugins/platforms/xcb/qxcbscreen.cpp
117index 9af0794d..27ffcad9 100644
118--- a/src/plugins/platforms/xcb/qxcbscreen.cpp
119+++ b/src/plugins/platforms/xcb/qxcbscreen.cpp
120@@ -660,10 +660,6 @@ QImage::Format QXcbScreen::format() const
121
122 QDpi QXcbScreen::logicalDpi() const
123 {
124-    static const int overrideDpi = qEnvironmentVariableIntValue("QT_FONT_DPI");
125-    if (overrideDpi)
126-        return QDpi(overrideDpi, overrideDpi);
127-
128     const int forcedDpi = m_virtualDesktop->forcedDpi();
129     if (forcedDpi > 0) {
130         return QDpi(forcedDpi, forcedDpi);
131--
1322.22.0.windows.1
133
134