From d5352a5d1290bee221ef05f555405f14ee9997f5 Mon Sep 17 00:00:00 2001 From: vaxerski <43317083+vaxerski@users.noreply.github.com> Date: Fri, 9 Dec 2022 17:17:02 +0000 Subject: [PATCH] find a default workspace smarter --- src/config/ConfigManager.cpp | 12 ++++++++++++ src/config/ConfigManager.hpp | 1 + src/helpers/Monitor.cpp | 16 +++++++++++++++- src/helpers/Monitor.hpp | 1 + 4 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/config/ConfigManager.cpp b/src/config/ConfigManager.cpp index e668a98a..89152acc 100644 --- a/src/config/ConfigManager.cpp +++ b/src/config/ConfigManager.cpp @@ -1688,6 +1688,18 @@ CMonitor* CConfigManager::getBoundMonitorForWS(std::string wsname) { return nullptr; } +std::string CConfigManager::getBoundMonitorStringForWS(std::string wsname) { + for (auto& [ws, mon] : boundWorkspaces) { + const auto WSNAME = ws.find("name:") == 0 ? ws.substr(5) : ws; + + if (WSNAME == wsname) { + return mon; + } + } + + return ""; +} + void CConfigManager::addExecRule(SExecRequestedRule rule) { execRequestedRules.push_back(rule); } diff --git a/src/config/ConfigManager.hpp b/src/config/ConfigManager.hpp index 188f14e4..298745cc 100644 --- a/src/config/ConfigManager.hpp +++ b/src/config/ConfigManager.hpp @@ -141,6 +141,7 @@ public: SMonitorRule getMonitorRuleFor(std::string, std::string displayName = ""); CMonitor* getBoundMonitorForWS(std::string); + std::string getBoundMonitorStringForWS(std::string); std::vector getMatchingRules(CWindow*); diff --git a/src/helpers/Monitor.cpp b/src/helpers/Monitor.cpp index d27c0993..f5ddee30 100644 --- a/src/helpers/Monitor.cpp +++ b/src/helpers/Monitor.cpp @@ -240,10 +240,24 @@ bool CMonitor::isMirror() { return pMirrorOf != nullptr; } +int CMonitor::findAvailableDefaultWS() { + for (size_t i = 1; i < INT32_MAX; ++i) { + if (g_pCompositor->getWorkspaceByID(i)) + continue; + + if (const auto BOUND = g_pConfigManager->getBoundMonitorStringForWS(std::to_string(i)); !BOUND.empty() && BOUND != szName) + continue; + + return i; + } + + return INT32_MAX; // shouldn't be reachable +} + void CMonitor::setupDefaultWS(const SMonitorRule& monitorRule) { // Workspace std::string newDefaultWorkspaceName = ""; - int64_t WORKSPACEID = monitorRule.defaultWorkspace == "" ? g_pCompositor->m_vWorkspaces.size() + 1 : getWorkspaceIDFromString(monitorRule.defaultWorkspace, newDefaultWorkspaceName); + int64_t WORKSPACEID = monitorRule.defaultWorkspace == "" ? findAvailableDefaultWS() : getWorkspaceIDFromString(monitorRule.defaultWorkspace, newDefaultWorkspaceName); if (WORKSPACEID == INT_MAX || (WORKSPACEID >= SPECIAL_WORKSPACE_START && WORKSPACEID <= -2)) { WORKSPACEID = g_pCompositor->m_vWorkspaces.size() + 1; diff --git a/src/helpers/Monitor.hpp b/src/helpers/Monitor.hpp index 257bdd64..4164b223 100644 --- a/src/helpers/Monitor.hpp +++ b/src/helpers/Monitor.hpp @@ -83,4 +83,5 @@ public: private: void setupDefaultWS(const SMonitorRule&); + int findAvailableDefaultWS(); };