From fa6bffa6c686a92053017d495496cea89f9ec8ac Mon Sep 17 00:00:00 2001 From: tokyo4j Date: Mon, 17 Feb 2025 01:50:55 +0900 Subject: [PATCH] osd: prevent preview outlines from overlapping OSD in first output Following code didn't consider multi-monitor setup: wlr_scene_node_raise_to_top(&server->menu_tree->node); wlr_scene_node_raise_to_top(&output->osd_tree->node); ...because when executed twice, server->menu_tree is raised above output->osd_tree for the first output. This resulted in a scene tree like (higher to lower): - output->osd_tree (for 2nd output) - output->server->osd_state.preview_outline (placed just above menu_tree) - sever->menu_tree - output->osd_tree (for 1st output) So the previous outline for window switcher is placed above the OSD in the first output. --- src/output.c | 14 ++++++++------ src/server.c | 5 ----- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/src/output.c b/src/output.c index 2d805b10..2d0368a8 100644 --- a/src/output.c +++ b/src/output.c @@ -512,20 +512,22 @@ new_output_notify(struct wl_listener *listener, void *data) * bottom): * - session lock layer * - window switcher osd - * - compositor menu + * - (compositor menu) * - layer-shell popups * - overlay layer * - top layer - * - views + * - (views) * - bottom layer * - background layer */ wlr_scene_node_lower_to_bottom(&output->layer_tree[1]->node); wlr_scene_node_lower_to_bottom(&output->layer_tree[0]->node); - wlr_scene_node_raise_to_top(&output->layer_tree[2]->node); - wlr_scene_node_raise_to_top(&output->layer_tree[3]->node); - wlr_scene_node_raise_to_top(&output->layer_popup_tree->node); - wlr_scene_node_raise_to_top(&server->menu_tree->node); + + struct wlr_scene_node *menu_node = &server->menu_tree->node; + wlr_scene_node_place_below(&output->layer_tree[2]->node, menu_node); + wlr_scene_node_place_below(&output->layer_tree[3]->node, menu_node); + wlr_scene_node_place_below(&output->layer_popup_tree->node, menu_node); + wlr_scene_node_raise_to_top(&output->osd_tree->node); wlr_scene_node_raise_to_top(&output->session_lock_tree->node); diff --git a/src/server.c b/src/server.c index 7093903f..03fd5cd0 100644 --- a/src/server.c +++ b/src/server.c @@ -580,11 +580,6 @@ server_init(struct server *server) #if HAVE_XWAYLAND server->unmanaged_tree = wlr_scene_tree_create(&server->scene->tree); #endif - - /* - * menu_tree is moved to top in new_output_notify() when layer-shell - * layers are positioned - */ server->menu_tree = wlr_scene_tree_create(&server->scene->tree); workspaces_init(server);