aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--autotests/kconfigtest.cpp27
-rw-r--r--autotests/kconfigtest.h2
-rw-r--r--src/core/kconfigdata.cpp4
-rw-r--r--src/core/kconfigdata.h7
-rw-r--r--src/core/kconfigini.cpp5
5 files changed, 43 insertions, 2 deletions
diff --git a/autotests/kconfigtest.cpp b/autotests/kconfigtest.cpp
index 736274c6..4d38b150 100644
--- a/autotests/kconfigtest.cpp
+++ b/autotests/kconfigtest.cpp
@@ -1949,3 +1949,30 @@ void KConfigTest::testNotify()
QCOMPARE(otherWatcherSpy[0][0].value<KConfigGroup>().name(), QStringLiteral("TopLevelGroup"));
QCOMPARE(otherWatcherSpy[0][1].value<QByteArrayList>(), QByteArrayList({"someGlobalEntry"}));
}
+
+void KConfigTest::testKdeglobalsVsDefault()
+{
+ // Add testRestore key with global value in kdeglobals
+ KConfig glob(QStringLiteral("kdeglobals"));
+ KConfigGroup generalGlob(&glob, "General");
+ generalGlob.writeEntry("testRestore", "global");
+ QVERIFY(glob.sync());
+
+ KConfig local(QStringLiteral(TEST_SUBDIR "restorerc"));
+ KConfigGroup generalLocal(&local, "General");
+ // Check if we get global and not the default value from cpp (defaultcpp) when reading data from restorerc
+ QCOMPARE(generalLocal.readEntry("testRestore", "defaultcpp"), "global");
+
+ // Add test restore key with restore value in restorerc file
+ generalLocal.writeEntry("testRestore", "restore");
+ QVERIFY(local.sync());
+ local.reparseConfiguration();
+ // We expect to get the value from restorerc file
+ QCOMPARE(generalLocal.readEntry("testRestore", "defaultcpp"), "restore");
+
+ // Revert to default testRestore key and we expect to get default value and not the global one
+ generalLocal.revertToDefault("testRestore");
+ local.sync();
+ local.reparseConfiguration();
+ QCOMPARE(generalLocal.readEntry("testRestore", "defaultcpp"), "defaultcpp");
+}
diff --git a/autotests/kconfigtest.h b/autotests/kconfigtest.h
index e97e4a5d..7617d0e7 100644
--- a/autotests/kconfigtest.h
+++ b/autotests/kconfigtest.h
@@ -73,6 +73,8 @@ private Q_SLOTS:
void testThreads();
+ void testKdeglobalsVsDefault();
+
// should be last
void testSyncOnExit();
};
diff --git a/src/core/kconfigdata.cpp b/src/core/kconfigdata.cpp
index bfa662a0..5ead8167 100644
--- a/src/core/kconfigdata.cpp
+++ b/src/core/kconfigdata.cpp
@@ -100,6 +100,10 @@ bool KEntryMap::setEntry(const QByteArray &group, const QByteArray &key, const Q
k = it.key();
e = *it;
//qDebug() << "found existing entry for key" << k;
+ // If overridden entry is global and not default. And it's overridden by a non global
+ if (e.bGlobal && !(options & EntryGlobal) && !k.bDefault) {
+ e.bOverridesGlobal = true;
+ }
} else {
// make sure the group marker is in the map
KEntryMap const *that = this;
diff --git a/src/core/kconfigdata.h b/src/core/kconfigdata.h
index d92076d9..2f36b1bb 100644
--- a/src/core/kconfigdata.h
+++ b/src/core/kconfigdata.h
@@ -24,7 +24,7 @@ struct KEntry {
KEntry()
: mValue(), bDirty(false),
bGlobal(false), bImmutable(false), bDeleted(false), bExpand(false), bReverted(false),
- bLocalizedCountry(false), bNotify(false) {}
+ bLocalizedCountry(false), bNotify(false), bOverridesGlobal(false) {}
/** @internal */
QByteArray mValue;
/**
@@ -58,6 +58,11 @@ struct KEntry {
bool bLocalizedCountry: 1;
bool bNotify: 1;
+
+ /**
+ * Entry will need to be written on a non global file even if it matches default value
+ */
+ bool bOverridesGlobal: 1;
};
// These operators are used to check whether an entry which is about
diff --git a/src/core/kconfigini.cpp b/src/core/kconfigini.cpp
index 2cea7338..9601d036 100644
--- a/src/core/kconfigini.cpp
+++ b/src/core/kconfigini.cpp
@@ -429,7 +429,10 @@ bool KConfigIniBackend::writeConfig(const QByteArray &locale, KEntryMap &entryMa
// only write entries that have the same "globality" as the file
if (it->bGlobal == bGlobal) {
- if (it->bReverted) {
+ if (it->bReverted && it->bOverridesGlobal) {
+ it->bDeleted = true;
+ writeMap[key] = *it;
+ } else if (it->bReverted) {
writeMap.remove(key);
} else if (!it->bDeleted) {
writeMap[key] = *it;