diff --git a/src/common/dbus/org.kde.ActivityManager.Activities.xml b/src/common/dbus/org.kde.ActivityManager.Activities.xml
--- a/src/common/dbus/org.kde.ActivityManager.Activities.xml
+++ b/src/common/dbus/org.kde.ActivityManager.Activities.xml
@@ -9,6 +9,12 @@
+
+
+
+
+
+
diff --git a/src/service/Activities.h b/src/service/Activities.h
--- a/src/service/Activities.h
+++ b/src/service/Activities.h
@@ -78,6 +78,16 @@
*/
bool SetCurrentActivity(const QString &activity);
+ /**
+ * Switches to the previous activity
+ */
+ bool PreviousActivity();
+
+ /**
+ * Switches to the next activity
+ */
+ bool NextActivity();
+
/**
* Adds a new activity
* @param name name of the activity
diff --git a/src/service/Activities.cpp b/src/service/Activities.cpp
--- a/src/service/Activities.cpp
+++ b/src/service/Activities.cpp
@@ -204,6 +204,42 @@
return true;
}
+static
+bool infoLessThan(const ActivityInfo &info, const ActivityInfo &other)
+{
+ const auto comp =
+ QString::compare(info.name, other.name, Qt::CaseInsensitive);
+ return comp < 0 || (comp == 0 && info.id < other.id);
+}
+
+bool Activities::Private::previousActivity()
+{
+ auto a = q->ListActivitiesWithInformation();
+ std::sort(a.begin(), a.end(), &infoLessThan);
+
+ for (int i = 0; i < a.count(); ++i) {
+ if (a[i].id == currentActivity) {
+ return setCurrentActivity(a[(i + a.size() - 1) % a.size()].id);
+ }
+ }
+
+ return false;
+}
+
+bool Activities::Private::nextActivity()
+{
+ auto a = q->ListActivitiesWithInformation();
+ std::sort(a.begin(), a.end(), &infoLessThan);
+
+ for (int i = 0; i < a.count(); ++i) {
+ if (a[i].id == currentActivity) {
+ return setCurrentActivity(a[(i + 1) % a.size()].id);
+ }
+ }
+
+ return false;
+}
+
QString Activities::Private::addActivity(const QString &name)
{
QString activity;
@@ -471,6 +507,16 @@
return d->setCurrentActivity(activity);
}
+bool Activities::PreviousActivity()
+{
+ return d->previousActivity();
+}
+
+bool Activities::NextActivity()
+{
+ return d->nextActivity();
+}
+
QString Activities::AddActivity(const QString &name)
{
// We do not care about authorization if this is the first start
@@ -596,4 +642,3 @@
QReadLocker lock(&d->activitiesLock);
return d->activities.contains(activity) ? d->activities[activity] : Invalid;
}
-
diff --git a/src/service/Activities_p.h b/src/service/Activities_p.h
--- a/src/service/Activities_p.h
+++ b/src/service/Activities_p.h
@@ -54,6 +54,8 @@
public Q_SLOTS:
bool setCurrentActivity(const QString &activity);
+ bool previousActivity();
+ bool nextActivity();
public:
void setActivityState(const QString &activity, Activities::State state);