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
This commit is contained in:
committed by
Kristian Høgsberg
parent
e492549536
commit
27b1793857
+6
-1
@@ -93,6 +93,9 @@ static void
|
||||
weston_output_transform_scale_init(struct weston_output *output,
|
||||
uint32_t transform, uint32_t scale);
|
||||
|
||||
static void
|
||||
weston_compositor_build_surface_list(struct weston_compositor *compositor);
|
||||
|
||||
WL_EXPORT int
|
||||
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));
|
||||
|
||||
if (weston_surface_is_mapped(surface))
|
||||
if (weston_surface_is_mapped(surface)) {
|
||||
weston_surface_unmap(surface);
|
||||
weston_compositor_build_surface_list(compositor);
|
||||
}
|
||||
|
||||
wl_list_for_each_safe(cb, next,
|
||||
&surface->pending.frame_callback_list, link)
|
||||
|
||||
Reference in New Issue
Block a user