From 8b12b50137859fef979b46c1ab9c84465b60a95a Mon Sep 17 00:00:00 2001 From: tokyo4j Date: Tue, 13 Aug 2024 10:02:46 +0900 Subject: [PATCH] xdg: destroy foreign toplevel handle on unmap xdg-shell protocol says: All active operations (e.g., move, resize) are canceled and all attributes (e.g. title, state, stacking, ...) are discarded for an xdg_toplevel surface when it is unmapped. So, when a xdg-toplevel is unmapped (not minimized), the corresponding foreign handler should be destroyed to reset attributes. --- src/xdg.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/xdg.c b/src/xdg.c index b75f864f..23bceba2 100644 --- a/src/xdg.c +++ b/src/xdg.c @@ -651,8 +651,6 @@ xdg_toplevel_view_map(struct view *view) struct wlr_xdg_surface *xdg_surface = xdg_surface_from_view(view); wlr_scene_node_set_enabled(&view->scene_tree->node, true); if (!view->been_mapped) { - init_foreign_toplevel(view); - if (view_wants_decorations(view)) { view_set_ssd_mode(view, LAB_SSD_MODE_FULL); } else { @@ -687,6 +685,11 @@ xdg_toplevel_view_map(struct view *view) view_moved(view); } + if (!view->toplevel.handle) { + init_foreign_toplevel(view); + foreign_toplevel_update_outputs(view); + } + view_impl_map(view); view->been_mapped = true; } @@ -699,6 +702,15 @@ xdg_toplevel_view_unmap(struct view *view, bool client_request) wlr_scene_node_set_enabled(&view->scene_tree->node, false); view_impl_unmap(view); } + + /* + * If the view was explicitly unmapped by the client (rather + * than just minimized), destroy the foreign toplevel handle so + * the unmapped view doesn't show up in panels and the like. + */ + if (client_request && view->toplevel.handle) { + wlr_foreign_toplevel_handle_v1_destroy(view->toplevel.handle); + } } static pid_t