Do not save kwinrulesrc on every window opening/closing
Summary: Our rule handling has had a grave error for years. Whenever a window with a rule was openend or closed the kwinrulesrc was written back to disk. The reason for this behavior is that temporary rules need to be discarded once they were used. For that there is a method discardUsed which invokes requestDiskStorage whenever a rule for the window was found. But it did not check whether there was a rule requiring this. This change modifies the discardUsed to track whether it changed a rule and only writes back in case there was a change. BUG: 393911 FIXED-IN: 5.12.6 Test Plan: Only compile tested Reviewers: #kwin, #plasma Subscribers: kwin Tags: #kwin Differential Revision: https://phabricator.kde.org/D12749
This commit is contained in:
parent
69afe4d266
commit
9a02ed4d36
2 changed files with 14 additions and 6 deletions
18
rules.cpp
18
rules.cpp
|
@ -686,17 +686,22 @@ bool Rules::discardTemporary(bool force)
|
|||
|
||||
#define DISCARD_USED_SET_RULE( var ) \
|
||||
do { \
|
||||
if ( var##rule == ( SetRule ) ApplyNow || ( withdrawn && var##rule == ( SetRule ) ForceTemporarily )) \
|
||||
if ( var##rule == ( SetRule ) ApplyNow || ( withdrawn && var##rule == ( SetRule ) ForceTemporarily )) { \
|
||||
var##rule = UnusedSetRule; \
|
||||
changed = true; \
|
||||
} \
|
||||
} while ( false )
|
||||
#define DISCARD_USED_FORCE_RULE( var ) \
|
||||
do { \
|
||||
if ( withdrawn && var##rule == ( ForceRule ) ForceTemporarily ) \
|
||||
if ( withdrawn && var##rule == ( ForceRule ) ForceTemporarily ) { \
|
||||
var##rule = UnusedForceRule; \
|
||||
changed = true; \
|
||||
} \
|
||||
} while ( false )
|
||||
|
||||
void Rules::discardUsed(bool withdrawn)
|
||||
bool Rules::discardUsed(bool withdrawn)
|
||||
{
|
||||
bool changed = false;
|
||||
DISCARD_USED_FORCE_RULE(placement);
|
||||
DISCARD_USED_SET_RULE(position);
|
||||
DISCARD_USED_SET_RULE(size);
|
||||
|
@ -732,6 +737,8 @@ void Rules::discardUsed(bool withdrawn)
|
|||
DISCARD_USED_FORCE_RULE(strictgeometry);
|
||||
DISCARD_USED_SET_RULE(shortcut);
|
||||
DISCARD_USED_FORCE_RULE(disableglobalshortcuts);
|
||||
|
||||
return changed;
|
||||
}
|
||||
#undef DISCARD_USED_SET_RULE
|
||||
#undef DISCARD_USED_FORCE_RULE
|
||||
|
@ -1115,8 +1122,9 @@ void RuleBook::discardUsed(AbstractClient* c, bool withdrawn)
|
|||
it != m_rules.end();
|
||||
) {
|
||||
if (c->rules()->contains(*it)) {
|
||||
updated = true;
|
||||
(*it)->discardUsed(withdrawn);
|
||||
if ((*it)->discardUsed(withdrawn)) {
|
||||
updated = true;
|
||||
}
|
||||
if ((*it)->isEmpty()) {
|
||||
c->removeRule(*it);
|
||||
Rules* r = *it;
|
||||
|
|
2
rules.h
2
rules.h
|
@ -115,7 +115,7 @@ public:
|
|||
void write(KConfigGroup&) const;
|
||||
bool isEmpty() const;
|
||||
#ifndef KCMRULES
|
||||
void discardUsed(bool withdrawn);
|
||||
bool discardUsed(bool withdrawn);
|
||||
bool match(const AbstractClient* c) const;
|
||||
bool update(AbstractClient*, int selection);
|
||||
bool isTemporary() const;
|
||||
|
|
Loading…
Reference in a new issue