diff options
author | Johan Klokkhammer Helsing <johan.helsing@qt.io> | 2018-10-12 10:36:23 +0200 |
---|---|---|
committer | Johan Helsing <johan.helsing@qt.io> | 2018-10-26 11:05:07 +0000 |
commit | 16a98829a664403f2fb8962884701f5d4d31cacd (patch) | |
tree | dc294a64f88b705b9aa9f5db8f532e1187bd62ee | |
parent | 88a0246a46c30e08e9730d16cf8739773447d058 (diff) | |
download | qtwayland-16a98829a664403f2fb8962884701f5d4d31cacd.tar.gz |
Client: Don't spam expose events
Only send expose event when the geometry actually changed.
Change-Id: Ic06986ce5d11e0ff7a842303f57093b8ff25b9f6
Reviewed-by: Paul Olav Tvete <paul.tvete@qt.io>
Reviewed-by: David Edmundson <davidedmundson@kde.org>
-rw-r--r-- | src/client/qwaylandwindow.cpp | 5 | ||||
-rw-r--r-- | src/client/qwaylandwindow_p.h | 1 | ||||
-rw-r--r-- | tests/auto/client/xdgshellv6/tst_xdgshellv6.cpp | 23 |
3 files changed, 28 insertions, 1 deletions
diff --git a/src/client/qwaylandwindow.cpp b/src/client/qwaylandwindow.cpp index 1801c2a4..4ac2ca51 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 ad24b735..56ebd3cc 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 3fd8153e..3c822325 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); |