diff options
author | Samuel Rødal <samuel.rodal@nokia.com> | 2012-03-27 13:16:36 +0200 |
---|---|---|
committer | Samuel Rødal <samuel.rodal@nokia.com> | 2012-03-28 21:45:20 +0200 |
commit | 37c36d4658ed9552b996b032d9fa1c6b84b14b5b (patch) | |
tree | 1f5d1a6e24b3ced284a44f8920ac7595ebcfd881 /src | |
parent | 55bbecad0ec75bc942aa0ca73a228fc2d58c8105 (diff) |
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 <gunnar.sletta@nokia.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/compositor/wayland_wrapper/wlsurface.cpp | 21 | ||||
-rw-r--r-- | 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 fc2d8d9de..1b1926e98 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 07a9c467f..0273cd294 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); |