summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorVaxry <vaxry@vaxry.net>2025-07-28 22:08:05 +0200
committerVaxry <vaxry@vaxry.net>2025-07-28 22:08:05 +0200
commitabe29647ae9cf2e6bd40784790b3d99fcc962613 (patch)
treec64372390f0319d0bcb119f16941856f7e6b8575 /src
parentc63d0003a1e5155248695f19778f815a8ad34c67 (diff)
monitor: fix crash on mutating workspace vec
fixes #11236
Diffstat (limited to 'src')
-rw-r--r--src/Compositor.cpp10
-rw-r--r--src/Compositor.hpp3
-rw-r--r--src/helpers/Monitor.cpp6
3 files changed, 15 insertions, 4 deletions
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<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");
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<PHLWORKSPACE> 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 = "";
}