summaryrefslogtreecommitdiff
path: root/src/Compositor.cpp
diff options
context:
space:
mode:
authorVaxry <43317083+vaxerski@users.noreply.github.com>2025-07-27 18:46:23 +0200
committerGitHub <noreply@github.com>2025-07-27 18:46:23 +0200
commitc63d0003a1e5155248695f19778f815a8ad34c67 (patch)
tree9bf619bbec83cbcb098840b39c838012ecba611b /src/Compositor.cpp
parent5d4b4ecbfb117c36385a454aba0ef897398f5e74 (diff)
core: fix workspace persistence tracking (#11239)
Diffstat (limited to 'src/Compositor.cpp')
-rw-r--r--src/Compositor.cpp31
1 files changed, 27 insertions, 4 deletions
diff --git a/src/Compositor.cpp b/src/Compositor.cpp
index cf1a7cb4..14f9ee63 100644
--- a/src/Compositor.cpp
+++ b/src/Compositor.cpp
@@ -3109,6 +3109,8 @@ void CCompositor::ensurePersistentWorkspacesPresent(const std::vector<SWorkspace
if (!m_lastMonitor)
return;
+ std::vector<PHLWORKSPACE> persistentFound;
+
for (const auto& rule : rules) {
if (!rule.isPersistent)
continue;
@@ -3142,17 +3144,20 @@ void CCompositor::ensurePersistentWorkspacesPresent(const std::vector<SWorkspace
}
PWORKSPACE = getWorkspaceByID(id);
if (!PWORKSPACE)
- createNewWorkspace(id, PMONITOR ? PMONITOR->m_id : m_lastMonitor->m_id, wsname, false);
+ PWORKSPACE = createNewWorkspace(id, PMONITOR ? PMONITOR->m_id : m_lastMonitor->m_id, wsname, false);
}
- if (PWORKSPACE)
- PWORKSPACE->m_persistent = true;
-
if (!PMONITOR) {
Debug::log(ERR, "ensurePersistentWorkspacesPresent: couldn't resolve monitor for {}, skipping", rule.monitor);
continue;
}
+ if (PWORKSPACE)
+ PWORKSPACE->setPersistent(true);
+
+ if (!pWorkspace)
+ persistentFound.emplace_back(PWORKSPACE);
+
if (PWORKSPACE) {
if (PWORKSPACE->m_monitor == PMONITOR) {
Debug::log(LOG, "ensurePersistentWorkspacesPresent: workspace persistent {} already on {}", rule.workspaceString, PMONITOR->m_name);
@@ -3165,4 +3170,22 @@ void CCompositor::ensurePersistentWorkspacesPresent(const std::vector<SWorkspace
continue;
}
}
+
+ if (!pWorkspace) {
+ // check non-persistent and downgrade if workspace is no longer persistent
+ std::vector<PHLWORKSPACEREF> toDowngrade;
+ for (auto& w : getWorkspaces()) {
+ if (!w->isPersistent())
+ continue;
+
+ if (std::ranges::contains(persistentFound, w.lock()))
+ continue;
+
+ toDowngrade.emplace_back(w);
+ }
+
+ for (auto& ws : toDowngrade) {
+ ws->setPersistent(false);
+ }
+ }
}