Use Xft DPI as basis for HiDPI scaling

GNOME indicates DPI modes by setting high DPI values in Xft.DPI, so
we need to use the forced DPI setting instead of the real DPI, as basis
for QPA pixel density.

Change-Id: I6f25636383b16b89a3d5fe4c904afd079fe001aa
Fixes: QTBUG-74836
Task-number: QTBUG-65424
Reviewed-by: Morten Johan Sørvig <morten.sorvig@qt.io>
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
Allan Sandfeld Jensen 2019-06-19 18:02:48 +02:00
parent 29670528d8
commit 121692e540
2 changed files with 16 additions and 5 deletions

View File

@ -658,16 +658,24 @@ QImage::Format QXcbScreen::format() const
return format;
}
QDpi QXcbScreen::logicalDpi() const
int QXcbScreen::forcedDpi() const
{
static const int overrideDpi = qEnvironmentVariableIntValue("QT_FONT_DPI");
if (overrideDpi)
return QDpi(overrideDpi, overrideDpi);
return overrideDpi;
const int forcedDpi = m_virtualDesktop->forcedDpi();
if (forcedDpi > 0) {
if (forcedDpi > 0)
return forcedDpi;
return 0;
}
QDpi QXcbScreen::logicalDpi() const
{
const int forcedDpi = this->forcedDpi();
if (forcedDpi > 0)
return QDpi(forcedDpi, forcedDpi);
}
return m_virtualDesktop->dpi();
}
@ -739,7 +747,9 @@ void QXcbScreen::updateGeometry(const QRect &geometry, uint8_t rotation)
if (m_sizeMillimeters.isEmpty())
m_sizeMillimeters = sizeInMillimeters(geometry.size(), m_virtualDesktop->dpi());
qreal dpi = geometry.width() / physicalSize().width() * qreal(25.4);
qreal dpi = forcedDpi();
if (dpi <= 0)
dpi = geometry.width() / physicalSize().width() * qreal(25.4);
// Use 128 as a reference DPI on small screens. This favors "small UI" over "large UI".
qreal referenceDpi = physicalSize().width() <= 320 ? 128 : 96;

View File

@ -208,6 +208,7 @@ public:
private:
void sendStartupMessage(const QByteArray &message) const;
int forcedDpi() const;
QByteArray getOutputProperty(xcb_atom_t atom) const;
QByteArray getEdid() const;