ollie/tools/gui_activities

150 lines
5.0 KiB
Bash
Executable File

#!/usr/bin/env bash
# ollie:prompt
# ## gui_activities
#
# Manage KDE Plasma Activities.
#
# **Args**: `[action]` or `[action, name_or_id]`
# - Actions: `list`, `current`, `switch`, `create`, `remove`
#
# ```
# call_tool: calls=[{tool: "gui_activities", args: ["list"]}]
# call_tool: calls=[{tool: "gui_activities", args: ["switch", "Development"]}]
# ```
# ollie:end
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