Fix font sizes when X11 has a forced dpi setting
On X11, the X resource system can override the physical DPI of the screen for resolving font sizes etc. Correctly load the setting and adjust the logicalDpi() accordingly. Change-Id: Id60d03d1d214fb99e9de17a65976abd170bb7cca Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@digia.com>
This commit is contained in:
parent
e14dd5a65d
commit
3bf50a7db9
@ -66,6 +66,7 @@ QXcbScreen::QXcbScreen(QXcbConnection *connection, xcb_screen_t *scr,
|
|||||||
, m_orientation(Qt::PrimaryOrientation)
|
, m_orientation(Qt::PrimaryOrientation)
|
||||||
, m_number(number)
|
, m_number(number)
|
||||||
, m_refreshRate(60)
|
, m_refreshRate(60)
|
||||||
|
, m_forcedDpi(-1)
|
||||||
{
|
{
|
||||||
if (connection->hasXRandr())
|
if (connection->hasXRandr())
|
||||||
xcb_randr_select_input(xcb_connection(), screen()->root, true);
|
xcb_randr_select_input(xcb_connection(), screen()->root, true);
|
||||||
@ -82,6 +83,9 @@ QXcbScreen::QXcbScreen(QXcbConnection *connection, xcb_screen_t *scr,
|
|||||||
if (m_availableGeometry.isEmpty())
|
if (m_availableGeometry.isEmpty())
|
||||||
m_availableGeometry = QRect(QPoint(), m_virtualSize);
|
m_availableGeometry = QRect(QPoint(), m_virtualSize);
|
||||||
|
|
||||||
|
readXResources();
|
||||||
|
|
||||||
|
|
||||||
#ifdef Q_XCB_DEBUG
|
#ifdef Q_XCB_DEBUG
|
||||||
qDebug();
|
qDebug();
|
||||||
qDebug("Screen output %s of xcb screen %d:", m_outputName.toUtf8().constData(), m_number);
|
qDebug("Screen output %s of xcb screen %d:", m_outputName.toUtf8().constData(), m_number);
|
||||||
@ -243,6 +247,9 @@ QImage::Format QXcbScreen::format() const
|
|||||||
|
|
||||||
QDpi QXcbScreen::logicalDpi() const
|
QDpi QXcbScreen::logicalDpi() const
|
||||||
{
|
{
|
||||||
|
if (m_forcedDpi > 0)
|
||||||
|
return QDpi(m_forcedDpi, m_forcedDpi);
|
||||||
|
|
||||||
return QDpi(Q_MM_PER_INCH * m_virtualSize.width() / m_virtualSizeMillimeters.width(),
|
return QDpi(Q_MM_PER_INCH * m_virtualSize.width() / m_virtualSizeMillimeters.width(),
|
||||||
Q_MM_PER_INCH * m_virtualSize.height() / m_virtualSizeMillimeters.height());
|
Q_MM_PER_INCH * m_virtualSize.height() / m_virtualSizeMillimeters.height());
|
||||||
}
|
}
|
||||||
@ -474,4 +481,41 @@ QPixmap QXcbScreen::grabWindow(WId window, int x, int y, int width, int height)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void QXcbScreen::readXResources()
|
||||||
|
{
|
||||||
|
int offset = 0;
|
||||||
|
QByteArray resources;
|
||||||
|
while(1) {
|
||||||
|
xcb_get_property_reply_t *reply =
|
||||||
|
xcb_get_property_reply(xcb_connection(),
|
||||||
|
xcb_get_property_unchecked(xcb_connection(), false, screen()->root,
|
||||||
|
XCB_ATOM_RESOURCE_MANAGER,
|
||||||
|
XCB_ATOM_STRING, offset/4, 8192), NULL);
|
||||||
|
bool more = false;
|
||||||
|
if (reply && reply->format == 8 && reply->type == XCB_ATOM_STRING) {
|
||||||
|
resources += QByteArray((const char *)xcb_get_property_value(reply), xcb_get_property_value_length(reply));
|
||||||
|
offset += xcb_get_property_value_length(reply);
|
||||||
|
more = reply->bytes_after != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (reply)
|
||||||
|
free(reply);
|
||||||
|
|
||||||
|
if (!more)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
QList<QByteArray> split = resources.split('\n');
|
||||||
|
for (int i = 0; i < split.size(); ++i) {
|
||||||
|
const QByteArray &r = split.at(i);
|
||||||
|
if (r.startsWith("Xft.dpi:\t")) {
|
||||||
|
bool ok;
|
||||||
|
int dpi = r.mid(sizeof("Xft.dpi:")).toInt(&ok);
|
||||||
|
if (ok)
|
||||||
|
m_forcedDpi = dpi;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
QT_END_NAMESPACE
|
||||||
|
@ -96,6 +96,7 @@ public:
|
|||||||
void updateGeometry(xcb_timestamp_t timestamp);
|
void updateGeometry(xcb_timestamp_t timestamp);
|
||||||
void updateRefreshRate();
|
void updateRefreshRate();
|
||||||
|
|
||||||
|
void readXResources();
|
||||||
private:
|
private:
|
||||||
xcb_screen_t *m_screen;
|
xcb_screen_t *m_screen;
|
||||||
xcb_randr_crtc_t m_crtc;
|
xcb_randr_crtc_t m_crtc;
|
||||||
@ -114,6 +115,7 @@ private:
|
|||||||
QMap<xcb_visualid_t, xcb_visualtype_t> m_visuals;
|
QMap<xcb_visualid_t, xcb_visualtype_t> m_visuals;
|
||||||
QXcbCursor *m_cursor;
|
QXcbCursor *m_cursor;
|
||||||
int m_refreshRate;
|
int m_refreshRate;
|
||||||
|
int m_forcedDpi;
|
||||||
};
|
};
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
QT_END_NAMESPACE
|
||||||
|
Loading…
x
Reference in New Issue
Block a user