diff options
Diffstat (limited to '.local/bin/seance')
-rwxr-xr-x | .local/bin/seance | 132 |
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; |