kwin: ensure there are no duplicate rules

because KStandardDirs::findAllResources() will return local and global
rules thus if there is a global and local rule file with the same name
there would be duplicates, using KStandardDirs::NoDuplicates flag will
not solve that because the rules are merged into the main kwinrulesrc
config

Signed-off-by: Ivailo Monev <xakepa10@gmail.com>
This commit is contained in:
Ivailo Monev 2023-08-10 11:28:51 +03:00
parent 96a522adbd
commit ac19d657ae
3 changed files with 16 additions and 2 deletions

View file

@ -134,6 +134,7 @@ static int limit0to4(int i)
void Rules::readFromCfg(const KConfigGroup& cfg)
{
ruleid = cfg.readEntry("id", QByteArray());
description = cfg.readEntry("Description");
if (description.isEmpty()) // capitalized first, lowercase for backwards compatibility
description = cfg.readEntry("description");
@ -232,6 +233,7 @@ void Rules::readFromCfg(const KConfigGroup& cfg)
void Rules::write(KConfigGroup& cfg) const
{
cfg.writeEntry("id", ruleid);
cfg.writeEntry("Description", description);
// always write wmclass
WRITE_MATCH_STRING(wmclass, (const char*), true);
@ -972,21 +974,32 @@ void RuleBook::edit(Client* c, bool whole_app)
void RuleBook::load()
{
deleteAll();
QList<QByteArray> ruleids;
KConfig cfg("kwinrulesrc", KConfig::NoGlobals);
int count = cfg.group("General").readEntry("count", 0);
for (int i = 1; i <= count; ++i) {
KConfigGroup cg(&cfg, QString::number(i));
const QByteArray id = cg.readEntry("id", QByteArray());
if (ruleids.contains(id)) {
continue;
}
Rules* rule = new Rules(cg);
m_rules.append(rule);
ruleids.append(id);
}
const QStringList kwinrules = KGlobal::dirs()->findAllResources("data", "kwin/default_rules/*.kwinrules");
foreach (const QString &kwinrule, kwinrules) {
KConfig cfg(kwinrule, KConfig::NoGlobals);
int count = cfg.group("General").readEntry("count", 0);
count = cfg.group("General").readEntry("count", 0);
for (int i = 1; i <= count; ++i) {
KConfigGroup cg(&cfg, QString::number(i));
const QByteArray id = cg.readEntry("id", QByteArray());
if (ruleids.contains(id)) {
continue;
}
Rules* rule = new Rules(cg);
m_rules.append(rule);
ruleids.append(id);
}
}
}

View file

@ -199,6 +199,7 @@ private:
static bool checkForceStop(ForceRule rule);
#endif
int temporary_state; // e.g. for kstart
QByteArray ruleid;
QString description;
QByteArray wmclass;
StringMatch wmclassmatch;

View file

@ -11,4 +11,4 @@ types=32
wmclass=plasma
wmclasscomplete=false
wmclassmatch=1
id=191497c49c1ad8700a041a08f204df2e6a6a2a97