desktop/rules: tag static rule being ignored (#12514)

* chore: apply exec rules after removal and use CWindowRule

* refactor: unregister exec rules after applying them

Remove the unused toRemove vector and defer unregistering exec rules
until after applyStaticRule/applyDynamicRule so exec rules are applied
before being removed from the rule engine.
This commit is contained in:
littleblack111 2025-12-02 00:47:59 +08:00 committed by GitHub
parent bb963fb002
commit f82a8630d7
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -545,8 +545,8 @@ void CWindowRuleApplicator::readStaticRules() {
static_ = {};
std::vector<SP<IRule>> toRemove;
bool tagsWereChanged = false;
std::vector<SP<CWindowRule>> execRules;
bool tagsWereChanged = false;
for (const auto& r : ruleEngine()->rules()) {
if (r->type() != RULE_TYPE_WINDOW)
@ -557,16 +557,14 @@ void CWindowRuleApplicator::readStaticRules() {
if (!wr->matches(m_window.lock(), true))
continue;
if (wr->isExecRule()) {
execRules.emplace_back(wr);
continue;
}
applyStaticRule(wr);
const auto RES = applyDynamicRule(wr); // also apply dynamic, because we won't recheck it before layout gets data
const auto RES = applyDynamicRule(wr);
tagsWereChanged = tagsWereChanged || RES.tagsChanged;
if (wr->isExecRule())
toRemove.emplace_back(wr);
}
for (const auto& wr : toRemove) {
ruleEngine()->unregisterRule(wr);
}
// recheck some props people might wanna use for static rules.
@ -592,6 +590,12 @@ void CWindowRuleApplicator::readStaticRules() {
applyStaticRule(wr);
}
}
for (const auto& wr : execRules) {
applyStaticRule(wr);
applyDynamicRule(wr);
ruleEngine()->unregisterRule(wr);
}
}
void CWindowRuleApplicator::propertiesChanged(std::underlying_type_t<eRuleProperty> props) {