da53c400b4
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
157 lines
5.6 KiB
C++
157 lines
5.6 KiB
C++
/*
|
|
SPDX-FileCopyrightText: 2008 Michael Jansen <kde@michael-jansen.biz>
|
|
SPDX-FileCopyrightText: 2016 Marco Martin <mart@kde.org>
|
|
SPDX-FileCopyrightText: 2021 David Redondo <kde@david-redondo.de>
|
|
|
|
SPDX-License-Identifier: LGPL-2.0-or-later
|
|
*/
|
|
|
|
#include "kserviceactioncomponent.h"
|
|
#include "globalshortcutcontext.h"
|
|
#include "logging_p.h"
|
|
|
|
#include <QFileInfo>
|
|
#include <QProcess>
|
|
|
|
#include <KService>
|
|
|
|
#include "config-kglobalaccel.h"
|
|
#if HAVE_X11
|
|
#include <KStartupInfo>
|
|
#include <private/qtx11extras_p.h>
|
|
#endif
|
|
|
|
QString makeUniqueName(const KService::Ptr &service)
|
|
{
|
|
if (service->storageId().startsWith(QLatin1Char('/'))) {
|
|
return QFileInfo(service->storageId()).fileName();
|
|
}
|
|
|
|
return service->storageId();
|
|
}
|
|
|
|
KServiceActionComponent::KServiceActionComponent(KService::Ptr service)
|
|
: Component(makeUniqueName(service), service->name())
|
|
, m_service(service)
|
|
{
|
|
}
|
|
|
|
KServiceActionComponent::~KServiceActionComponent() = default;
|
|
|
|
void KServiceActionComponent::emitGlobalShortcutPressed(const GlobalShortcut &shortcut)
|
|
{
|
|
QString exec;
|
|
|
|
if (shortcut.uniqueName() == QLatin1String("_launch")) {
|
|
exec = m_service->exec();
|
|
} else {
|
|
const auto actions = m_service->actions();
|
|
const auto it = std::find_if(actions.cbegin(), actions.cend(), [&shortcut](const KServiceAction &action) {
|
|
return action.name() == shortcut.uniqueName();
|
|
});
|
|
if (it == actions.cend()) {
|
|
qCCritical(KGLOBALACCELD, "failed to find an action matching the '%s' name", qPrintable(shortcut.uniqueName()));
|
|
return;
|
|
}
|
|
exec = it->exec();
|
|
}
|
|
|
|
if (exec.isEmpty()) {
|
|
qCWarning(KGLOBALACCELD) << "No exec line for service" << m_service->desktopEntryName();
|
|
return;
|
|
}
|
|
|
|
QProcess::startDetached(QStringLiteral("/bin/sh"), {QStringLiteral("-c"), exec});
|
|
}
|
|
|
|
void KServiceActionComponent::loadFromService()
|
|
{
|
|
const QString type = m_service->property<QString>(QStringLiteral("X-KDE-GlobalShortcutType"));
|
|
|
|
// Type can be Application or Service
|
|
// For applications add a lauch shortcut
|
|
// If no type is set assume Application
|
|
if (type.isEmpty() || type == QLatin1String("Application")) {
|
|
const QString shortcutString = m_service->property<QStringList>(QStringLiteral("X-KDE-Shortcuts")).join(QLatin1Char('\t'));
|
|
GlobalShortcut *shortcut = registerShortcut(QStringLiteral("_launch"), m_service->name(), shortcutString, shortcutString);
|
|
shortcut->setIsPresent(true);
|
|
}
|
|
|
|
const auto lstActions = m_service->actions();
|
|
for (const KServiceAction &action : lstActions) {
|
|
const QString shortcutString = action.property<QStringList>(QStringLiteral("X-KDE-Shortcuts")).join(QLatin1Char('\t'));
|
|
GlobalShortcut *shortcut = registerShortcut(action.name(), action.text(), shortcutString, shortcutString);
|
|
shortcut->setIsPresent(true);
|
|
}
|
|
}
|
|
|
|
bool KServiceActionComponent::cleanUp()
|
|
{
|
|
qCDebug(KGLOBALACCELD) << "Disabling desktop file";
|
|
|
|
const auto shortcuts = allShortcuts();
|
|
for (GlobalShortcut *shortcut : shortcuts) {
|
|
shortcut->setIsPresent(false);
|
|
}
|
|
|
|
return Component::cleanUp();
|
|
}
|
|
|
|
void KServiceActionComponent::writeSettings(KConfigGroup &config) const
|
|
{
|
|
// Clear the config so we remove entries after forgetGlobalShortcut
|
|
config.deleteGroup();
|
|
|
|
// Now write all contexts
|
|
for (GlobalShortcutContext *context : std::as_const(_contexts)) {
|
|
KConfigGroup contextGroup;
|
|
|
|
if (context->uniqueName() == QLatin1String("default")) {
|
|
contextGroup = config;
|
|
} else {
|
|
contextGroup = KConfigGroup(&config, context->uniqueName());
|
|
}
|
|
|
|
for (const GlobalShortcut *shortcut : std::as_const(context->_actionsMap)) {
|
|
// We do not write fresh shortcuts.
|
|
// We do not write session shortcuts
|
|
if (shortcut->isFresh() || shortcut->isSessionShortcut()) {
|
|
continue;
|
|
}
|
|
|
|
if (shortcut->keys() != shortcut->defaultKeys()) {
|
|
contextGroup.writeEntry(shortcut->uniqueName(), stringFromKeys(shortcut->keys()));
|
|
} else {
|
|
contextGroup.revertToDefault(shortcut->uniqueName());
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void KServiceActionComponent::loadSettings(KConfigGroup &configGroup)
|
|
{
|
|
// Action shortcuts
|
|
const auto actions = m_service->actions();
|
|
for (const KServiceAction &action : actions) {
|
|
const QString defaultShortcutString = action.property<QString>(QStringLiteral("X-KDE-Shortcuts")).replace(QLatin1Char(','), QLatin1Char('\t'));
|
|
const QString shortcutString = configGroup.readEntry(action.name(), defaultShortcutString);
|
|
|
|
GlobalShortcut *shortcut = registerShortcut(action.name(), action.text(), shortcutString, defaultShortcutString);
|
|
shortcut->setIsPresent(true);
|
|
}
|
|
|
|
const QString type = m_service->property<QString>(QStringLiteral("X-KDE-GlobalShortcutType"));
|
|
|
|
// Type can be Application or Service
|
|
// For applications add a lauch shortcut
|
|
// If no type is set assume Application
|
|
if (type.isEmpty() || type == QLatin1String("Application")) {
|
|
const QString defaultShortcutString = m_service->property<QString>(QStringLiteral("X-KDE-Shortcuts")).replace(QLatin1Char(','), QLatin1Char('\t'));
|
|
const QString shortcutString = configGroup.readEntry("_launch", defaultShortcutString);
|
|
GlobalShortcut *shortcut = registerShortcut(QStringLiteral("_launch"), m_service->name(), shortcutString, defaultShortcutString);
|
|
shortcut->setIsPresent(true);
|
|
}
|
|
}
|
|
|
|
#include "moc_kserviceactioncomponent.cpp"
|