summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms/xcb
diff options
context:
space:
mode:
authorAlexander Volkov <a.volkov@rusbitech.ru>2019-11-25 17:52:22 +0300
committerLiang Qi <liang.qi@qt.io>2020-12-13 20:33:39 +0000
commitdf28d75721f7e57f4421ed8c4b8131da742f3967 (patch)
tree839211c790cdace9e95d8a469f83a3bd10b35004 /src/plugins/platforms/xcb
parent7b391c0d2c03d8d25449eca3868cd010d75ff81e (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>
Diffstat (limited to 'src/plugins/platforms/xcb')
-rw-r--r--src/plugins/platforms/xcb/qxcbscreen.cpp13
-rw-r--r--src/plugins/platforms/xcb/qxcbscreen.h2
2 files changed, 10 insertions, 5 deletions
diff --git a/src/plugins/platforms/xcb/qxcbscreen.cpp b/src/plugins/platforms/xcb/qxcbscreen.cpp
index e65418b077..e1fa4d8416 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,
@@ -535,7 +540,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();
@@ -773,7 +778,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);
@@ -781,7 +786,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 267c8b8911..aabf227a09 100644
--- a/src/plugins/platforms/xcb/qxcbscreen.h
+++ b/src/plugins/platforms/xcb/qxcbscreen.h
@@ -87,8 +87,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();