--- a/plugins/cube/cube.cpp +++ b/plugins/cube/cube.cpp @@ -553,8 +553,10 @@ { auto root = wf::get_core().scene(); auto children = root->get_children(); + // Rotating panels belong to the desktop pass, but launchers and + // other overlay surfaces must remain above every cube/held-view node. auto anchor = before ? before : - root->layers[(int)wf::scene::layer::OVERLAY]; + root->layers[(int)wf::scene::layer::TOP]; std::vector updated; updated.reserve(children.size() + 1); @@ -572,7 +574,7 @@ if (!inserted) { - // The built-in overlay layer is always present. Do not place + // The built-in top layer is always present. Do not place // desktop content above screensavers or locks if that changes. updated.push_back(node); } --- a/src/output/workspace-stream.cpp +++ b/src/output/workspace-stream.cpp @@ -49,8 +49,9 @@ for (auto& output_node : wf::collect_output_nodes(wf::get_core().scene(), self->output)) { // A workspace contains desktop content only. In particular, cube/expo - // subpasses must never fold a screensaver or lock into the desktop. - if (output_node == self->output->node_for_layer(scene::layer::SCREENSAVER) || + // subpasses must never fold a launcher, screensaver or lock into the desktop. + if (output_node == self->output->node_for_layer(scene::layer::OVERLAY) || + output_node == self->output->node_for_layer(scene::layer::SCREENSAVER) || output_node == self->output->node_for_layer(scene::layer::LOCK) || output_node == self->output->node_for_layer(scene::layer::DWIDGET)) { @@ -70,7 +71,6 @@ !rotate_namespace.empty() && (rotate_namespace == "*" || view->get_app_id() == rotate_namespace); - const bool render_as_desktop_environment = is_de && !rotate_this_de; const auto excluded_namespace = self->exclude_desktop_environment; const auto app_id = view ? view->get_app_id() : std::string{}; @@ -97,13 +97,15 @@ // We push the damage as-is for desktop environment views, because they are visible on // every workspace. ch->gen_render_instances(this->instances, - render_as_desktop_environment ? push_damage : translate_and_push_damage, self->output); + is_de ? push_damage : translate_and_push_damage, self->output); // Mark whether the instances were generated from a desktop environment view num_generated = this->instances.size() - num_generated; for (size_t i = 0; i < num_generated; i++) { - is_desktop_environment.push_back(render_as_desktop_environment); + // Inclusion in a rotating texture does not make a panel + // workspace-local: keep it visible and damaged on every face. + is_desktop_environment.push_back(is_de); } } }