From 57921d7dbd1b87a9474f609cb9cd30e6174027cd Mon Sep 17 00:00:00 2001 From: Vaxry Date: Sat, 21 Dec 2024 19:21:45 +0000 Subject: [PATCH] windowrules: precompute regexes for window/layer rules --- src/config/ConfigManager.cpp | 34 +++++++++++++++++++++++----------- src/desktop/LayerRule.cpp | 1 + src/desktop/LayerRule.hpp | 14 +++++++++++--- src/desktop/WindowRule.cpp | 1 + src/desktop/WindowRule.hpp | 13 +++++++++++++ 5 files changed, 49 insertions(+), 14 deletions(-) diff --git a/src/config/ConfigManager.cpp b/src/config/ConfigManager.cpp index f4ba7379..c4078777 100644 --- a/src/config/ConfigManager.cpp +++ b/src/config/ConfigManager.cpp @@ -1258,10 +1258,10 @@ std::vector> CConfigManager::getMatchingRules(PHLWINDOW pWindow, if (rule->szValue.starts_with("tag:") && !tags.isTagged(rule->szValue.substr(4))) continue; - if (rule->szValue.starts_with("title:") && !RE2::FullMatch(pWindow->m_szTitle, rule->szValue.substr(6))) + if (rule->szValue.starts_with("title:") && !RE2::FullMatch(pWindow->m_szTitle, *rule->rV1Regex)) continue; - if (!RE2::FullMatch(pWindow->m_szClass, rule->szValue)) + if (!RE2::FullMatch(pWindow->m_szClass, *rule->rV1Regex)) continue; } catch (...) { @@ -1351,16 +1351,16 @@ std::vector> CConfigManager::getMatchingRules(PHLWINDOW pWindow, if (!rule->szTag.empty() && !tags.isTagged(rule->szTag)) continue; - if (!rule->szClass.empty() && !RE2::FullMatch(pWindow->m_szClass, rule->szClass)) + if (!rule->szClass.empty() && !RE2::FullMatch(pWindow->m_szClass, *rule->rClass)) continue; - if (!rule->szTitle.empty() && !RE2::FullMatch(pWindow->m_szTitle, rule->szTitle)) + if (!rule->szTitle.empty() && !RE2::FullMatch(pWindow->m_szTitle, *rule->rTitle)) continue; - if (!rule->szInitialTitle.empty() && !RE2::FullMatch(pWindow->m_szInitialTitle, rule->szInitialTitle)) + if (!rule->szInitialTitle.empty() && !RE2::FullMatch(pWindow->m_szInitialTitle, *rule->rInitialTitle)) continue; - if (!rule->szInitialClass.empty() && !RE2::FullMatch(pWindow->m_szInitialClass, rule->szInitialClass)) + if (!rule->szInitialClass.empty() && !RE2::FullMatch(pWindow->m_szInitialClass, *rule->rInitialClass)) continue; } catch (std::exception& e) { @@ -1419,7 +1419,7 @@ std::vector> CConfigManager::getMatchingRules(PHLLS pLS) { if (lr->targetNamespace.starts_with("address:0x")) { if (std::format("address:0x{:x}", (uintptr_t)pLS.get()) != lr->targetNamespace) continue; - } else if (!RE2::FullMatch(pLS->layerSurface->layerNamespace, lr->targetNamespace)) + } else if (!RE2::FullMatch(pLS->layerSurface->layerNamespace, *lr->rTargetNamespaceRegex)) continue; // hit @@ -2281,6 +2281,8 @@ std::optional CConfigManager::handleWindowRule(const std::string& c return "Invalid rule: " + RULE; } + newRule->rV1Regex = std::make_unique(VALUE.starts_with("title:") ? VALUE.substr(6) : VALUE); + if (RULE.starts_with("size") || RULE.starts_with("maxsize") || RULE.starts_with("minsize")) m_vWindowRules.insert(m_vWindowRules.begin(), newRule); else @@ -2309,6 +2311,8 @@ std::optional CConfigManager::handleLayerRule(const std::string& co return "Invalid rule found: " + RULE; } + rule->rTargetNamespaceRegex = std::make_unique(VALUE); + m_vLayerRules.emplace_back(rule); for (auto const& m : g_pCompositor->m_vMonitors) @@ -2407,17 +2411,25 @@ std::optional CConfigManager::handleWindowRuleV2(const std::string& if (TAGPOS != std::string::npos) rule->szTag = extract(TAGPOS + 4); - if (CLASSPOS != std::string::npos) + if (CLASSPOS != std::string::npos) { rule->szClass = extract(CLASSPOS + 6); + rule->rClass = std::make_unique(rule->szClass); + } - if (TITLEPOS != std::string::npos) + if (TITLEPOS != std::string::npos) { rule->szTitle = extract(TITLEPOS + 6); + rule->rTitle = std::make_unique(rule->szTitle); + } - if (INITIALCLASSPOS != std::string::npos) + if (INITIALCLASSPOS != std::string::npos) { rule->szInitialClass = extract(INITIALCLASSPOS + 13); + rule->rInitialClass = std::make_unique(rule->szInitialClass); + } - if (INITIALTITLEPOS != std::string::npos) + if (INITIALTITLEPOS != std::string::npos) { rule->szInitialTitle = extract(INITIALTITLEPOS + 13); + rule->rInitialTitle = std::make_unique(rule->szInitialTitle); + } if (X11POS != std::string::npos) rule->bX11 = extract(X11POS + 9) == "1" ? 1 : 0; diff --git a/src/desktop/LayerRule.cpp b/src/desktop/LayerRule.cpp index d82e4d30..23371947 100644 --- a/src/desktop/LayerRule.cpp +++ b/src/desktop/LayerRule.cpp @@ -1,6 +1,7 @@ #include "LayerRule.hpp" #include #include +#include #include "../debug/Log.hpp" static const auto RULES = std::unordered_set{"noanim", "blur", "blurpopups", "dimaround"}; diff --git a/src/desktop/LayerRule.hpp b/src/desktop/LayerRule.hpp index 7dca4621..117fa6fb 100644 --- a/src/desktop/LayerRule.hpp +++ b/src/desktop/LayerRule.hpp @@ -2,6 +2,12 @@ #include #include +#include + +//NOLINTNEXTLINE +namespace re2 { + class RE2; +}; class CLayerRule { public: @@ -21,8 +27,10 @@ class CLayerRule { RULE_ZUMBA, }; - eRuleType ruleType = RULE_INVALID; + eRuleType ruleType = RULE_INVALID; - const std::string targetNamespace; - const std::string rule; + const std::string targetNamespace; + const std::string rule; + + std::unique_ptr rTargetNamespaceRegex; }; \ No newline at end of file diff --git a/src/desktop/WindowRule.cpp b/src/desktop/WindowRule.cpp index 4f2d949e..7db6c3db 100644 --- a/src/desktop/WindowRule.cpp +++ b/src/desktop/WindowRule.cpp @@ -1,6 +1,7 @@ #include "WindowRule.hpp" #include #include +#include #include "../config/ConfigManager.hpp" static const auto RULES = std::unordered_set{ diff --git a/src/desktop/WindowRule.hpp b/src/desktop/WindowRule.hpp index 6faf8b5a..3ce31179 100644 --- a/src/desktop/WindowRule.hpp +++ b/src/desktop/WindowRule.hpp @@ -2,6 +2,12 @@ #include #include +#include + +//NOLINTNEXTLINE +namespace re2 { + class RE2; +}; class CWindowRule { public: @@ -57,4 +63,11 @@ class CWindowRule { std::string szFullscreenState = ""; // empty means any std::string szOnWorkspace = ""; // empty means any std::string szWorkspace = ""; // empty means any + + // precompiled regexes + std::unique_ptr rTitle; + std::unique_ptr rClass; + std::unique_ptr rInitialTitle; + std::unique_ptr rInitialClass; + std::unique_ptr rV1Regex; }; \ No newline at end of file