From 2ae50d912389c5da4057fa6e49c662af469d7214 Mon Sep 17 00:00:00 2001 From: Martin Klapetek Date: Tue, 11 Mar 2014 13:39:53 +0100 Subject: [PATCH] Update QScreen::availableGeometry() on _NET_WORKAREA atom changes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When the window manager sets new workarea using the _NET_WORKAREA xcb atom, QScreen::availableGeometry() does not react to that and returns an invalid available geometry. This patch reacts to that change and updates the QScreen property properly on xcb platform. Change-Id: I8f0b4a27bab0ce450fb7393f4d9a56f3ce9a4ea1 Reviewed-by: Uli Schlachter Reviewed-by: Shawn Rutledge Reviewed-by: Friedemann Kleint Reviewed-by: Jørgen Lind Reviewed-by: Laszlo Agocs --- src/plugins/platforms/xcb/qxcbscreen.cpp | 3 ++- src/plugins/platforms/xcb/qxcbwindow.cpp | 3 +++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/plugins/platforms/xcb/qxcbscreen.cpp b/src/plugins/platforms/xcb/qxcbscreen.cpp index b1ef3182ba..9f19841437 100644 --- a/src/plugins/platforms/xcb/qxcbscreen.cpp +++ b/src/plugins/platforms/xcb/qxcbscreen.cpp @@ -371,7 +371,6 @@ void QXcbScreen::handleScreenChange(xcb_randr_screen_change_notify_event_t *chan } QWindowSystemInterface::handleScreenGeometryChange(QPlatformScreen::screen(), geometry()); - QWindowSystemInterface::handleScreenAvailableGeometryChange(QPlatformScreen::screen(), availableGeometry()); QWindowSystemInterface::handleScreenOrientationChange(QPlatformScreen::screen(), m_orientation); QDpi ldpi = logicalDpi(); @@ -409,6 +408,8 @@ void QXcbScreen::updateGeometry(xcb_timestamp_t timestamp) m_availableGeometry = m_geometry & virtualAvailableGeometry; } free(workArea); + + QWindowSystemInterface::handleScreenAvailableGeometryChange(QPlatformScreen::screen(), m_availableGeometry); } void QXcbScreen::updateRefreshRate() diff --git a/src/plugins/platforms/xcb/qxcbwindow.cpp b/src/plugins/platforms/xcb/qxcbwindow.cpp index aabcb84a08..1751eea990 100644 --- a/src/plugins/platforms/xcb/qxcbwindow.cpp +++ b/src/plugins/platforms/xcb/qxcbwindow.cpp @@ -1825,6 +1825,7 @@ void QXcbWindow::handlePropertyNotifyEvent(const xcb_property_notify_event_t *ev const bool propertyDeleted = event->state == XCB_PROPERTY_DELETE; const xcb_atom_t netWmStateAtom = atom(QXcbAtom::_NET_WM_STATE); const xcb_atom_t wmStateAtom = atom(QXcbAtom::WM_STATE); + const xcb_atom_t netWorkAreaAtom = atom(QXcbAtom::_NET_WORKAREA); if (event->atom == netWmStateAtom || event->atom == wmStateAtom) { if (propertyDeleted) @@ -1860,6 +1861,8 @@ void QXcbWindow::handlePropertyNotifyEvent(const xcb_property_notify_event_t *ev m_windowState = newState; } return; + } else if (event->atom == netWorkAreaAtom && event->window == m_screen->root()) { + m_screen->updateGeometry(event->time); } }