diff options
| author | Vaxry <43317083+vaxerski@users.noreply.github.com> | 2026-03-20 13:52:37 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-03-20 17:52:37 +0000 |
| commit | 8726a7363eb9213235e6e23657668e0daac39a5b (patch) | |
| tree | 42eeb40f6f81a9ccec1455f308e56173e9dcce4b /src/config/shared/workspace/WorkspaceRuleManager.cpp | |
| parent | b940b0d2c197841b0f648598ee782dbaf9e0a89b (diff) | |
config: cleanup the entire config infrastructure (#13785)
Massively refactors the config infrastructure, sorely
needed and will be req'd for the lua stuff
Diffstat (limited to 'src/config/shared/workspace/WorkspaceRuleManager.cpp')
| -rw-r--r-- | src/config/shared/workspace/WorkspaceRuleManager.cpp | 85 |
1 files changed, 85 insertions, 0 deletions
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 <hyprutils/string/String.hpp> + +using namespace Config; +using namespace Hyprutils::String; + +UP<CWorkspaceRuleManager>& Config::workspaceRuleMgr() { + static UP<CWorkspaceRuleManager> p = makeUnique<CWorkspaceRuleManager>(); + 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<CWorkspaceRule> 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<CWorkspaceRule>& CWorkspaceRuleManager::getAllWorkspaceRules() { + return m_rules; +}
\ No newline at end of file |
