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,
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,
};
/**
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)
{
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;
/* 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);
}
}
/*
* 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 */
cursor_update_focus(server);
}
}
-
* 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