aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/gui/CMakeLists.txt3
-rw-r--r--src/gui/kstandardshortcut.cpp10
-rw-r--r--src/gui/kstandardshortcut_p.h20
-rw-r--r--src/gui/kstandardshortcutwatcher.cpp46
-rw-r--r--src/gui/kstandardshortcutwatcher.h54
5 files changed, 130 insertions, 3 deletions
diff --git a/src/gui/CMakeLists.txt b/src/gui/CMakeLists.txt
index 2136ec9f..403b0367 100644
--- a/src/gui/CMakeLists.txt
+++ b/src/gui/CMakeLists.txt
@@ -9,6 +9,7 @@ target_sources(KF5ConfigGui PRIVATE
kconfigloader.cpp
kconfigskeleton.cpp
kstandardshortcut.cpp
+ kstandardshortcutwatcher.cpp
kwindowconfig.cpp
)
@@ -37,6 +38,7 @@ ecm_generate_headers(KConfigGui_HEADERS
KConfigLoader
KConfigSkeleton
KStandardShortcut
+ KStandardShortcutWatcher
KWindowConfig
REQUIRED_HEADERS KConfigGui_HEADERS
@@ -60,6 +62,7 @@ if (PythonModuleGeneration_FOUND)
kconfigloader.h
kconfigskeleton.h
kstandardshortcut.h
+ kstandardshortcutwatcher.h
kwindowconfig.h
)
endif()
diff --git a/src/gui/kstandardshortcut.cpp b/src/gui/kstandardshortcut.cpp
index 1f67901f..e7639219 100644
--- a/src/gui/kstandardshortcut.cpp
+++ b/src/gui/kstandardshortcut.cpp
@@ -8,8 +8,10 @@
*/
#include "kstandardshortcut.h"
+#include "kstandardshortcutwatcher.h"
#include "kconfig.h"
+#include "kconfigwatcher.h"
#include "ksharedconfig.h"
#include <kconfiggroup.h>
@@ -437,7 +439,7 @@ static void sanitizeShortcutList(QList<QKeySequence> *list)
On X11, if QApplication was initialized with GUI disabled,
the default will always be used.
*/
-static void initialize(StandardShortcut id)
+void initialize(StandardShortcut id)
{
KStandardShortcutInfo *info = guardedStandardShortcutInfo(id);
@@ -483,7 +485,8 @@ void saveShortcut(StandardShortcut id, const QList<QKeySequence> &newShortcut)
// If the shortcut is the equal to the hardcoded one we remove it from
// kdeglobal if necessary and return.
if (cg.hasKey(info->name)) {
- cg.deleteEntry(info->name, KConfig::Global | KConfig::Persistent);
+ cg.deleteEntry(info->name, KConfig::Global | KConfig::Persistent | KConfig::Notify);
+ cg.sync();
}
return;
@@ -491,7 +494,8 @@ void saveShortcut(StandardShortcut id, const QList<QKeySequence> &newShortcut)
// Write the changed shortcut to kdeglobals
sanitizeShortcutList(&info->cut);
- cg.writeEntry(info->name, QKeySequence::listToString(info->cut), KConfig::Global | KConfig::Persistent);
+ cg.writeEntry(info->name, QKeySequence::listToString(info->cut), KConfig::Global | KConfig::Persistent | KConfig::Notify);
+ cg.sync();
}
QString name(StandardShortcut id)
diff --git a/src/gui/kstandardshortcut_p.h b/src/gui/kstandardshortcut_p.h
new file mode 100644
index 00000000..f4b0a0fb
--- /dev/null
+++ b/src/gui/kstandardshortcut_p.h
@@ -0,0 +1,20 @@
+/*
+ This file is part of the KDE libraries
+ SPDX-FileCopyrightText: 1997 Stefan Taferner <taferner@alpin.or.at>
+ SPDX-FileCopyrightText: 2000 Nicolas Hadacek <haadcek@kde.org>
+ SPDX-FileCopyrightText: 2001, 2002 Ellis Whitehead <ellis@kde.org>
+
+ SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef KSTANDARDSHORTCUT_P_H
+#define KSTANDARDSHORTCUT_P_H
+
+#include "kstandardshortcut.h"
+
+namespace KStandardShortcut
+{
+void initialize(StandardShortcut id);
+}
+
+#endif
diff --git a/src/gui/kstandardshortcutwatcher.cpp b/src/gui/kstandardshortcutwatcher.cpp
new file mode 100644
index 00000000..1be5e503
--- /dev/null
+++ b/src/gui/kstandardshortcutwatcher.cpp
@@ -0,0 +1,46 @@
+/*
+ SPDX-FileCopyrightText: 2022 David Redondo <kde@david-redondo.de>
+
+ SPDX-License-Identifier: LGPL-2.0-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
+*/
+
+#include "kstandardshortcutwatcher.h"
+
+#include "kconfigwatcher.h"
+#include "kstandardshortcut_p.h"
+
+namespace KStandardShortcut
+{
+class StandardShortcutWatcherPrivate
+{
+public:
+ KConfigWatcher::Ptr watcher = KConfigWatcher::create(KSharedConfig::openConfig());
+};
+
+StandardShortcutWatcher::StandardShortcutWatcher(QObject *parent)
+ : QObject(parent)
+ , d(std::make_unique<StandardShortcutWatcherPrivate>())
+{
+ connect(d->watcher.get(), &KConfigWatcher::configChanged, this, [this](const KConfigGroup &group, const QByteArrayList &keys) {
+ if (group.name() != QStringLiteral("Shortcuts")) {
+ return;
+ }
+ for (const auto &key : keys) {
+ const StandardShortcut shortcut = KStandardShortcut::findByName(QString::fromUtf8(key));
+ if (shortcut != KStandardShortcut::AccelNone) {
+ initialize(shortcut);
+ Q_EMIT shortcutChanged(shortcut, KStandardShortcut::shortcut(shortcut));
+ }
+ }
+ });
+}
+
+StandardShortcutWatcher::~StandardShortcutWatcher() = default;
+
+StandardShortcutWatcher *shortcutWatcher()
+{
+ static StandardShortcutWatcher watcher;
+ return &watcher;
+}
+
+}
diff --git a/src/gui/kstandardshortcutwatcher.h b/src/gui/kstandardshortcutwatcher.h
new file mode 100644
index 00000000..64c6d3d4
--- /dev/null
+++ b/src/gui/kstandardshortcutwatcher.h
@@ -0,0 +1,54 @@
+/*
+ SPDX-FileCopyrightText: 2022 David Redondo <kde@david-redondo.de>
+
+ SPDX-License-Identifier: LGPL-2.0-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
+*/
+
+#ifndef KSTANDARDSHORTCUTWATCHER_H
+#define KSTANDARDSHORTCUTWATCHER_H
+
+#include "kstandardshortcut.h"
+
+#include <QObject>
+
+#include <memory>
+
+#include <kconfiggui_export.h>
+
+namespace KStandardShortcut
+{
+class StandardShortcutWatcherPrivate;
+
+/**
+ * Watches for changes made to standard shortcuts and notifies about those changes.
+ * @see KStandardShortcut::shortcutWatcher
+ * @since 5.91
+ */
+class KCONFIGGUI_EXPORT StandardShortcutWatcher : public QObject
+{
+ Q_OBJECT
+public:
+ ~StandardShortcutWatcher();
+Q_SIGNALS:
+ /**
+ * The standardshortcut @p id was changed to @p shortcut
+ */
+ void shortcutChanged(KStandardShortcut::StandardShortcut id, const QList<QKeySequence> &shortcut);
+
+private:
+ explicit StandardShortcutWatcher(QObject *parent = nullptr);
+ friend StandardShortcutWatcher *shortcutWatcher();
+ std::unique_ptr<StandardShortcutWatcherPrivate> d;
+};
+
+/**
+ * Returns the global KStandardShortcutWatcher instance of this program.
+ * In addition to the notifying about changes it also keeps the information returned by the
+ * functions in @p KStandardShortcut up to date.
+ * The object is created by the first call to this function.
+ * @since 5.91
+ */
+KCONFIGGUI_EXPORT StandardShortcutWatcher *shortcutWatcher();
+}
+
+#endif