diff --git a/src/Compositor.cpp b/src/Compositor.cpp index 14f9ee63..e00c8c36 100644 --- a/src/Compositor.cpp +++ b/src/Compositor.cpp @@ -2692,6 +2692,16 @@ void CCompositor::registerWorkspace(PHLWORKSPACE w) { w->m_events.destroy.listenStatic([this, weak = PHLWORKSPACEREF{w}] { std::erase(m_workspaces, weak); }); } +std::vector CCompositor::getWorkspacesCopy() { + std::vector wsp; + auto range = getWorkspaces(); + wsp.reserve(std::ranges::distance(range)); + for (auto& r : range) { + wsp.emplace_back(r.lock()); + } + return wsp; +} + void CCompositor::performUserChecks() { static auto PNOCHECKXDG = CConfigValue("misc:disable_xdg_env_checks"); static auto PNOCHECKQTUTILS = CConfigValue("misc:disable_hyprland_qtutils_check"); diff --git a/src/Compositor.hpp b/src/Compositor.hpp index c76a73b2..d18b5a93 100644 --- a/src/Compositor.hpp +++ b/src/Compositor.hpp @@ -79,7 +79,8 @@ class CCompositor { auto getWorkspaces() { return std::views::filter(m_workspaces, [](const auto& e) { return e; }); } - void registerWorkspace(PHLWORKSPACE w); + std::vector getWorkspacesCopy(); + void registerWorkspace(PHLWORKSPACE w); // diff --git a/src/helpers/Monitor.cpp b/src/helpers/Monitor.cpp index 63f1d147..87990009 100644 --- a/src/helpers/Monitor.cpp +++ b/src/helpers/Monitor.cpp @@ -216,12 +216,12 @@ void CMonitor::onConnect(bool noRule) { setupDefaultWS(monitorRule); - for (auto const& ws : g_pCompositor->getWorkspaces()) { - if (!valid(ws.lock())) + for (auto const& ws : g_pCompositor->getWorkspacesCopy()) { + if (!valid(ws)) continue; if (ws->m_lastMonitor == m_name || g_pCompositor->m_monitors.size() == 1 /* avoid lost workspaces on recover */) { - g_pCompositor->moveWorkspaceToMonitor(ws.lock(), m_self.lock()); + g_pCompositor->moveWorkspaceToMonitor(ws, m_self.lock()); ws->startAnim(true, true, true); ws->m_lastMonitor = ""; }