aboutsummaryrefslogtreecommitdiff
path: root/.local/bin/seance
diff options
context:
space:
mode:
Diffstat (limited to '.local/bin/seance')
-rwxr-xr-x.local/bin/seance132
1 files changed, 132 insertions, 0 deletions
diff --git a/.local/bin/seance b/.local/bin/seance
new file mode 100755
index 0000000..5b9160e
--- /dev/null
+++ b/.local/bin/seance
@@ -0,0 +1,132 @@
+#!/bin/sh -eu
+
+program=$(basename "$0")
+directory=$HOME/.config/seance
+session=$directory/session
+spirits=$directory/spirits
+
+Help() {
+printf \
+"
+Usage: %s [FLAGS]... [ARGUMENT]...
+
+The program $program shall save and restore
+running programs in a desktop session according
+to a specified configuration file.
+
+Add a program command, one per line, in
+$spirits
+to save to current session.
+
+Session: $session
+Config: $spirits
+
+ Command List:
+
+ $program commit Saves programs in config to session.
+ $program list List session commands.
+ $program config View programs to be saved to session.
+ $program windows List running programs
+ $program search Search for a running program.
+ $program start Restore previous session.
+ $program edit session Edit session commands.
+ $program edit config Edit programs in config.
+ $program -h --help Show this help menu.
+
+" "$program";
+}
+
+Commit() {
+
+windows=$(wmctrl -Glp)
+date=$(date --utc '+%a-%b-%d-%H:%M:%S-%Y')
+
+IFS='
+'
+
+mv "$1" "$1-$date"
+
+true > "$1"
+
+for window in $windows; do
+
+pid=$(printf "%s" "$window" | awk '{ print $3 }')
+desktop=$(printf "%s" "$window" | awk '{ print $2 }')
+title=$(printf "%s" "$window" | tr -s ' ' | cut -d ' ' -f 9-)
+dimensions=$(printf "%s" "$window" | awk '{ print $4, ",", $5, ",", $6, ",", $7 }' | tr -d ' ')
+[ "$pid" = "0" ] && continue;
+process=$(ps -ww -p "$pid" -o command | tail -n 1)
+
+while read -r spirit; do
+ case "$process" in
+ *$spirit*) process=$spirit ;;
+ esac
+done < "$spirits"
+
+commands=$(printf "%s" "$title" | cut -d ' ' -f 3- | sed "s|'|'\\\\\\\''|g")
+
+[ -z "$commands" ] && commands="true"
+
+mime="$(file --mime-type "$title" | awk '{ print $2 }')"
+directory=$(printf "%s" "$title" | cut -d ' ' -f 2)
+
+case "$mime" in
+application/pdf) process="zathura $title" ;;
+esac
+
+case "$title" in
+*term:*) process="\$TERMINAL -e sh -c 'cd $directory && $commands; \$SHELL'" ;;
+esac
+
+case "$title" in
+*vim:*) process="\$TERMINAL -e sh -c '\$EDITOR $directory; \$SHELL'" ;;
+esac
+
+case "$title" in
+*\[Scratch\]*) continue ;;
+esac
+
+case "$commands" in
+*$program*) continue ;;
+esac
+
+grep "$process" "$1" > /dev/null 2>&1 && continue
+
+printf "%s\n" "$process"
+
+printf "\
+$process > /dev/null 2>&1 & disown
+i=0; until wmctrl -Glp | grep -i \"\$!\"; do i=\$((i+1)); [ \$i -gt 150 ] && break; done
+wmctrl -i -r \"\$(wmctrl -Glp | awk -v pid=\"\$!\" '\$0 ~ pid { print \$1 }')\" -t $desktop
+wmctrl -i -r \"\$(wmctrl -Glp | awk -v pid=\"\$!\" '\$0 ~ pid { print \$1 }')\" -e '0,$dimensions'
+
+" >> "$1"
+done
+}
+
+{ [ "${1:-}" = "-h" ] || [ "${1:-}" = "--help" ] || [ "$#" = 0 ]; } && Help && exit;
+
+mkdir --parents "$directory"
+
+touch "$spirits"
+
+[ "${1:-}" = "commit" ] \
+ && { Commit "$session" || printf "Warning empty or failed session file!\n"; } \
+ && printf '\nSession %s canonized.\n\n' "$session" \
+ && exit
+
+[ "${1:-}" = "list" ] && cat "$session" && exit;
+
+[ "${1:-}" = "config" ] && cat "$spirits" && exit;
+
+[ "${1:-}" = "windows" ] && wmctrl -Glp && exit;
+
+[ "${1:-}" = "search" ] && wmctrl -Glp | grep --ignore-case -- "$2" && exit;
+
+[ "${1:-}" = "start" ] && sh "$session" && exit;
+
+[ "${1:-}" = "edit" ] && [ "${2:-}" = "session" ] && $EDITOR "$session" && exit;
+
+[ "${1:-}" = "edit" ] && [ "${2:-}" = "config" ] && $EDITOR "$spirits" && exit;
+
+Help && printf "Error: Unknown argument '%s'.\n\n" "$@" && exit 1;