From 1b91e1131ed837f4a6e04bf29a876ff30f01c33e Mon Sep 17 00:00:00 2001 From: Ilia Bozhinov Date: Fri, 26 Dec 2025 10:49:25 +0100 Subject: [PATCH 1/2] switcher: render views in stacking order Fixes #2907 --- plugins/single_plugins/switcher.cpp | 30 ++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/plugins/single_plugins/switcher.cpp b/plugins/single_plugins/switcher.cpp index ec217688c..643d473a1 100644 --- a/plugins/single_plugins/switcher.cpp +++ b/plugins/single_plugins/switcher.cpp @@ -706,6 +706,31 @@ class WayfireSwitcher : public wf::per_output_plugin_instance_t, public wf::keyb render_view_scene(sv.view, buffer); } + std::vector calculate_render_order() + { + auto sorted_views = output->wset()->get_views(wf::WSET_SORT_STACKING); + std::map view_order; + for (size_t i = 0; i < sorted_views.size(); i++) + { + view_order[sorted_views[i]] = i; + } + + std::vector render_order; + for (auto& sv : views) + { + render_order.push_back(&sv); + } + + std::sort(render_order.begin(), render_order.end(), + [&] (SwitcherView* a, SwitcherView* b) + { + /* Render in the reverse order because we don't use depth testing */ + return view_order[a->view] > view_order[b->view]; + }); + + return render_order; + } + void render(const wf::scene::render_instruction_t& data) { data.pass->clear(data.target.geometry, {0, 0, 0, 1}); @@ -716,10 +741,9 @@ class WayfireSwitcher : public wf::per_output_plugin_instance_t, public wf::keyb render_view_scene(view, local_target); } - /* Render in the reverse order because we don't use depth testing */ - for (auto& view : wf::reverse(views)) + for (auto view : calculate_render_order()) { - render_view(view, local_target); + render_view(*view, local_target); } for (auto view : get_overlay_views()) From 34361f466c387bbd6809ec1580f2babd8662d37e Mon Sep 17 00:00:00 2001 From: Ilia Bozhinov Date: Fri, 26 Dec 2025 10:49:47 +0100 Subject: [PATCH 2/2] fixup! switcher: render views in stacking order --- plugins/single_plugins/switcher.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/single_plugins/switcher.cpp b/plugins/single_plugins/switcher.cpp index 643d473a1..e058ca340 100644 --- a/plugins/single_plugins/switcher.cpp +++ b/plugins/single_plugins/switcher.cpp @@ -722,7 +722,7 @@ class WayfireSwitcher : public wf::per_output_plugin_instance_t, public wf::keyb } std::sort(render_order.begin(), render_order.end(), - [&] (SwitcherView* a, SwitcherView* b) + [&] (SwitcherView *a, SwitcherView *b) { /* Render in the reverse order because we don't use depth testing */ return view_order[a->view] > view_order[b->view];