monitor: fix crash on mutating workspace vec

fixes #11236
This commit is contained in:
Vaxry
2025-07-28 22:08:05 +02:00
parent c63d0003a1
commit abe29647ae
3 changed files with 15 additions and 4 deletions

View File

@@ -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<PHLWORKSPACE> CCompositor::getWorkspacesCopy() {
std::vector<PHLWORKSPACE> 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<Hyprlang::INT>("misc:disable_xdg_env_checks");
static auto PNOCHECKQTUTILS = CConfigValue<Hyprlang::INT>("misc:disable_hyprland_qtutils_check");

View File

@@ -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<PHLWORKSPACE> getWorkspacesCopy();
void registerWorkspace(PHLWORKSPACE w);
//

View File

@@ -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 = "";
}