summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorVaxry <vaxry@vaxry.net>2024-12-21 19:21:45 +0000
committerVaxry <vaxry@vaxry.net>2024-12-21 19:21:50 +0000
commit57921d7dbd1b87a9474f609cb9cd30e6174027cd (patch)
treef25c16ad3e24449ca2b7b94e82313f08fb116082 /src
parent8e8073c42172feaf5600879f475322ab7363f017 (diff)
windowrules: precompute regexes for window/layer rules
Diffstat (limited to 'src')
-rw-r--r--src/config/ConfigManager.cpp34
-rw-r--r--src/desktop/LayerRule.cpp1
-rw-r--r--src/desktop/LayerRule.hpp14
-rw-r--r--src/desktop/WindowRule.cpp1
-rw-r--r--src/desktop/WindowRule.hpp13
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<SP<CWindowRule>> 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<SP<CWindowRule>> 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<SP<CLayerRule>> 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<std::string> CConfigManager::handleWindowRule(const std::string& c
return "Invalid rule: " + RULE;
}
+ newRule->rV1Regex = std::make_unique<RE2>(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<std::string> CConfigManager::handleLayerRule(const std::string& co
return "Invalid rule found: " + RULE;
}
+ rule->rTargetNamespaceRegex = std::make_unique<RE2>(VALUE);
+
m_vLayerRules.emplace_back(rule);
for (auto const& m : g_pCompositor->m_vMonitors)
@@ -2407,17 +2411,25 @@ std::optional<std::string> 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<RE2>(rule->szClass);
+ }
- if (TITLEPOS != std::string::npos)
+ if (TITLEPOS != std::string::npos) {
rule->szTitle = extract(TITLEPOS + 6);
+ rule->rTitle = std::make_unique<RE2>(rule->szTitle);
+ }
- if (INITIALCLASSPOS != std::string::npos)
+ if (INITIALCLASSPOS != std::string::npos) {
rule->szInitialClass = extract(INITIALCLASSPOS + 13);
+ rule->rInitialClass = std::make_unique<RE2>(rule->szInitialClass);
+ }
- if (INITIALTITLEPOS != std::string::npos)
+ if (INITIALTITLEPOS != std::string::npos) {
rule->szInitialTitle = extract(INITIALTITLEPOS + 13);
+ rule->rInitialTitle = std::make_unique<RE2>(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 <unordered_set>
#include <algorithm>
+#include <re2/re2.h>
#include "../debug/Log.hpp"
static const auto RULES = std::unordered_set<std::string>{"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 <string>
#include <cstdint>
+#include <memory>
+
+//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<re2::RE2> 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 <unordered_set>
#include <algorithm>
+#include <re2/re2.h>
#include "../config/ConfigManager.hpp"
static const auto RULES = std::unordered_set<std::string>{
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 <string>
#include <cstdint>
+#include <memory>
+
+//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<re2::RE2> rTitle;
+ std::unique_ptr<re2::RE2> rClass;
+ std::unique_ptr<re2::RE2> rInitialTitle;
+ std::unique_ptr<re2::RE2> rInitialClass;
+ std::unique_ptr<re2::RE2> rV1Regex;
}; \ No newline at end of file