src/osd.c: Ensure destroying views are not used as preview anchors

This commit is contained in:
Consolatis 2022-09-26 10:58:13 +02:00 committed by Johan Malm
parent c83c1beace
commit 92976f30d0
2 changed files with 11 additions and 8 deletions

View file

@ -216,6 +216,10 @@ desktop_cycle_view(struct server *server, struct view *start_view,
* - Pre-select the top view if NOT already focused * - Pre-select the top view if NOT already focused
* - Otherwise select the view second from the top * - Otherwise select the view second from the top
*/ */
/* Make sure to have all nodes in their actual ordering */
osd_preview_restore(server);
if (!start_view) { if (!start_view) {
start_view = first_view(server); start_view = first_view(server);
if (!start_view || start_view != desktop_focused_view(server)) { if (!start_view || start_view != desktop_focused_view(server)) {
@ -233,9 +237,6 @@ desktop_cycle_view(struct server *server, struct view *start_view,
/* Scene nodes are ordered like last node == displayed topmost */ /* Scene nodes are ordered like last node == displayed topmost */
iter = dir == LAB_CYCLE_DIR_FORWARD ? get_prev_item : get_next_item; iter = dir == LAB_CYCLE_DIR_FORWARD ? get_prev_item : get_next_item;
/* Make sure to have all nodes in their actual ordering */
osd_preview_restore(server);
do { do {
list_item = iter(list_item); list_item = iter(list_item);
if (list_item == list_head) { if (list_item == list_head) {

View file

@ -124,6 +124,8 @@ osd_on_view_destroy(struct view *view)
* If we are the current OSD selected view, cycle * If we are the current OSD selected view, cycle
* to the next because we are dying. * to the next because we are dying.
*/ */
/* Also resets preview node */
osd_state->cycle_view = desktop_cycle_view(view->server, osd_state->cycle_view = desktop_cycle_view(view->server,
osd_state->cycle_view, LAB_CYCLE_DIR_BACKWARD); osd_state->cycle_view, LAB_CYCLE_DIR_BACKWARD);
@ -137,6 +139,11 @@ osd_on_view_destroy(struct view *view)
} }
} }
if (osd_state->cycle_view) {
/* Update the OSD to reflect the view has now gone. */
osd_update(view->server);
}
if (view->scene_tree) { if (view->scene_tree) {
struct wlr_scene_node *node = &view->scene_tree->node; struct wlr_scene_node *node = &view->scene_tree->node;
if (osd_state->preview_anchor == node) { if (osd_state->preview_anchor == node) {
@ -147,11 +154,6 @@ osd_on_view_destroy(struct view *view)
osd_state->preview_anchor = lab_wlr_scene_get_prev_node(node); 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 void