diff --git a/src/miral/basic_window_manager.cpp b/src/miral/basic_window_manager.cpp index e6c05714b6..25bf764316 100644 --- a/src/miral/basic_window_manager.cpp +++ b/src/miral/basic_window_manager.cpp @@ -294,28 +294,16 @@ void miral::BasicWindowManager::refocus( // Try to activate to recently active window of any application in a shared workspace { miral::Window new_focus; - auto workspaces_containing_window_mut = workspaces_containing_window; - // Need to sort only once std::sort(workspaces_containing_window_mut.begin(), workspaces_containing_window_mut.end()); - mru_active_windows.enumerate([&](miral::Window& other_window) + mru_active_windows.enumerate( + [&](miral::Window& other_window) { - if(!info_for(other_window).is_visible()) return true; - - auto workspaces_containing_other_window = workspaces_containing(other_window); - std::sort(workspaces_containing_other_window.begin(), workspaces_containing_other_window.end()); - - auto intersection = std::vector>(); + if (!info_for(other_window).is_visible()) + return true; - std::set_intersection( - workspaces_containing_window_mut.begin(), - workspaces_containing_window_mut.end(), - workspaces_containing_other_window.begin(), - workspaces_containing_other_window.end(), - std::back_inserter(intersection)); - - if(!intersection.empty()) + if (window_workspaces_intersect(workspaces_containing_window_mut, other_window)) return !(new_focus = select_active_window(other_window)); return true; @@ -2999,3 +2987,20 @@ void miral::BasicWindowManager::move_cursor_to(mir::geometry::PointF point) }); }); } + +auto miral::BasicWindowManager::window_workspaces_intersect(std::vector> const& w1_workspaces, Window const& w2) const -> bool +{ + auto w2_workspaces = workspaces_containing(w2); + std::sort(w2_workspaces.begin(), w2_workspaces.end()); + + auto intersection = std::vector>(); + + std::set_intersection( + w1_workspaces.begin(), + w1_workspaces.end(), + w2_workspaces.begin(), + w2_workspaces.end(), + std::back_inserter(intersection)); + + return !intersection.empty(); +} diff --git a/src/miral/basic_window_manager.h b/src/miral/basic_window_manager.h index f2ac8ed19e..da8a0473ae 100644 --- a/src/miral/basic_window_manager.h +++ b/src/miral/basic_window_manager.h @@ -332,6 +332,10 @@ class BasicWindowManager : public virtual mir::shell::WindowManager, void for_each_descendent_in(WindowInfo const& info, std::function func); /// Gathers windows provided WindowInfo auto collect_windows(WindowInfo const& info) -> SurfaceSet; + + // w1_workspaces must be sorted + auto window_workspaces_intersect( + std::vector> const& w1_workspaces, Window const& w2) const -> bool; }; }