Update top layer visiblity on workspace switch

Fixes: #1158
This commit is contained in:
Consolatis 2023-11-10 23:58:25 +01:00 committed by Johan Malm
parent 98bf316ee6
commit 13d0b14244
5 changed files with 48 additions and 11 deletions

View file

@ -289,6 +289,32 @@ desktop_focus_output(struct output *output)
cursor_update_focus(output->server);
}
void
desktop_update_top_layer_visiblity(struct server *server)
{
struct view *view;
struct output *output;
uint32_t top = ZWLR_LAYER_SHELL_V1_LAYER_TOP;
/* Enable all top layers */
wl_list_for_each(output, &server->outputs, link) {
if (!output_is_usable(output)) {
continue;
}
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) {
if (!output_is_usable(view->output)) {
continue;
}
wlr_scene_node_set_enabled(&view->output->layer_tree[top]->node, false);
}
}
static struct wlr_surface *
get_surface_from_layer_node(struct wlr_scene_node *node)
{

View file

@ -100,6 +100,11 @@ matches_criteria(struct view *view, enum lab_view_criteria criteria)
return false;
}
}
if (criteria & LAB_VIEW_CRITERIA_FULLSCREEN) {
if (!view->fullscreen) {
return false;
}
}
if (criteria & LAB_VIEW_CRITERIA_NO_ALWAYS_ON_TOP) {
if (view_is_always_on_top(view)) {
return false;
@ -1122,9 +1127,7 @@ set_fullscreen(struct view *view, bool fullscreen)
/* Show fullscreen views above top-layer */
if (view->output) {
uint32_t top = ZWLR_LAYER_SHELL_V1_LAYER_TOP;
wlr_scene_node_set_enabled(&view->output->layer_tree[top]->node,
!fullscreen);
desktop_update_top_layer_visiblity(view->server);
}
}
@ -1662,13 +1665,12 @@ view_destroy(struct view *view)
/*
* The layer-shell top-layer is disabled when an application is running
* in fullscreen mode, so if that's the case, we have to re-enable it
* here.
* in fullscreen mode, so if that's the case, we may have to re-enable
* it here.
*/
if (view->fullscreen && view->output) {
uint32_t top = ZWLR_LAYER_SHELL_V1_LAYER_TOP;
wlr_scene_node_set_enabled(&view->output->layer_tree[top]->node,
true);
view->fullscreen = false;
desktop_update_top_layer_visiblity(server);
}
/* If we spawned a window menu, close it */
@ -1685,4 +1687,3 @@ view_destroy(struct view *view)
cursor_update_focus(server);
}
}

View file

@ -302,6 +302,9 @@ workspaces_switch_to(struct workspace *target, bool update_focus)
* cursor image from the previous desktop
*/
cursor_update_focus(server);
/* Ensure that only currently visible fullscreen windows hide the top layer */
desktop_update_top_layer_visiblity(server);
}
void