summaryrefslogtreecommitdiff
path: root/src/Compositor.cpp
diff options
context:
space:
mode:
authorZynix <89567766+alper-han@users.noreply.github.com>2026-03-01 00:49:47 +0300
committerGitHub <noreply@github.com>2026-02-28 21:49:47 +0000
commitc2bed4103c0382de83f5277c5583bb15ae702c2a (patch)
treecc045b65eb9f5ff93ee1e4dbdbbaafbef1fc19d7 /src/Compositor.cpp
parent82729db330d11d8b39625f04b88bea093f99b33e (diff)
monitor: keep workspace monitor bindings on full reconnect (#13384)
When all monitors disconnect, non-active workspaces could migrate to the wrong output after reconnect. Preserve workspace ownership and re-apply assigned monitor bindings on connect.
Diffstat (limited to 'src/Compositor.cpp')
-rw-r--r--src/Compositor.cpp21
1 files changed, 21 insertions, 0 deletions
diff --git a/src/Compositor.cpp b/src/Compositor.cpp
index 2068798d..918d50f4 100644
--- a/src/Compositor.cpp
+++ b/src/Compositor.cpp
@@ -3067,6 +3067,27 @@ void CCompositor::ensurePersistentWorkspacesPresent(const std::vector<SWorkspace
}
}
+void CCompositor::ensureWorkspacesOnAssignedMonitors() {
+ for (auto const& ws : getWorkspacesCopy()) {
+ if (!valid(ws) || ws->m_isSpecialWorkspace)
+ continue;
+
+ const auto RULE = g_pConfigManager->getWorkspaceRuleFor(ws);
+ if (RULE.monitor.empty())
+ continue;
+
+ const auto PMONITOR = getMonitorFromString(RULE.monitor);
+ if (!PMONITOR)
+ continue;
+
+ if (ws->m_monitor == PMONITOR)
+ continue;
+
+ Log::logger->log(Log::DEBUG, "ensureWorkspacesOnAssignedMonitors: moving workspace {} to {}", ws->m_name, PMONITOR->m_name);
+ moveWorkspaceToMonitor(ws, PMONITOR, true);
+ }
+}
+
std::optional<unsigned int> CCompositor::getVTNr() {
if (!m_aqBackend->hasSession())
return std::nullopt;