]> git.mdlowis.com Git - proto/labwc.git/commitdiff
Update top layer visiblity on workspace switch
authorConsolatis <35009135+Consolatis@users.noreply.github.com>
Fri, 10 Nov 2023 22:58:25 +0000 (23:58 +0100)
committerJohan Malm <johanmalm@users.noreply.github.com>
Sun, 12 Nov 2023 17:39:00 +0000 (17:39 +0000)
Fixes: #1158
include/labwc.h
include/view.h
src/desktop.c
src/view.c
src/workspaces.c

index de2c972bac2dc0f6d3a045bf0cd4affbe2a54ea9..aef85f1851ee6ff8fb7329bb05c0b69ed8f2c4b3 100644 (file)
@@ -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,
index d17ebad5885df9a70c1af53e93ef6c67e536deb3..663c53e17e345841d106296e4ea8ec193c26d5bb 100644 (file)
@@ -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,
 };
 
 /**
index 9eb54945b93de86468ec09dae3b396e3319caddf..d442d36cf1aff47f1d617338febc009956715681 100644 (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)
 {
index 4bafe7cd068ca6b54542b98e78256738fa748e7b..ee5b92c44d2235a2b93693b521c51781cfb55871 100644 (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);
        }
 }
-
index 602133cfd47406bd4bc585370a75542dcdce5786..ae333a4ff9f0cc70ac7c884fc39f164d28aca1f6 100644 (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