kwin: load additional rules from .kwinrules files everywhere

these bits are in 3 places now, have to do something about it but more
importantly the .kwinrules files are now loaded and shown by the KCM

Signed-off-by: Ivailo Monev <xakepa10@gmail.com>
This commit is contained in:
Ivailo Monev 2024-05-19 07:38:21 +03:00
parent 8c8246d810
commit 3d78c01c4b
2 changed files with 53 additions and 13 deletions

View file

@ -19,9 +19,11 @@
#include <kcmdlineargs.h> #include <kcmdlineargs.h>
#include <kapplication.h> #include <kapplication.h>
#include <kconfig.h> #include <kconfig.h>
#include <KLocalizedString> #include <klocalizedstring.h>
#include <kstandarddirs.h>
#include <kwindowsystem.h> #include <kwindowsystem.h>
#include <QtDBus/QtDBus> #include <QtDBus/QtDBus>
#include <X11/Xlib.h> #include <X11/Xlib.h>
#include <fixx11h.h> #include <fixx11h.h>
@ -35,15 +37,34 @@ namespace KWin
static void loadRules(QList< Rules* >& rules) static void loadRules(QList< Rules* >& rules)
{ {
QList<QByteArray> ruleids;
KConfig _cfg("kwinrulesrc"); KConfig _cfg("kwinrulesrc");
KConfigGroup cfg(&_cfg, "General"); KConfigGroup cfg(&_cfg, "General");
int count = cfg.readEntry("count", 0); int count = cfg.readEntry("count", 0);
for (int i = 1; for (int i = 1; i <= count; ++i) {
i <= count;
++i) {
cfg = KConfigGroup(&_cfg, QString::number(i)); cfg = KConfigGroup(&_cfg, QString::number(i));
const QByteArray id = cfg.readEntry("id", QByteArray());
if (ruleids.contains(id)) {
continue;
}
Rules* rule = new Rules(cfg); Rules* rule = new Rules(cfg);
rules.append(rule); 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);
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);
rules.append(rule);
ruleids.append(id);
}
} }
} }

View file

@ -17,15 +17,16 @@
*/ */
#include "ruleslist.h" #include "ruleslist.h"
#include "ruleswidget.h"
#include <klistwidget.h> #include <klistwidget.h>
#include <kpushbutton.h> #include <kpushbutton.h>
#include <assert.h>
#include <kdebug.h> #include <kdebug.h>
#include <kconfig.h> #include <kconfig.h>
#include <KFileDialog> #include <kfiledialog.h>
#include <kstandarddirs.h>
#include "ruleswidget.h" #include <assert.h>
namespace KWin namespace KWin
{ {
@ -212,22 +213,40 @@ void KCMRulesList::importClicked()
void KCMRulesList::load() void KCMRulesList::load()
{ {
rules_listbox->clear(); rules_listbox->clear();
for (QVector< Rules* >::Iterator it = rules.begin(); for (QVector< Rules* >::Iterator it = rules.begin(); it != rules.end(); ++it)
it != rules.end();
++it)
delete *it; delete *it;
rules.clear(); rules.clear();
QList<QByteArray> ruleids;
KConfig _cfg("kwinrulesrc"); KConfig _cfg("kwinrulesrc");
KConfigGroup cfg(&_cfg, "General"); KConfigGroup cfg(&_cfg, "General");
int count = cfg.readEntry("count", 0); int count = cfg.readEntry("count", 0);
rules.reserve(count); rules.reserve(count);
for (int i = 1; for (int i = 1; i <= count; ++i) {
i <= count;
++i) {
cfg = KConfigGroup(&_cfg, QString::number(i)); cfg = KConfigGroup(&_cfg, QString::number(i));
const QByteArray id = cfg.readEntry("id", QByteArray());
if (ruleids.contains(id)) {
continue;
}
Rules* rule = new Rules(cfg); Rules* rule = new Rules(cfg);
rules.append(rule); rules.append(rule);
rules_listbox->addItem(rule->description); rules_listbox->addItem(rule->description);
ruleids.append(id);
}
const QStringList kwinrules = KGlobal::dirs()->findAllResources("data", "kwin/default_rules/*.kwinrules");
foreach (const QString &kwinrule, kwinrules) {
KConfig cfg(kwinrule, KConfig::NoGlobals);
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);
rules.append(rule);
rules_listbox->addItem(rule->description);
ruleids.append(id);
}
} }
if (rules.count() > 0) if (rules.count() > 0)
rules_listbox->setCurrentItem(rules_listbox->item(0)); rules_listbox->setCurrentItem(rules_listbox->item(0));