compositor: Flush surface damage to surface below on destroy
authorKristian Høgsberg <krh@bitplanet.net>
Thu, 19 Jan 2012 02:41:37 +0000 (21:41 -0500)
committerKristian Høgsberg <krh@bitplanet.net>
Thu, 19 Jan 2012 02:41:37 +0000 (21:41 -0500)
When we destroy a surface, we damage the surface below so that the area
exposed by the disappearing surface will be repainted.  However, if that
surface also is destroyed, the damage information is lost and we fail to
repaint that area.

This commit introduces weston_surface_flush_damage(), which flushes the
surface damage the the surface below when a surface is destroyed.  When
multiple surfaces are destroyed at the same time, the damage now accumulates
and sinks down through the surface stack as it should.

src/compositor.c

index 2e0a3f8..5b5bcc7 100644 (file)
@@ -287,6 +287,21 @@ weston_surface_damage_below(struct weston_surface *surface)
        weston_compositor_schedule_repaint(surface->compositor);
 }
 
+static void
+weston_surface_flush_damage(struct weston_surface *surface)
+{
+       struct weston_surface *below;
+
+       if (surface->output &&
+           surface->link.next != &surface->compositor->surface_list) {
+               below = container_of(surface->link.next,
+                                    struct weston_surface, link);
+
+               pixman_region32_union(&below->damage,
+                                     &below->damage, &surface->damage);
+       }
+}
+
 WL_EXPORT void
 weston_surface_configure(struct weston_surface *surface,
                         int x, int y, int width, int height)
@@ -376,6 +391,7 @@ destroy_surface(struct wl_resource *resource)
        struct weston_compositor *compositor = surface->compositor;
 
        weston_surface_damage_below(surface);
+       weston_surface_flush_damage(surface);
 
        wl_list_remove(&surface->link);
        weston_compositor_repick(compositor);