From 37c36d4658ed9552b996b032d9fa1c6b84b14b5b Mon Sep 17 00:00:00 2001 From: =?utf8?q?Samuel=20R=C3=B8dal?= Date: Tue, 27 Mar 2012 13:16:36 +0200 Subject: [PATCH] Prevented crash and missing animation for shm clients. Do the delayed attach _before_ we call handleExposeEvent(), which might in turn lead to a damage being called before any buffer is attached. Change-Id: I55ef4f0de1b3ec201e727cebc52cfd891963b2b4 Reviewed-by: Gunnar Sletta --- src/compositor/wayland_wrapper/wlsurface.cpp | 21 +++++++++------------ src/plugins/platforms/wayland/qwaylandwindow.cpp | 7 ++++--- 2 files changed, 13 insertions(+), 15 deletions(-) diff --git a/src/compositor/wayland_wrapper/wlsurface.cpp b/src/compositor/wayland_wrapper/wlsurface.cpp index fc2d8d9..1b1926e 100644 --- a/src/compositor/wayland_wrapper/wlsurface.cpp +++ b/src/compositor/wayland_wrapper/wlsurface.cpp @@ -393,18 +393,15 @@ void Surface::attach(struct wl_buffer *buffer) void Surface::damage(const QRect &rect) { - if (m_bufferQueue.size()) { - SurfaceBuffer *surfaceBuffer = m_bufferQueue.last(); - if (surfaceBuffer) - surfaceBuffer->setDamage(rect); - else - qWarning() << "Surface::damage() null buffer"; - if (!m_backBuffer) - advanceBufferQueue(); - } else { - // we've receicved a second damage for the same buffer - currentSurfaceBuffer()->setDamage(rect); - } + SurfaceBuffer *surfaceBuffer = m_bufferQueue.isEmpty() ? currentSurfaceBuffer() : m_bufferQueue.last(); + if (surfaceBuffer) + surfaceBuffer->setDamage(rect); + else + qWarning() << "Surface::damage() null buffer"; + + if (!m_bufferQueue.isEmpty() && !m_backBuffer) + advanceBufferQueue(); + doUpdate(); } diff --git a/src/plugins/platforms/wayland/qwaylandwindow.cpp b/src/plugins/platforms/wayland/qwaylandwindow.cpp index 07a9c46..0273cd2 100644 --- a/src/plugins/platforms/wayland/qwaylandwindow.cpp +++ b/src/plugins/platforms/wayland/qwaylandwindow.cpp @@ -122,14 +122,15 @@ void QWaylandWindow::setVisible(bool visible) { if (visible) { + if (mBuffer) + wl_surface_attach(mSurface, mBuffer->buffer(), 0, 0); + if (!mSentInitialResize) { QWindowSystemInterface::handleSynchronousGeometryChange(window(), geometry()); mSentInitialResize = true; } + QWindowSystemInterface::handleSynchronousExposeEvent(window(), QRect(QPoint(), geometry().size())); - if (mBuffer) { - wl_surface_attach(mSurface, mBuffer->buffer(),0,0); - } } else { QWindowSystemInterface::handleSynchronousExposeEvent(window(), QRect(QPoint(), geometry().size())); wl_surface_attach(mSurface, 0,0,0); -- 2.7.4