diff options
author | Liang Qi <[email protected]> | 2022-03-30 16:02:35 +0200 |
---|---|---|
committer | Liang Qi <[email protected]> | 2022-04-04 17:48:14 +0000 |
commit | 27efadec226cabd14f417c9f44f86557ea88ec4c (patch) | |
tree | 48b0a0a3d5e9b93b39db583f3c9e9499b0e22e9c | |
parent | d26c1ba4de820f8c56088d1d156b6780ce30d82d (diff) |
xcb: Correctly set physical size for screen with RandR 1.5
This amends 9a4c98e55659b32db984612e6247ac193812a502.
Fixes: QTBUG-101038
Pick-to: 6.3
Change-Id: Ie75953af475dc606b34c3e274438075f20bdd8ae
Reviewed-by: Liang Qi <[email protected]>
-rw-r--r-- | src/plugins/platforms/xcb/qxcbscreen.cpp | 39 | ||||
-rw-r--r-- | src/plugins/platforms/xcb/qxcbscreen.h | 1 |
2 files changed, 30 insertions, 10 deletions
diff --git a/src/plugins/platforms/xcb/qxcbscreen.cpp b/src/plugins/platforms/xcb/qxcbscreen.cpp index a474e569e92..65fd9139e18 100644 --- a/src/plugins/platforms/xcb/qxcbscreen.cpp +++ b/src/plugins/platforms/xcb/qxcbscreen.cpp @@ -557,18 +557,23 @@ QXcbScreen::QXcbScreen(QXcbConnection *connection, QXcbVirtualDesktop *virtualDe m_cursor = new QXcbCursor(connection, this); + updateColorSpaceAndEdid(); +} + +void QXcbScreen::updateColorSpaceAndEdid() +{ { // Read colord ICC data (from GNOME settings) auto reply = Q_XCB_REPLY_UNCHECKED(xcb_get_property, xcb_connection(), false, screen()->root, - connection->atom(QXcbAtom::_ICC_PROFILE), + connection()->atom(QXcbAtom::_ICC_PROFILE), XCB_ATOM_CARDINAL, 0, 8192); if (reply->format == 8 && reply->type == XCB_ATOM_CARDINAL) { QByteArray data(reinterpret_cast<const char *>(xcb_get_property_value(reply.get())), reply->value_len); m_colorSpace = QColorSpace::fromIccProfile(data); } } - if (connection->isAtLeastXRandR12()) { // Parse EDID + if (connection()->isAtLeastXRandR12()) { // Parse EDID QByteArray edid = getEdid(); if (m_edid.parse(edid)) { qCDebug(lcQpaScreen, "EDID data for output \"%s\": identifier '%s', manufacturer '%s'," @@ -627,11 +632,11 @@ void QXcbScreen::setMonitor(xcb_randr_monitor_info_t *monitorInfo, xcb_timestamp m_outputs.clear(); m_crtcs.clear(); + m_output = XCB_NONE; + m_crtc = XCB_NONE; if (!monitorInfo) { m_monitor = nullptr; - m_output = XCB_NONE; - m_crtc = XCB_NONE; m_mode = XCB_NONE; m_outputName = defaultName(); // TODO: Send an event to the QScreen instance that the screen changed its name @@ -641,8 +646,12 @@ void QXcbScreen::setMonitor(xcb_randr_monitor_info_t *monitorInfo, xcb_timestamp xcb_randr_select_input(xcb_connection(), screen()->root, true); m_monitor = monitorInfo; + qCDebug(lcQpaScreen) << "xcb_randr_monitor_info_t: primary=" << m_monitor->primary << ", x=" << m_monitor->x << ", y=" << m_monitor->y + << ", width=" << m_monitor->width << ", height=" << m_monitor->height + << ", width_in_millimeters=" << m_monitor->width_in_millimeters << ", height_in_millimeters=" << m_monitor->height_in_millimeters; QRect monitorGeometry = QRect(m_monitor->x, m_monitor->y, m_monitor->width, m_monitor->height); + m_sizeMillimeters = QSize(m_monitor->width_in_millimeters, m_monitor->height_in_millimeters); int outputCount = xcb_randr_monitor_info_outputs_length(m_monitor); xcb_randr_output_t *outputs = nullptr; @@ -670,7 +679,13 @@ void QXcbScreen::setMonitor(xcb_randr_monitor_info_t *monitorInfo, xcb_timestamp } m_outputs << outputs[i]; + if (m_output == XCB_NONE) { + m_output = outputs[i]; + m_outputSizeMillimeters = QSize(output->mm_width, output->mm_height); + } m_crtcs << output->crtc; + if (m_crtc == XCB_NONE) + m_crtc = output->crtc; } } @@ -698,8 +713,6 @@ void QXcbScreen::setMonitor(xcb_randr_monitor_info_t *monitorInfo, xcb_timestamp if (m_availableGeometry.isEmpty()) m_availableGeometry = m_virtualDesktop->availableGeometry(m_geometry); - m_sizeMillimeters = sizeInMillimeters(m_geometry.size(), m_virtualDesktop->dpi()); - if (m_sizeMillimeters.isEmpty()) m_sizeMillimeters = virtualDesktop()->physicalSize(); @@ -708,6 +721,8 @@ void QXcbScreen::setMonitor(xcb_randr_monitor_info_t *monitorInfo, xcb_timestamp m_primary = monitorInfo->primary; m_cursor = new QXcbCursor(connection(), this); + + updateColorSpaceAndEdid(); } QString QXcbScreen::defaultName() @@ -923,19 +938,23 @@ void QXcbScreen::updateGeometry(const QRect &geometry, uint8_t rotation) switch (rotation) { case XCB_RANDR_ROTATION_ROTATE_0: // xrandr --rotate normal m_orientation = Qt::LandscapeOrientation; - m_sizeMillimeters = m_outputSizeMillimeters; + if (!m_monitor) + m_sizeMillimeters = m_outputSizeMillimeters; break; case XCB_RANDR_ROTATION_ROTATE_90: // xrandr --rotate left m_orientation = Qt::PortraitOrientation; - m_sizeMillimeters = m_outputSizeMillimeters.transposed(); + if (!m_monitor) + m_sizeMillimeters = m_outputSizeMillimeters.transposed(); break; case XCB_RANDR_ROTATION_ROTATE_180: // xrandr --rotate inverted m_orientation = Qt::InvertedLandscapeOrientation; - m_sizeMillimeters = m_outputSizeMillimeters; + if (!m_monitor) + m_sizeMillimeters = m_outputSizeMillimeters; break; case XCB_RANDR_ROTATION_ROTATE_270: // xrandr --rotate right m_orientation = Qt::InvertedPortraitOrientation; - m_sizeMillimeters = m_outputSizeMillimeters.transposed(); + if (!m_monitor) + m_sizeMillimeters = m_outputSizeMillimeters.transposed(); break; } diff --git a/src/plugins/platforms/xcb/qxcbscreen.h b/src/plugins/platforms/xcb/qxcbscreen.h index 04d90e0c687..88e7a812b25 100644 --- a/src/plugins/platforms/xcb/qxcbscreen.h +++ b/src/plugins/platforms/xcb/qxcbscreen.h @@ -225,6 +225,7 @@ private: void sendStartupMessage(const QByteArray &message) const; int forcedDpi() const; + void updateColorSpaceAndEdid(); QByteArray getOutputProperty(xcb_atom_t atom) const; QByteArray getEdid() const; |