From 1bc5b0253fc950c46145713ccb46750aba56ea6f Mon Sep 17 00:00:00 2001 From: Vaxry Date: Tue, 18 Nov 2025 16:49:28 +0000 Subject: [PATCH] hyprbars: fix windowrules --- hyprbars/barDeco.cpp | 23 +++++++---------------- hyprbars/barDeco.hpp | 1 - hyprbars/globals.hpp | 3 +++ hyprbars/main.cpp | 10 +++++++++- 4 files changed, 19 insertions(+), 18 deletions(-) diff --git a/hyprbars/barDeco.cpp b/hyprbars/barDeco.cpp index ef86533..2f43988 100644 --- a/hyprbars/barDeco.cpp +++ b/hyprbars/barDeco.cpp @@ -573,7 +573,7 @@ void CHyprBar::draw(PHLMONITOR pMonitor, const float& a) { const auto PWINDOW = m_pWindow.lock(); - if (!PWINDOW->m_windowData.decorate.valueOrDefault()) + if (!PWINDOW->m_ruleApplicator->decorate().valueOrDefault()) return; auto data = CBarPassElement::SBarData{this, a}; @@ -754,7 +754,6 @@ PHLWINDOW CHyprBar::getOwner() { void CHyprBar::updateRules() { const auto PWINDOW = m_pWindow.lock(); - auto rules = PWINDOW->m_matchedRules; auto prevHidden = m_hidden; auto prevForcedTitleColor = m_bForcedTitleColor; @@ -762,9 +761,12 @@ void CHyprBar::updateRules() { m_bForcedTitleColor = std::nullopt; m_hidden = false; - for (auto& r : rules) { - applyRule(r); - } + if (PWINDOW->m_ruleApplicator->m_otherProps.props.contains(g_pGlobalState->nobarRuleIdx)) + m_hidden = truthy(PWINDOW->m_ruleApplicator->m_otherProps.props.at(g_pGlobalState->nobarRuleIdx)->effect); + if (PWINDOW->m_ruleApplicator->m_otherProps.props.contains(g_pGlobalState->barColorRuleIdx)) + m_bForcedBarColor = CHyprColor(configStringToInt(PWINDOW->m_ruleApplicator->m_otherProps.props.at(g_pGlobalState->nobarRuleIdx)->effect).value_or(0)); + if (PWINDOW->m_ruleApplicator->m_otherProps.props.contains(g_pGlobalState->titleColorRuleIdx)) + m_bForcedTitleColor = CHyprColor(configStringToInt(PWINDOW->m_ruleApplicator->m_otherProps.props.at(g_pGlobalState->nobarRuleIdx)->effect).value_or(0)); if (prevHidden != m_hidden) g_pDecorationPositioner->repositionDeco(this); @@ -772,17 +774,6 @@ void CHyprBar::updateRules() { m_bTitleColorChanged = true; } -void CHyprBar::applyRule(const SP& r) { - auto arg = r->m_rule.substr(r->m_rule.find_first_of(' ') + 1); - - if (r->m_rule == "plugin:hyprbars:nobar") - m_hidden = true; - else if (r->m_rule.starts_with("plugin:hyprbars:bar_color")) - m_bForcedBarColor = CHyprColor(configStringToInt(arg).value_or(0)); - else if (r->m_rule.starts_with("plugin:hyprbars:title_color")) - m_bForcedTitleColor = CHyprColor(configStringToInt(arg).value_or(0)); -} - void CHyprBar::damageOnButtonHover() { static auto* const PBARPADDING = (Hyprlang::INT* const*)HyprlandAPI::getConfigValue(PHANDLE, "plugin:hyprbars:bar_padding")->getDataStaticPtr(); static auto* const PBARBUTTONPADDING = (Hyprlang::INT* const*)HyprlandAPI::getConfigValue(PHANDLE, "plugin:hyprbars:bar_button_padding")->getDataStaticPtr(); diff --git a/hyprbars/barDeco.hpp b/hyprbars/barDeco.hpp index f8c86f7..f0af211 100644 --- a/hyprbars/barDeco.hpp +++ b/hyprbars/barDeco.hpp @@ -43,7 +43,6 @@ class CHyprBar : public IHyprWindowDecoration { PHLWINDOW getOwner(); void updateRules(); - void applyRule(const SP&); WP m_self; diff --git a/hyprbars/globals.hpp b/hyprbars/globals.hpp index 3daf1bb..79bf4dc 100644 --- a/hyprbars/globals.hpp +++ b/hyprbars/globals.hpp @@ -20,6 +20,9 @@ class CHyprBar; struct SGlobalState { std::vector buttons; std::vector> bars; + uint32_t nobarRuleIdx = 0; + uint32_t barColorRuleIdx = 0; + uint32_t titleColorRuleIdx = 0; }; inline UP g_pGlobalState; diff --git a/hyprbars/main.cpp b/hyprbars/main.cpp index 7f7aa90..0da8aa6 100644 --- a/hyprbars/main.cpp +++ b/hyprbars/main.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include @@ -121,7 +122,10 @@ APICALL EXPORT PLUGIN_DESCRIPTION_INFO PLUGIN_INIT(HANDLE handle) { throw std::runtime_error("[hb] Version mismatch"); } - g_pGlobalState = makeUnique(); + g_pGlobalState = makeUnique(); + g_pGlobalState->nobarRuleIdx = Desktop::Rule::windowEffects()->registerEffect("hyprbars:no_bar"); + g_pGlobalState->barColorRuleIdx = Desktop::Rule::windowEffects()->registerEffect("hyprbars:bar_color"); + g_pGlobalState->titleColorRuleIdx = Desktop::Rule::windowEffects()->registerEffect("hyprbars:title_color"); static auto P = HyprlandAPI::registerCallbackDynamic(PHANDLE, "openWindow", [&](void* self, SCallbackInfo& info, std::any data) { onNewWindow(self, data); }); // static auto P2 = HyprlandAPI::registerCallbackDynamic(PHANDLE, "closeWindow", [&](void* self, SCallbackInfo& info, std::any data) { onCloseWindow(self, data); }); @@ -167,4 +171,8 @@ APICALL EXPORT void PLUGIN_EXIT() { m->m_scheduledRecalc = true; g_pHyprRenderer->m_renderPass.removeAllOfType("CBarPassElement"); + + Desktop::Rule::windowEffects()->unregisterEffect(g_pGlobalState->barColorRuleIdx); + Desktop::Rule::windowEffects()->unregisterEffect(g_pGlobalState->titleColorRuleIdx); + Desktop::Rule::windowEffects()->unregisterEffect(g_pGlobalState->nobarRuleIdx); }