summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/plugins/platforms/xcb/qxcbwindow.cpp9
-rw-r--r--src/plugins/platforms/xcb/qxcbwindow.h1
-rw-r--r--tests/auto/gui/kernel/qwindow/tst_qwindow.cpp19
3 files changed, 29 insertions, 0 deletions
diff --git a/src/plugins/platforms/xcb/qxcbwindow.cpp b/src/plugins/platforms/xcb/qxcbwindow.cpp
index fc04d6afc4..bf1fd2e177 100644
--- a/src/plugins/platforms/xcb/qxcbwindow.cpp
+++ b/src/plugins/platforms/xcb/qxcbwindow.cpp
@@ -2102,6 +2102,15 @@ void QXcbWindow::handleConfigureNotifyEvent(const xcb_configure_notify_event_t *
// will make the comparison later.
QWindowSystemInterface::handleWindowScreenChanged(window(), newScreen->screen());
+ // Send the synthetic expose event on resize only when the window is shrinked,
+ // because the "XCB_GRAVITY_NORTH_WEST" flag doesn't send it automatically.
+ if (!m_oldWindowSize.isEmpty()
+ && (actualGeometry.width() < m_oldWindowSize.width()
+ || actualGeometry.height() < m_oldWindowSize.height())) {
+ QWindowSystemInterface::handleExposeEvent(window(), QRegion(0, 0, actualGeometry.width(), actualGeometry.height()));
+ }
+ m_oldWindowSize = actualGeometry.size();
+
if (m_usingSyncProtocol && m_syncState == SyncReceived)
m_syncState = SyncAndConfigureReceived;
diff --git a/src/plugins/platforms/xcb/qxcbwindow.h b/src/plugins/platforms/xcb/qxcbwindow.h
index 9ad0153ca2..e7190b1733 100644
--- a/src/plugins/platforms/xcb/qxcbwindow.h
+++ b/src/plugins/platforms/xcb/qxcbwindow.h
@@ -256,6 +256,7 @@ protected:
mutable QMargins m_frameMargins;
QRegion m_exposeRegion;
+ QSize m_oldWindowSize;
xcb_visualid_t m_visualId;
int m_lastWindowStateEvent;
diff --git a/tests/auto/gui/kernel/qwindow/tst_qwindow.cpp b/tests/auto/gui/kernel/qwindow/tst_qwindow.cpp
index 892dc0899f..70446e803a 100644
--- a/tests/auto/gui/kernel/qwindow/tst_qwindow.cpp
+++ b/tests/auto/gui/kernel/qwindow/tst_qwindow.cpp
@@ -58,6 +58,7 @@ private slots:
void setVisible();
void eventOrderOnShow();
void resizeEventAfterResize();
+ void exposeEventOnShrink_QTBUG54040();
void mapGlobal();
void positioning_data();
void positioning();
@@ -373,6 +374,24 @@ void tst_QWindow::resizeEventAfterResize()
QTRY_COMPARE(window.received(QEvent::Resize), 2);
}
+void tst_QWindow::exposeEventOnShrink_QTBUG54040()
+{
+ Window window;
+ window.setGeometry(QRect(m_availableTopLeft + QPoint(80, 80), m_testWindowSize));
+ window.setTitle(QTest::currentTestFunction());
+ window.showNormal();
+
+ QVERIFY(QTest::qWaitForWindowExposed(&window));
+
+ const int initialExposeCount = window.received(QEvent::Expose);
+ window.resize(window.width(), window.height() - 5);
+ QTRY_COMPARE(window.received(QEvent::Expose), initialExposeCount + 1);
+ window.resize(window.width() - 5, window.height());
+ QTRY_COMPARE(window.received(QEvent::Expose), initialExposeCount + 2);
+ window.resize(window.width() - 5, window.height() - 5);
+ QTRY_COMPARE(window.received(QEvent::Expose), initialExposeCount + 3);
+}
+
void tst_QWindow::positioning_data()
{
QTest::addColumn<int>("windowflags");