diff --git a/include/labwc.h b/include/labwc.h index ead72349..c5d78aad 100644 --- a/include/labwc.h +++ b/include/labwc.h @@ -583,6 +583,8 @@ void osd_update(struct server *server); void osd_finish(struct server *server); /* Moves preview views back into their original stacking order and state */ void osd_preview_restore(struct server *server); +/* Notify OSD about a destroying view */ +void osd_on_view_destroy(struct view *view); /* * wlroots "input inhibitor" extension (required for swaylock) blocks diff --git a/src/osd.c b/src/osd.c index acfdade1..da6f5028 100644 --- a/src/osd.c +++ b/src/osd.c @@ -108,6 +108,52 @@ osd_update_preview_outlines(struct view *view) wlr_scene_node_set_position(&rect->tree->node, geo.x, geo.y); } +void +osd_on_view_destroy(struct view *view) +{ + assert(view); + struct osd_state *osd_state = &view->server->osd_state; + + if (!osd_state->cycle_view) { + /* OSD not active, no need for clean up */ + return; + } + + if (osd_state->cycle_view == view) { + /* + * If we are the current OSD selected view, cycle + * to the next because we are dying. + */ + osd_state->cycle_view = desktop_cycle_view(view->server, + osd_state->cycle_view, LAB_CYCLE_DIR_BACKWARD); + + /* + * If we cycled back to ourselves, then we have no more windows. + * Just close the OSD for good. + */ + if (osd_state->cycle_view == view || !osd_state->cycle_view) { + /* osd_finish() additionally resets cycle_view to NULL */ + osd_finish(view->server); + } + } + + if (view->scene_tree) { + struct wlr_scene_node *node = &view->scene_tree->node; + if (osd_state->preview_anchor == node) { + /* + * If we are the anchor for the current OSD selected view, + * replace the anchor with the node before us. + */ + osd_state->preview_anchor = lab_wlr_scene_get_prev_node(node); + } + } + + if (osd_state->cycle_view) { + /* Update the OSD to reflect the view has now gone. */ + osd_update(view->server); + } +} + void osd_finish(struct server *server) { diff --git a/src/view.c b/src/view.c index fa3a51ca..68ccd17b 100644 --- a/src/view.c +++ b/src/view.c @@ -809,41 +809,11 @@ view_destroy(struct view *view) server->focused_view = NULL; } - struct osd_state *osd_state = &view->server->osd_state; - if (osd_state->cycle_view == view) { - /* - * If we are the current OSD selected view, cycle - * to the next because we are dying. - */ - osd_state->cycle_view = desktop_cycle_view(server, - osd_state->cycle_view, LAB_CYCLE_DIR_BACKWARD); - - /* - * If we cycled back to ourselves, then we have no windows. - * just remove it and close the OSD for good. - */ - if (osd_state->cycle_view == view || !osd_state->cycle_view) { - /* osd_finish() additionally resets cycle_view to NULL */ - osd_finish(server); - } - } - - if (osd_state->cycle_view) { - /* Update the OSD to reflect the view has now gone. */ - osd_update(server); - } + osd_on_view_destroy(view); if (view->scene_tree) { - struct wlr_scene_node *node = &view->scene_tree->node; - if (osd_state->preview_anchor == node) { - /* - * If we are the anchor for the current OSD selected view, - * replace the anchor with the node before us. - */ - osd_state->preview_anchor = lab_wlr_scene_get_prev_node(node); - } ssd_destroy(view); - wlr_scene_node_destroy(node); + wlr_scene_node_destroy(&view->scene_tree->node); view->scene_tree = NULL; }