From: Consolatis <35009135+Consolatis@users.noreply.github.com> Date: Fri, 10 Nov 2023 22:58:25 +0000 (+0100) Subject: Update top layer visiblity on workspace switch X-Git-Url: https://git.mdlowis.com/?a=commitdiff_plain;h=13d0b14;p=proto%2Flabwc.git Update top layer visiblity on workspace switch Fixes: #1158 --- diff --git a/include/labwc.h b/include/labwc.h index de2c972b..aef85f18 100644 --- a/include/labwc.h +++ b/include/labwc.h @@ -393,6 +393,12 @@ void desktop_arrange_all_views(struct server *server); void desktop_focus_output(struct output *output); struct view *desktop_topmost_focusable_view(struct server *server); +/** + * Toggles the (output local) visibility of the layershell top layer + * based on the existence of a fullscreen window on the current workspace. + */ +void desktop_update_top_layer_visiblity(struct server *server); + enum lab_cycle_dir { LAB_CYCLE_DIR_NONE, LAB_CYCLE_DIR_FORWARD, diff --git a/include/view.h b/include/view.h index d17ebad5..663c53e1 100644 --- a/include/view.h +++ b/include/view.h @@ -225,8 +225,9 @@ struct xdg_toplevel_view { enum lab_view_criteria { LAB_VIEW_CRITERIA_NONE = 0, LAB_VIEW_CRITERIA_CURRENT_WORKSPACE = 1 << 0, - LAB_VIEW_CRITERIA_NO_ALWAYS_ON_TOP = 1 << 1, - LAB_VIEW_CRITERIA_NO_SKIP_WINDOW_SWITCHER = 1 << 2, + LAB_VIEW_CRITERIA_FULLSCREEN = 1 << 1, + LAB_VIEW_CRITERIA_NO_ALWAYS_ON_TOP = 1 << 2, + LAB_VIEW_CRITERIA_NO_SKIP_WINDOW_SWITCHER = 1 << 3, }; /** diff --git a/src/desktop.c b/src/desktop.c index 9eb54945..d442d36c 100644 --- a/src/desktop.c +++ b/src/desktop.c @@ -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) { diff --git a/src/view.c b/src/view.c index 4bafe7cd..ee5b92c4 100644 --- a/src/view.c +++ b/src/view.c @@ -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); } } - diff --git a/src/workspaces.c b/src/workspaces.c index 602133cf..ae333a4f 100644 --- a/src/workspaces.c +++ b/src/workspaces.c @@ -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