From a32a1a8da3e3170ed2caca26579376dfface394e Mon Sep 17 00:00:00 2001 From: Vaxry <43317083+vaxerski@users.noreply.github.com> Date: Sat, 7 Mar 2026 19:53:34 +0000 Subject: [PATCH] desktop/windowRule: fix matching CONTENT (#13636) ref #13596 --- hyprtester/src/tests/main/window.cpp | 28 ++++++++++++++++++++++ src/desktop/rule/Rule.cpp | 2 +- src/desktop/rule/windowRule/WindowRule.cpp | 2 +- 3 files changed, 30 insertions(+), 2 deletions(-) diff --git a/hyprtester/src/tests/main/window.cpp b/hyprtester/src/tests/main/window.cpp index 2bded63aa..d4d6ee71d 100644 --- a/hyprtester/src/tests/main/window.cpp +++ b/hyprtester/src/tests/main/window.cpp @@ -658,6 +658,33 @@ static bool testWindowRuleWorkspaceEmpty() { return true; } +static void testContentRules() { + NLog::log("{}Testing content window rules", Colors::YELLOW); + + // kill me PLEASE + + OK(getFromSocket("/keyword windowrule match:class kitty_bitch, content game")); + OK(getFromSocket("/keyword windowrule match:content game, border_size 10")); + OK(getFromSocket("/keyword windowrule match:content 3, opacity 0.5")); + + getFromSocket("/dispatch workspace 420"); + + if (!spawnKitty("kitty_bitch")) { + NLog::log("{}Error: failed to spawn kitty", Colors::RED); + return; + } + + { + auto res = getFromSocket("/getprop active border_size"); + EXPECT_CONTAINS(res, "10"); + } + + { + auto res = getFromSocket("/getprop active opacity"); + EXPECT_CONTAINS(res, "0.5"); + } +} + static bool test() { NLog::log("{}Testing windows", Colors::GREEN); @@ -1122,6 +1149,7 @@ static bool test() { testWindowRuleFocusOnActivate(); testPinnedWorkspacesValid(); testWindowRuleWorkspaceEmpty(); + testContentRules(); NLog::log("{}Reloading config", Colors::YELLOW); OK(getFromSocket("/reload")); diff --git a/src/desktop/rule/Rule.cpp b/src/desktop/rule/Rule.cpp index ab5525e8a..5e3141cdd 100644 --- a/src/desktop/rule/Rule.cpp +++ b/src/desktop/rule/Rule.cpp @@ -48,7 +48,7 @@ static const std::unordered_map RULE_ENGINES = {RULE_PROP_FULLSCREENSTATE_INTERNAL, RULE_MATCH_ENGINE_INT}, // {RULE_PROP_FULLSCREENSTATE_CLIENT, RULE_MATCH_ENGINE_INT}, // {RULE_PROP_ON_WORKSPACE, RULE_MATCH_ENGINE_WORKSPACE}, // - {RULE_PROP_CONTENT, RULE_MATCH_ENGINE_INT}, // + {RULE_PROP_CONTENT, RULE_MATCH_ENGINE_REGEX}, // {RULE_PROP_XDG_TAG, RULE_MATCH_ENGINE_REGEX}, // {RULE_PROP_NAMESPACE, RULE_MATCH_ENGINE_REGEX}, // {RULE_PROP_EXEC_TOKEN, RULE_MATCH_ENGINE_REGEX}, // diff --git a/src/desktop/rule/windowRule/WindowRule.cpp b/src/desktop/rule/windowRule/WindowRule.cpp index 8028e482d..08cd16030 100644 --- a/src/desktop/rule/windowRule/WindowRule.cpp +++ b/src/desktop/rule/windowRule/WindowRule.cpp @@ -97,7 +97,7 @@ bool CWindowRule::matches(PHLWINDOW w, bool allowEnvLookup) { return false; break; case RULE_PROP_CONTENT: - if (!engine->match(w->getContentType()) && !engine->match(NContentType::toString(w->getContentType()))) + if (!engine->match(std::format("{}", sc(w->getContentType()))) && !engine->match(NContentType::toString(w->getContentType()))) return false; break; case RULE_PROP_XDG_TAG: