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.
This commit is contained in:
tokyo4j 2024-05-13 10:18:28 +09:00 committed by Consolatis
parent 6fe3df34ca
commit 1c8d347a61
2 changed files with 21 additions and 9 deletions

View file

@ -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;
}
}

View file

@ -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 *