diff options
author | Alexander Volkov <a.volkov@rusbitech.ru> | 2019-11-25 17:52:22 +0300 |
---|---|---|
committer | Liang Qi <liang.qi@qt.io> | 2021-02-03 22:02:01 +0100 |
commit | 3c07d1c35fba129bbebd767bb2e1a9f3b564e681 (patch) | |
tree | ace60fb02d143dba1e974155baa9b99af019ff1c | |
parent | dbaac6e5c1c1725055187bd5473f95de78f5b408 (diff) |
xcb: Fix available geometry after rotation
QXcbVirtualDesktop::m_workArea is not updated after screen rotation
if _NET_WORKAREA is not updated, e.g. when a window manager is not
running.
Use width of -1 for m_workArea to indicate that _NET_WORKAREA is
not set and thus there is no need to find its intersection with
screens' geometries.
Pick-to: 5.15 6.0
Change-Id: Ic1f3ec23576ed8407a76cc2b9f84a145c67b1d4b
Reviewed-by: Liang Qi <liang.qi@qt.io>
(cherry picked from commit df28d75721f7e57f4421ed8c4b8131da742f3967)
-rw-r--r-- | src/plugins/platforms/xcb/qxcbscreen.cpp | 15 | ||||
-rw-r--r-- | src/plugins/platforms/xcb/qxcbscreen.h | 2 |
2 files changed, 11 insertions, 6 deletions
diff --git a/src/plugins/platforms/xcb/qxcbscreen.cpp b/src/plugins/platforms/xcb/qxcbscreen.cpp index 3d6b68ad6e..bf77e8f663 100644 --- a/src/plugins/platforms/xcb/qxcbscreen.cpp +++ b/src/plugins/platforms/xcb/qxcbscreen.cpp @@ -301,7 +301,7 @@ QRect QXcbVirtualDesktop::getWorkArea() const uint32_t *geom = (uint32_t*)xcb_get_property_value(workArea.get()); r = QRect(geom[0], geom[1], geom[2], geom[3]); } else { - r = QRect(QPoint(), size()); + r.setWidth(-1); } return r; } @@ -316,6 +316,11 @@ void QXcbVirtualDesktop::updateWorkArea() } } +QRect QXcbVirtualDesktop::availableGeometry(const QRect &screenGeometry) const +{ + return m_workArea.width() >= 0 ? screenGeometry & m_workArea : screenGeometry; +} + static inline QSizeF sizeInMillimeters(const QSize &size, const QDpi &dpi) { return QSizeF(Q_MM_PER_INCH * size.width() / dpi.first, @@ -533,7 +538,7 @@ QXcbScreen::QXcbScreen(QXcbConnection *connection, QXcbVirtualDesktop *virtualDe } else if (xineramaScreenInfo) { m_geometry = QRect(xineramaScreenInfo->x_org, xineramaScreenInfo->y_org, xineramaScreenInfo->width, xineramaScreenInfo->height); - m_availableGeometry = m_geometry & m_virtualDesktop->workArea(); + m_availableGeometry = m_virtualDesktop->availableGeometry(m_geometry); m_sizeMillimeters = sizeInMillimeters(m_geometry.size(), m_virtualDesktop->dpi()); if (xineramaScreenIdx > -1) m_outputName += QLatin1Char('-') + QString::number(xineramaScreenIdx); @@ -543,7 +548,7 @@ QXcbScreen::QXcbScreen(QXcbConnection *connection, QXcbVirtualDesktop *virtualDe m_geometry = QRect(QPoint(), virtualDesktop->size()); if (m_availableGeometry.isEmpty()) - m_availableGeometry = m_geometry & m_virtualDesktop->workArea(); + m_availableGeometry = m_virtualDesktop->availableGeometry(m_geometry); if (m_sizeMillimeters.isEmpty()) m_sizeMillimeters = virtualDesktop->physicalSize(); @@ -789,7 +794,7 @@ void QXcbScreen::updateGeometry(const QRect &geometry, uint8_t rotation) m_sizeMillimeters = sizeInMillimeters(geometry.size(), m_virtualDesktop->dpi()); m_geometry = geometry; - m_availableGeometry = geometry & m_virtualDesktop->workArea(); + m_availableGeometry = m_virtualDesktop->availableGeometry(m_geometry); QWindowSystemInterface::handleScreenGeometryChange(QPlatformScreen::screen(), m_geometry, m_availableGeometry); if (m_orientation != oldOrientation) QWindowSystemInterface::handleScreenOrientationChange(QPlatformScreen::screen(), m_orientation); @@ -797,7 +802,7 @@ void QXcbScreen::updateGeometry(const QRect &geometry, uint8_t rotation) void QXcbScreen::updateAvailableGeometry() { - QRect availableGeometry = m_geometry & m_virtualDesktop->workArea(); + QRect availableGeometry = m_virtualDesktop->availableGeometry(m_geometry); if (m_availableGeometry != availableGeometry) { m_availableGeometry = availableGeometry; QWindowSystemInterface::handleScreenGeometryChange(QPlatformScreen::screen(), m_geometry, m_availableGeometry); diff --git a/src/plugins/platforms/xcb/qxcbscreen.h b/src/plugins/platforms/xcb/qxcbscreen.h index a074afb96e..2935cb72f9 100644 --- a/src/plugins/platforms/xcb/qxcbscreen.h +++ b/src/plugins/platforms/xcb/qxcbscreen.h @@ -88,8 +88,8 @@ public: bool compositingActive() const; - QRect workArea() const { return m_workArea; } void updateWorkArea(); + QRect availableGeometry(const QRect &screenGeometry) const; void handleXFixesSelectionNotify(xcb_xfixes_selection_notify_event_t *notify_event); void subscribeToXFixesSelectionNotify(); |