1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
--- 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<wf::scene::node_ptr> 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);
}
}
}
|