File indexing completed on 2024-05-12 05:35:37
0001 /* 0002 * SPDX-FileCopyrightText: 2015-2016 Ivan Cukic <ivan.cukic@kde.org> 0003 * SPDX-FileCopyrightText: 2023 Ismael Asensio <isma.af@gmail.com> 0004 * 0005 * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL 0006 */ 0007 0008 #include "activityconfig.h" 0009 0010 #include "utils/continue_with.h" 0011 0012 #include <PlasmaActivities/Info> 0013 0014 #include <KConfig> 0015 #include <KConfigGroup> 0016 #include <KGlobalAccel> 0017 #include <KLocalizedString> 0018 0019 #include <QAction> 0020 #include <QDBusConnection> 0021 #include <QDBusPendingCallWatcher> 0022 #include <QDBusPendingReply> 0023 0024 ActivityConfig::ActivityConfig(QObject *parent) 0025 : QObject(parent) 0026 { 0027 reset(); 0028 } 0029 0030 ActivityConfig::~ActivityConfig() 0031 { 0032 } 0033 0034 void ActivityConfig::reset() 0035 { 0036 m_name = QString(); 0037 m_description = QString(); 0038 m_iconName = QStringLiteral("activities"); 0039 m_private = false; 0040 m_shortcut = QKeySequence(); 0041 m_inhibitScreen = false; 0042 m_inhibitSleep = false; 0043 } 0044 0045 QString ActivityConfig::activityId() const 0046 { 0047 return m_activityId; 0048 } 0049 0050 void ActivityConfig::setActivityId(const QString &activityId) 0051 { 0052 if (activityId == m_activityId) { 0053 return; 0054 } 0055 0056 m_activityId = activityId; 0057 Q_EMIT activityIdChanged(); 0058 0059 load(); 0060 } 0061 0062 bool ActivityConfig::isSaveNeeded() 0063 { 0064 KActivities::Info activityInfo(m_activityId); 0065 if (activityInfo.name() != m_name || activityInfo.description() != m_description || activityInfo.icon() != m_iconName) { 0066 return true; 0067 } 0068 0069 const auto shortcuts = KGlobalAccel::self()->globalShortcut(QStringLiteral("ActivityManager"), QStringLiteral("switch-to-activity-%1").arg(m_activityId)); 0070 QKeySequence savedShortcut = shortcuts.isEmpty() ? QKeySequence() : shortcuts.first(); 0071 if (savedShortcut != m_shortcut) { 0072 return true; 0073 } 0074 0075 // The private state is retrieved/set via DBus. We store it in a member variable for convenience 0076 if (m_private != m_savedPrivate) { 0077 return true; 0078 } 0079 0080 if (m_inhibitScreen != m_savedInhibitScreen) { 0081 return true; 0082 } 0083 0084 if (m_inhibitSleep != m_savedInhibitSleep) { 0085 return true; 0086 } 0087 0088 return false; 0089 } 0090 0091 void ActivityConfig::load() 0092 { 0093 if (m_activityId.isEmpty()) { 0094 reset(); 0095 Q_EMIT infoChanged(); 0096 return; 0097 } 0098 0099 KActivities::Info activityInfo(m_activityId); 0100 m_name = activityInfo.name(); 0101 m_description = activityInfo.description(); 0102 m_iconName = activityInfo.icon(); 0103 0104 // finding the key shortcut 0105 const auto shortcuts = KGlobalAccel::self()->globalShortcut(QStringLiteral("ActivityManager"), QStringLiteral("switch-to-activity-%1").arg(m_activityId)); 0106 m_shortcut = shortcuts.isEmpty() ? QKeySequence() : shortcuts.first(); 0107 0108 // Get "isPrivate" property via DBus 0109 QDBusMessage message = QDBusMessage::createMethodCall(QStringLiteral("org.kde.ActivityManager"), 0110 QStringLiteral("/ActivityManager/Features"), 0111 QStringLiteral("org.kde.ActivityManager.Features"), 0112 QStringLiteral("GetValue")); 0113 message.setArguments({QStringLiteral("org.kde.ActivityManager.Resources.Scoring/isOTR/%1").arg(m_activityId)}); 0114 0115 QDBusPendingCall result = QDBusConnection::sessionBus().asyncCall(message); 0116 auto watcher = new QDBusPendingCallWatcher(result, this); 0117 QObject::connect(watcher, &QDBusPendingCallWatcher::finished, this, [&](QDBusPendingCallWatcher *watcher) mutable { 0118 QDBusPendingReply<QDBusVariant> reply = *watcher; 0119 m_private = false; 0120 if (!reply.isError()) { 0121 m_private = reply.value().variant().toBool(); 0122 } 0123 m_savedPrivate = m_private; 0124 Q_EMIT infoChanged(); 0125 watcher->deleteLater(); 0126 }); 0127 0128 KConfig powerdevilConfig("powerdevilrc"); 0129 KConfigGroup activityGroup = powerdevilConfig.group(QStringLiteral("Activities")).group(m_activityId); 0130 m_inhibitScreen = activityGroup.readEntry("InhibitScreenManagement", false); 0131 m_savedInhibitScreen = m_inhibitScreen; 0132 m_inhibitSleep = activityGroup.readEntry("InhibitSuspend", false); 0133 m_savedInhibitSleep = m_inhibitSleep; 0134 0135 Q_EMIT infoChanged(); 0136 } 0137 0138 void ActivityConfig::save() 0139 { 0140 if (m_activityId.isEmpty()) { 0141 createActivity(); 0142 return; 0143 } 0144 0145 m_activities.setActivityName(m_activityId, m_name); 0146 m_activities.setActivityDescription(m_activityId, m_description); 0147 m_activities.setActivityIcon(m_activityId, m_iconName); 0148 0149 // setting the key shortcut 0150 QAction action(nullptr); 0151 action.setProperty("isConfigurationAction", true); 0152 action.setProperty("componentName", QStringLiteral("ActivityManager")); 0153 action.setObjectName(QStringLiteral("switch-to-activity-%1").arg(m_activityId)); 0154 KGlobalAccel::self()->setShortcut(&action, {m_shortcut}, KGlobalAccel::NoAutoloading); 0155 0156 // Set "isPrivate" property via DBus 0157 QDBusMessage message = QDBusMessage::createMethodCall(QStringLiteral("org.kde.ActivityManager"), 0158 QStringLiteral("/ActivityManager/Features"), 0159 QStringLiteral("org.kde.ActivityManager.Features"), 0160 QStringLiteral("SetValue")); 0161 message.setArguments({ 0162 QStringLiteral("org.kde.ActivityManager.Resources.Scoring/isOTR/%1").arg(m_activityId), 0163 QVariant::fromValue(QDBusVariant(m_private)), 0164 }); 0165 QDBusConnection::sessionBus().asyncCall(message); 0166 0167 KConfig powerdevilConfig("powerdevilrc"); 0168 KConfigGroup activityGroup = powerdevilConfig.group(QStringLiteral("Activities")).group(m_activityId); 0169 activityGroup.writeEntry("InhibitScreenManagement", m_inhibitScreen); 0170 m_savedInhibitScreen = m_inhibitScreen; 0171 activityGroup.writeEntry("InhibitSuspend", m_inhibitSleep); 0172 m_savedInhibitSleep = m_inhibitSleep; 0173 } 0174 0175 void ActivityConfig::createActivity() 0176 { 0177 using namespace kamd::utils; 0178 continue_with(KActivities::Controller().addActivity(m_name), [this](const optional_view<QString> &activityId) { 0179 if (activityId.is_initialized()) { 0180 m_activityId = activityId.get(); 0181 save(); 0182 } 0183 }); 0184 }