138 lines
4.8 KiB
Bash
Executable File
138 lines
4.8 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# description: Manage KDE Plasma Activities via D-Bus. Args: <list|current|switch|create|remove> [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 <name_or_id>}"
|
|
|
|
# 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 <name>}"
|
|
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 <name_or_id>}"
|
|
|
|
# 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 <list|current|switch|create|remove> [name_or_id]" >&2
|
|
exit 1
|
|
;;
|
|
esac
|