summaryrefslogtreecommitdiff
path: root/gui-wm/wayfire/files/wayfire-0.11.0-cube-panel-overlay.patch
blob: eec1fb12d7f111787fe2eb5dec3366692f800244 (plain)
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);
                     }
                 }
             }