From: tokyo4j Date: Mon, 13 May 2024 01:18:28 +0000 (+0900) Subject: desktop: show/hide `top` layer more smartly X-Git-Url: https://git.mdlowis.com/?a=commitdiff_plain;h=1c8d347a61bcb596865a544427d2eef50499162c;p=proto%2Flabwc.git desktop: show/hide `top` layer more smartly Before this commit, `top` layers were hidden whenever there is a fullscreen window in the corresponding output. With this commit, `top` layers are hidden only when there is a fullscreen window without other windows above it in the corresponding output. A caveat is that `bottom` layer is still always hidden by a fullscreen window. --- diff --git a/src/desktop.c b/src/desktop.c index 02843b71..58f87a1f 100644 --- a/src/desktop.c +++ b/src/desktop.c @@ -229,17 +229,23 @@ desktop_update_top_layer_visiblity(struct server *server) wlr_scene_node_set_enabled(&output->layer_tree[top]->node, true); } - /* And disable them again when there is a view in fullscreen */ - enum lab_view_criteria criteria = - LAB_VIEW_CRITERIA_CURRENT_WORKSPACE | LAB_VIEW_CRITERIA_FULLSCREEN; - for_each_view(view, &server->views, criteria) { + /* + * And disable them again when there is a fullscreen view without + * any views above it + */ + uint64_t outputs_covered = 0; + for_each_view(view, &server->views, LAB_VIEW_CRITERIA_CURRENT_WORKSPACE) { if (view->minimized) { continue; } if (!output_is_usable(view->output)) { continue; } - wlr_scene_node_set_enabled(&view->output->layer_tree[top]->node, false); + if (view->fullscreen && !(view->outputs & outputs_covered)) { + wlr_scene_node_set_enabled( + &view->output->layer_tree[top]->node, false); + } + outputs_covered |= view->outputs; } } diff --git a/src/view.c b/src/view.c index 25180c11..b10a39ae 100644 --- a/src/view.c +++ b/src/view.c @@ -387,16 +387,20 @@ view_update_outputs(struct view *view) struct output *output; struct wlr_output_layout *layout = view->server->output_layout; - view->outputs = 0; + uint64_t new_outputs = 0; wl_list_for_each(output, &view->server->outputs, link) { if (output_is_usable(output) && wlr_output_layout_intersects( layout, output->wlr_output, &view->current)) { - view->outputs |= (1ull << output->scene_output->index); + new_outputs |= (1ull << output->scene_output->index); } } - if (view->toplevel.handle) { - foreign_toplevel_update_outputs(view); + if (new_outputs != view->outputs) { + view->outputs = new_outputs; + if (view->toplevel.handle) { + foreign_toplevel_update_outputs(view); + } + desktop_update_top_layer_visiblity(view->server); } } @@ -2037,6 +2041,7 @@ view_move_to_front(struct view *view) } cursor_update_focus(view->server); + desktop_update_top_layer_visiblity(view->server); } void @@ -2050,6 +2055,7 @@ view_move_to_back(struct view *view) move_to_back(root); cursor_update_focus(view->server); + desktop_update_top_layer_visiblity(view->server); } struct view *