]> git.mdlowis.com Git - proto/labwc.git/commitdiff
osd: prevent preview outlines from overlapping OSD in first output
authortokyo4j <hrak1529@gmail.com>
Sun, 16 Feb 2025 16:50:55 +0000 (01:50 +0900)
committerJohan Malm <johanmalm@users.noreply.github.com>
Mon, 17 Feb 2025 15:41:44 +0000 (15:41 +0000)
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
src/server.c

index 2d805b10a446216dbcf5ccb420827e41a63c1767..2d0368a8f1fe374b4f8dd7f82985fdc9bfcfdaf1 100644 (file)
@@ -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);
 
index 7093903fa2076a5d5f4197a7e8ebf4152fa70157..03fd5cd0541eb2469633fdc69cf0cb61a62f57ef 100644 (file)
@@ -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);