summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorSamuel Rødal <samuel.rodal@nokia.com>2012-03-27 13:16:36 +0200
committerSamuel Rødal <samuel.rodal@nokia.com>2012-03-28 21:45:20 +0200
commit37c36d4658ed9552b996b032d9fa1c6b84b14b5b (patch)
tree1f5d1a6e24b3ced284a44f8920ac7595ebcfd881 /src
parent55bbecad0ec75bc942aa0ca73a228fc2d58c8105 (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.cpp21
-rw-r--r--src/plugins/platforms/wayland/qwaylandwindow.cpp7
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);