#!/usr/bin/env bash # description: Manage KDE Plasma Activities via D-Bus. Args: [name_or_id] set -euo pipefail SERVICE="org.kde.ActivityManager" OBJ_PATH="/ActivityManager/Activities" IFACE="org.kde.ActivityManager.Activities" cmd="${1:-list}" case "$cmd" in list) # List all activities with their names and states ids=$(gdbus call --session --dest "$SERVICE" \ --object-path "$OBJ_PATH" \ --method "$IFACE.ListActivities" 2>/dev/null | \ sed "s/^(\[//;s/\],)$//;s/'//g;s/, /\n/g") if [ -z "$ids" ]; then echo "ERROR: cannot list activities (ActivityManager not running?)" >&2 exit 1 fi current=$(gdbus call --session --dest "$SERVICE" \ --object-path "$OBJ_PATH" \ --method "$IFACE.CurrentActivity" 2>/dev/null | \ sed "s/^('//;s/',)$//") echo "ID STATE NAME" while IFS= read -r id; do [ -z "$id" ] && continue name=$(gdbus call --session --dest "$SERVICE" \ --object-path "$OBJ_PATH" \ --method "$IFACE.ActivityName" "$id" 2>/dev/null | \ sed "s/^('//;s/',)$//") if [ "$id" = "$current" ]; then state="active" else state="stopped" fi echo "$id $state $name" done <<< "$ids" ;; current) id=$(gdbus call --session --dest "$SERVICE" \ --object-path "$OBJ_PATH" \ --method "$IFACE.CurrentActivity" 2>/dev/null | \ sed "s/^('//;s/',)$//") name=$(gdbus call --session --dest "$SERVICE" \ --object-path "$OBJ_PATH" \ --method "$IFACE.ActivityName" "$id" 2>/dev/null | \ sed "s/^('//;s/',)$//") echo "$id $name" ;; switch) target="${2:?usage: gui_activities switch }" # Try as ID first result=$(gdbus call --session --dest "$SERVICE" \ --object-path "$OBJ_PATH" \ --method "$IFACE.SetCurrentActivity" "$target" 2>/dev/null) && { echo "switched to: $target" exit 0 } # Search by name ids=$(gdbus call --session --dest "$SERVICE" \ --object-path "$OBJ_PATH" \ --method "$IFACE.ListActivities" 2>/dev/null | \ sed "s/^(\[//;s/\],)$//;s/'//g;s/, /\n/g") while IFS= read -r id; do [ -z "$id" ] && continue name=$(gdbus call --session --dest "$SERVICE" \ --object-path "$OBJ_PATH" \ --method "$IFACE.ActivityName" "$id" 2>/dev/null | \ sed "s/^('//;s/',)$//") if echo "$name" | grep -qi "$target"; then gdbus call --session --dest "$SERVICE" \ --object-path "$OBJ_PATH" \ --method "$IFACE.SetCurrentActivity" "$id" >/dev/null echo "switched to: $name ($id)" exit 0 fi done <<< "$ids" echo "ERROR: no activity matching '$target'" >&2 exit 1 ;; create) name="${2:?usage: gui_activities create }" id=$(gdbus call --session --dest "$SERVICE" \ --object-path "$OBJ_PATH" \ --method "$IFACE.AddActivity" "$name" 2>/dev/null | \ sed "s/^('//;s/',)$//") echo "created: $id ($name)" ;; remove) target="${2:?usage: gui_activities remove }" # Try as ID directly gdbus call --session --dest "$SERVICE" \ --object-path "$OBJ_PATH" \ --method "$IFACE.RemoveActivity" "$target" 2>/dev/null && { echo "removed: $target" exit 0 } # Search by name ids=$(gdbus call --session --dest "$SERVICE" \ --object-path "$OBJ_PATH" \ --method "$IFACE.ListActivities" 2>/dev/null | \ sed "s/^(\[//;s/\],)$//;s/'//g;s/, /\n/g") while IFS= read -r id; do [ -z "$id" ] && continue name=$(gdbus call --session --dest "$SERVICE" \ --object-path "$OBJ_PATH" \ --method "$IFACE.ActivityName" "$id" 2>/dev/null | \ sed "s/^('//;s/',)$//") if echo "$name" | grep -qi "$target"; then gdbus call --session --dest "$SERVICE" \ --object-path "$OBJ_PATH" \ --method "$IFACE.RemoveActivity" "$id" >/dev/null echo "removed: $name ($id)" exit 0 fi done <<< "$ids" echo "ERROR: no activity matching '$target'" >&2 exit 1 ;; *) echo "usage: gui_activities [name_or_id]" >&2 exit 1 ;; esac