Manage xlaunch scripts as a tmux session, a la pista
[khome.git] / home / .xlaunch
1 #! /bin/bash
2
3 set -e
4
5 SOCK="$HOME/.xlaunch.sock"
6 SESSION='xlaunch'
7 TMUX="tmux -S $SOCK"
8 LOG_FILE=~/var/log/xlaunch.log
9
10 log() {
11 local -r fmt="$1"
12 shift
13
14 printf "${fmt}\n" $@ | twrap.sh >> "$LOG_FILE"
15 }
16
17 counter_next() {
18 local -r file="$_counter_file"
19
20 awk '{n = $1} END {print n + 1}' "$file" | sponge "$file"
21 cat "$file"
22 }
23
24 tmux_new_win() {
25 local -r command="$1"
26 local -r window_id=$(counter_next)
27 local -r window_name=$(basename "$command")
28 local -r pane=0
29
30 log \
31 '[debug] tmux window_id:"%s", window_name:"%s", command:"%s"' \
32 "$window_id" "$window_name" "$command"
33
34 $TMUX new-window -t "$SESSION" -n "$window_name"
35 $TMUX send-keys -t "$SESSION":"$window_id"."$pane" "$command" ENTER
36 }
37
38 launch_from_directory() {
39 local -r scripts_dir="$1"
40
41 log '[info] Looking for scripts in directory: "%s"' "$scripts_dir"
42 if test -d "$scripts_dir"
43 then
44 for script in "$scripts_dir"/*; do
45 log '[debug] Launching script: "%s"' "$script"
46 tmux_new_win "$script"
47 sleep 0.1 # TODO Find a way to block between starts instead.
48 done
49 else
50 log '[warning] Directory not found: %s' "$scripts_dir"
51 fi
52 }
53
54 _start() {
55 $TMUX new-session -d -s "$SESSION"
56 $TMUX set-option -gt "$SESSION" allow-rename off
57
58 _counter_file=$(mktemp)
59 launch_from_directory ~/.xlaunch.d
60 launch_from_directory ~/.xlaunch.d."$(hostname)"
61 }
62
63 _startx() {
64 log '[info] Starting X11'
65 _restart
66 log '[info] Launching dwm'
67 exec dwm
68 }
69
70 _stop() {
71 $TMUX kill-session -t "$SESSION"
72 }
73
74 _restart() {
75 _stop || true
76 _start
77 }
78
79 _attach() {
80 $TMUX attach -t "$SESSION"
81 }
82
83 main() {
84 local -r command="$1"
85
86 case "$command" in
87 #'' ) _startx;;
88 'startx' ) _startx;;
89 'start' ) _start;;
90 'stop' ) _stop;;
91 'restart' ) _restart;;
92 'attach' ) _attach;;
93 *)
94 echo "[error] Unknown command: \"$command\". Known: startx, start, stop, restart, attach."
95 exit 1;;
96 esac
97 }
98
99 main "$*"
This page took 0.064903 seconds and 4 git commands to generate.