Prevented crash and missing animation for shm clients.
authorSamuel Rødal <samuel.rodal@nokia.com>
Tue, 27 Mar 2012 11:16:36 +0000 (13:16 +0200)
committerSamuel Rødal <samuel.rodal@nokia.com>
Wed, 28 Mar 2012 19:45:20 +0000 (21:45 +0200)
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>
src/compositor/wayland_wrapper/wlsurface.cpp
src/plugins/platforms/wayland/qwaylandwindow.cpp

index fc2d8d9..1b1926e 100644 (file)
@@ -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();
 }
 
index 07a9c46..0273cd2 100644 (file)
@@ -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);