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;
}
}
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);
}
}
}
cursor_update_focus(view->server);
+ desktop_update_top_layer_visiblity(view->server);
}
void
move_to_back(root);
cursor_update_focus(view->server);
+ desktop_update_top_layer_visiblity(view->server);
}
struct view *