aboutsummaryrefslogtreecommitdiff
path: root/.local/bin/seance
blob: 5b9160e9d5a860633499696fab4b45d64c389105 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
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;