From 0ff72e53745cc0426e593cd18436ceb51011d5f1 Mon Sep 17 00:00:00 2001 From: Daniel Stone Date: Thu, 22 Jun 2023 17:20:42 +0100 Subject: [PATCH] surface: Ensure view is unmapped before destroy signal When the destroy signal is fired, child views will disassociate themselves from the parent. This means that we can no longer see what the child views are - and that recursive unmapping does not work. Make sure that views are fully unmapped before anything else happens in destroy, so we can recursively unmap child views. Signed-off-by: Daniel Stone --- libweston/compositor.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/libweston/compositor.c b/libweston/compositor.c index edeb8784b..d32271b6c 100644 --- a/libweston/compositor.c +++ b/libweston/compositor.c @@ -2156,16 +2156,15 @@ WL_EXPORT void weston_view_destroy(struct weston_view *view) { struct weston_paint_node *pnode, *pntmp; + struct weston_compositor *compositor = view->surface->compositor; + + if (weston_view_is_mapped(view)) + weston_view_unmap(view); weston_signal_emit_mutable(&view->destroy_signal, view); assert(wl_list_empty(&view->geometry.child_list)); - if (weston_view_is_mapped(view)) { - weston_view_unmap(view); - weston_compositor_build_view_list(view->surface->compositor); - } - wl_list_for_each_safe(pnode, pntmp, &view->paint_node_list, view_link) weston_paint_node_destroy(pnode); @@ -2183,6 +2182,8 @@ weston_view_destroy(struct weston_view *view) wl_list_remove(&view->surface_link); free(view); + + weston_compositor_build_view_list(compositor); } WL_EXPORT struct weston_surface *