Commit 9f963fb0 authored by David Redondo's avatar David Redondo 🏎

Add KCModuleData for shortcuts kcm

Unforunately we need to do DBus calls to find out about the current state and
we have to do it blocking because of how the mechanism works. On my machine
each DBus call takes under 1 milliseconds so a timeout of 5should be
fairly safe while not blocking everything for to long. If we see reports coming
in that it doesn't work we can rethink it.
parent 41c47566
......@@ -8,6 +8,7 @@ set(kcm_keys_SRCS
globalaccelmodel.cpp
shortcutsmodel.cpp
standardshortcutsmodel.cpp
keysdata.cpp
)
set(kglobalaccel_xml ${KGLOBALACCEL_DBUS_INTERFACES_DIR}/kf5_org.kde.KGlobalAccel.xml)
......@@ -48,6 +49,7 @@ target_link_libraries(kcm_keys
KF5::ConfigGui
KF5::GlobalAccel
KF5::I18n
KF5::KCMUtils
KF5::KIOWidgets
KF5::QuickAddons
)
......
......@@ -40,10 +40,11 @@
#include "filteredmodel.h"
#include "globalaccelmodel.h"
#include "kcmkeys_debug.h"
#include "keysdata.h"
#include "shortcutsmodel.h"
#include "standardshortcutsmodel.h"
K_PLUGIN_CLASS_WITH_JSON(KCMKeys, "kcm_keys.json")
K_PLUGIN_FACTORY_WITH_JSON(KCMKeysFactory, "kcm_keys.json", registerPlugin<KCMKeys>(); registerPlugin<KeysData>();)
KCMKeys::KCMKeys(QObject *parent, const QVariantList &args)
: KQuickAddons::ConfigModule(parent, args)
......
/*
* Copyright 2020 David Redondo <kde@david-redondo.de>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License or (at your option) version 3 or any later version
* accepted by the membership of KDE e.V. (or its successor approved
* by the membership of KDE e.V.), which shall act as a proxy
* defined in Section 14 of version 3 of the license.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "keysdata.h"
#include <KGlobalAccel>
#include <kglobalaccel_interface.h>
#include <kglobalaccel_component_interface.h>
#include <KGlobalShortcutInfo>
#include <KPluginFactory>
#include <KStandardShortcut>
// Short timeout, rather fail than block isDefaults for to long which needs to be sync
constexpr int dbusTimeout = 5; //milliseconds
KeysData::KeysData(QObject *parent, const QVariantList &args)
{
}
bool KeysData::isDefaults() const
{
for (int i = KStandardShortcut::AccelNone + 1; i < KStandardShortcut::StandardShortcutCount; ++i) {
const auto id = static_cast<KStandardShortcut::StandardShortcut>(i);
const QList<QKeySequence> activeShortcuts = KStandardShortcut::shortcut(id);
const QList<QKeySequence> defaultShortcuts = KStandardShortcut::hardcodedDefaultShortcut(id);
if (activeShortcuts != defaultShortcuts) {
return false;
}
}
// need to do this blocking
KGlobalAccelInterface globalAccelInterface(QStringLiteral("org.kde.kglobalaccel"),
QStringLiteral("/kglobalaccel"), QDBusConnection::sessionBus());
globalAccelInterface.setTimeout(dbusTimeout);
if (!globalAccelInterface.isValid()) {
return true;
}
auto componentsCall = globalAccelInterface.allComponents();
componentsCall.waitForFinished();
if (componentsCall.isError()) {
return true;
}
const auto components = componentsCall.value();
for (const auto &componentPath : components) {
KGlobalAccelComponentInterface component(globalAccelInterface.service(), componentPath.path(),
QDBusConnection::sessionBus());
component.setTimeout(dbusTimeout);
if (!component.isValid()) {
return true;
}
auto allShortcutsCall = component.allShortcutInfos();
allShortcutsCall.waitForFinished();
if (allShortcutsCall.isError()) {
return true;
}
const auto allShortcuts = allShortcutsCall.value();
for (const auto &shortcutInfo : allShortcuts) {
if (shortcutInfo.defaultKeys() != shortcutInfo.keys()) {
return false;
}
}
}
return true;
}
#include "keysdata.moc"
/*
* Copyright 2020 David Redondo <kde@david-redondo.de>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License or (at your option) version 3 or any later version
* accepted by the membership of KDE e.V. (or its successor approved
* by the membership of KDE e.V.), which shall act as a proxy
* defined in Section 14 of version 3 of the license.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef KEYSDATA_H
#define KEYSDATA_H
#include <KCModuleData>
class KeysData : public KCModuleData {
Q_OBJECT
public:
KeysData(QObject *parent = nullptr, const QVariantList &args = {});
bool isDefaults() const override;
};
#endif
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment