summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/client/qwaylandwindow.cpp5
-rw-r--r--src/client/qwaylandwindow_p.h1
-rw-r--r--tests/auto/client/xdgshellv6/tst_xdgshellv6.cpp23
3 files changed, 28 insertions, 1 deletions
diff --git a/src/client/qwaylandwindow.cpp b/src/client/qwaylandwindow.cpp
index 1801c2a4b..4ac2ca51e 100644
--- a/src/client/qwaylandwindow.cpp
+++ b/src/client/qwaylandwindow.cpp
@@ -338,7 +338,9 @@ void QWaylandWindow::setGeometry(const QRect &rect)
mSentInitialResize = true;
}
- sendExposeEvent(QRect(QPoint(), geometry().size()));
+ QRect exposeGeometry(QPoint(), geometry().size());
+ if (exposeGeometry != mLastExposeGeometry)
+ sendExposeEvent(exposeGeometry);
}
void QWaylandWindow::resizeFromApplyConfigure(const QSize &sizeWithMargins, const QPoint &offset)
@@ -356,6 +358,7 @@ void QWaylandWindow::sendExposeEvent(const QRect &rect)
{
if (!(mShellSurface && mShellSurface->handleExpose(rect)))
QWindowSystemInterface::handleExposeEvent(window(), rect);
+ mLastExposeGeometry = rect;
}
diff --git a/src/client/qwaylandwindow_p.h b/src/client/qwaylandwindow_p.h
index ad24b7358..56ebd3cc6 100644
--- a/src/client/qwaylandwindow_p.h
+++ b/src/client/qwaylandwindow_p.h
@@ -254,6 +254,7 @@ private:
void handleScreenChanged();
bool mUpdateRequested = false;
+ QRect mLastExposeGeometry;
static const wl_callback_listener callbackListener;
static void frameCallback(void *data, struct wl_callback *wl_callback, uint32_t time);
diff --git a/tests/auto/client/xdgshellv6/tst_xdgshellv6.cpp b/tests/auto/client/xdgshellv6/tst_xdgshellv6.cpp
index 3fd8153e6..3c822325b 100644
--- a/tests/auto/client/xdgshellv6/tst_xdgshellv6.cpp
+++ b/tests/auto/client/xdgshellv6/tst_xdgshellv6.cpp
@@ -58,6 +58,14 @@ public:
return QWindow::event(event);
}
+ void exposeEvent(QExposeEvent *event) override
+ {
+ ++exposeEventCount;
+ QWindow::exposeEvent(event);
+ }
+
+ int exposeEventCount = 0;
+
signals:
void windowStateChangeEventReceived(uint oldState);
};
@@ -102,6 +110,7 @@ private slots:
void windowGeometrySimple();
void windowGeometryFixed();
void flushUnconfiguredXdgSurface();
+ void dontSpamExposeEvents();
private:
MockCompositor *m_compositor = nullptr;
@@ -395,6 +404,20 @@ void tst_WaylandClientXdgShellV6::flushUnconfiguredXdgSurface()
QVERIFY(window.isExposed());
}
+void tst_WaylandClientXdgShellV6::dontSpamExposeEvents()
+{
+ TestWindow window;
+ window.show();
+
+ QSharedPointer<MockSurface> surface;
+ QTRY_VERIFY(surface = m_compositor->surface());
+ QTRY_VERIFY(window.exposeEventCount == 0);
+
+ m_compositor->sendShellSurfaceConfigure(surface);
+ QTRY_VERIFY(window.isExposed());
+ QTRY_VERIFY(window.exposeEventCount == 1);
+}
+
int main(int argc, char **argv)
{
setenv("XDG_RUNTIME_DIR", ".", 1);