compositor: rebuild the global list if we've removed a surface from it

The list of surfaces used by weston_compositor_pick_surface() is
maintained in list of surfaces stored on the compositor. This list is
generated from the surfaces across all the layers using
weston_compositor_build_surface_list.

When destroying a surface the surface is "unmapped" with
weston_surface_unmap which removes it from the layer list. However since
the compositor surface list was only being rebuilt when the output was
repainted a call to weston_compositor_pick_surface before the next
output repaint would use an outdated surface list containing surfaces
that have been partially destroyed.

https://bugs.freedesktop.org/show_bug.cgi?id=65986
https://bugs.freedesktop.org/show_bug.cgi?id=66173
https://bugs.freedesktop.org/show_bug.cgi?id=66198
dev
Rob Bradford 12 years ago committed by Kristian Høgsberg
parent e492549536
commit 27b1793857
  1. 7
      src/compositor.c

@ -93,6 +93,9 @@ static void
weston_output_transform_scale_init(struct weston_output *output, weston_output_transform_scale_init(struct weston_output *output,
uint32_t transform, uint32_t scale); uint32_t transform, uint32_t scale);
static void
weston_compositor_build_surface_list(struct weston_compositor *compositor);
WL_EXPORT int WL_EXPORT int
weston_output_switch_mode(struct weston_output *output, struct weston_mode *mode, int32_t scale) weston_output_switch_mode(struct weston_output *output, struct weston_mode *mode, int32_t scale)
{ {
@ -1011,8 +1014,10 @@ weston_surface_destroy(struct weston_surface *surface)
assert(wl_list_empty(&surface->subsurface_list_pending)); assert(wl_list_empty(&surface->subsurface_list_pending));
assert(wl_list_empty(&surface->subsurface_list)); assert(wl_list_empty(&surface->subsurface_list));
if (weston_surface_is_mapped(surface)) if (weston_surface_is_mapped(surface)) {
weston_surface_unmap(surface); weston_surface_unmap(surface);
weston_compositor_build_surface_list(compositor);
}
wl_list_for_each_safe(cb, next, wl_list_for_each_safe(cb, next,
&surface->pending.frame_callback_list, link) &surface->pending.frame_callback_list, link)

Loading…
Cancel
Save