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;
|