From 8726a7363eb9213235e6e23657668e0daac39a5b Mon Sep 17 00:00:00 2001 From: Vaxry <43317083+vaxerski@users.noreply.github.com> Date: Fri, 20 Mar 2026 13:52:37 -0400 Subject: config: cleanup the entire config infrastructure (#13785) Massively refactors the config infrastructure, sorely needed and will be req'd for the lua stuff --- .../shared/workspace/WorkspaceRuleManager.cpp | 85 ++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 src/config/shared/workspace/WorkspaceRuleManager.cpp (limited to 'src/config/shared/workspace/WorkspaceRuleManager.cpp') diff --git a/src/config/shared/workspace/WorkspaceRuleManager.cpp b/src/config/shared/workspace/WorkspaceRuleManager.cpp new file mode 100644 index 00000000..ca45873a --- /dev/null +++ b/src/config/shared/workspace/WorkspaceRuleManager.cpp @@ -0,0 +1,85 @@ +#include "WorkspaceRuleManager.hpp" + +#include "../../../Compositor.hpp" +#include "../../../helpers/Monitor.hpp" + +#include + +using namespace Config; +using namespace Hyprutils::String; + +UP& Config::workspaceRuleMgr() { + static UP p = makeUnique(); + return p; +} + +void CWorkspaceRuleManager::clear() { + m_rules.clear(); +} + +void CWorkspaceRuleManager::add(CWorkspaceRule&& x) { + m_rules.emplace_back(std::move(x)); +} + +void CWorkspaceRuleManager::replaceOrAdd(CWorkspaceRule&& x) { + auto it = std::ranges::find_if(m_rules, [&x](const auto& r) { return r.m_workspaceString == x.m_workspaceString; }); + if (it == m_rules.end()) + m_rules.emplace_back(std::move(x)); + else + (*it).mergeLeft(x); +} + +std::optional CWorkspaceRuleManager::getWorkspaceRuleFor(PHLWORKSPACE workspace) { + bool any = false; + + CWorkspaceRule mergedRule; + for (auto const& rule : m_rules) { + if (!workspace->matchesStaticSelector(rule.m_workspaceString)) + continue; + + mergedRule.mergeLeft(rule); + any = true; + } + + if (!any) + return std::nullopt; + + return mergedRule; +} + +std::string CWorkspaceRuleManager::getDefaultWorkspaceFor(const std::string& name) { + for (auto other = m_rules.begin(); other != m_rules.end(); ++other) { + if (other->m_isDefault) { + if (other->m_monitor == name) + return other->m_workspaceString; + if (other->m_monitor.starts_with("desc:")) { + auto const monitor = g_pCompositor->getMonitorFromDesc(trim(other->m_monitor.substr(5))); + if (monitor && monitor->m_name == name) + return other->m_workspaceString; + } + } + } + return ""; +} + +PHLMONITOR CWorkspaceRuleManager::getBoundMonitorForWS(const std::string& wsname) { + auto monitor = getBoundMonitorStringForWS(wsname); + if (monitor.starts_with("desc:")) + return g_pCompositor->getMonitorFromDesc(trim(monitor.substr(5))); + else + return g_pCompositor->getMonitorFromName(monitor); +} + +std::string CWorkspaceRuleManager::getBoundMonitorStringForWS(const std::string& wsname) { + for (auto const& wr : m_rules) { + const auto WSNAME = wr.m_workspaceName.starts_with("name:") ? wr.m_workspaceName.substr(5) : wr.m_workspaceName; + if (WSNAME == wsname) + return wr.m_monitor; + } + + return ""; +} + +const std::vector& CWorkspaceRuleManager::getAllWorkspaceRules() { + return m_rules; +} \ No newline at end of file -- cgit v1.2.3