aboutsummaryrefslogtreecommitdiffstats
path: root/src/keymap.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/keymap.cpp')
-rw-r--r--src/keymap.cpp18
1 files changed, 18 insertions, 0 deletions
diff --git a/src/keymap.cpp b/src/keymap.cpp
index 6e43f1b..205d2f5 100644
--- a/src/keymap.cpp
+++ b/src/keymap.cpp
@@ -48,6 +48,14 @@ void KeyMap::loadOverrides(QSettings &settings)
{
const QStringList known = knownActions();
+ // Sequences bound so far *within this override pass*. Defaults already
+ // sit in m_bindings before this runs, so a plain m_bindings.contains()
+ // check would misfire on every legitimate override of a default (e.g.
+ // "j=archive" overriding the default 'j' binding). Only a collision
+ // between two entries in this same pass (e.g. two INI keys that
+ // normalize to the same QKeySequence, such as "y" and "Y") is a bug.
+ QHash<QKeySequence, QString> seenThisPass;
+
settings.beginGroup(QStringLiteral("keys"));
const QStringList keys = settings.childKeys();
for (const QString &key : keys) {
@@ -71,6 +79,16 @@ void KeyMap::loadOverrides(QSettings &settings)
continue;
}
+ const auto previous = seenThisPass.constFind(sequence);
+ if (previous != seenThisPass.constEnd()) {
+ m_warnings.append(
+ QStringLiteral("Key sequence '%1' bound to both '%2' and '%3' "
+ "in [keys]; keeping '%2'")
+ .arg(key, previous.value(), action));
+ continue;
+ }
+ seenThisPass.insert(sequence, action);
+
m_bindings.insert(sequence, action);
}
settings.endGroup();