Move xlaunch to bin dir
[khome.git] / home / bin / xlaunch
diff --git a/home/bin/xlaunch b/home/bin/xlaunch
new file mode 100755 (executable)
index 0000000..2aa292a
--- /dev/null
@@ -0,0 +1,99 @@
+#! /bin/bash
+
+set -e
+
+SESSION='xlaunch'
+SOCK_NAME="$SESSION"
+TMUX="tmux -L $SOCK_NAME"
+LOG_FILE=~/var/log/xlaunch.log
+
+log() {
+    local -r fmt="$1"
+    shift
+
+    printf "[%s] ${fmt}\n" "$(date +'%F %T')" $@ >> "$LOG_FILE"
+}
+
+counter_next() {
+    local -r file="$_counter_file"
+
+    awk '{n = $1} END {print n + 1}' "$file" | sponge "$file"
+    cat "$file"
+}
+
+tmux_new_win() {
+    local -r command="$1"
+    local -r window_id=$(counter_next)
+    local -r window_name=$(basename "$command")
+    local -r pane=0
+
+    log \
+        '[debug] tmux window_id:"%s", window_name:"%s", command:"%s"' \
+        "$window_id" "$window_name" "$command"
+
+    $TMUX new-window -t "$SESSION" -n "$window_name"
+    $TMUX send-keys  -t "$SESSION":"$window_id"."$pane" "$command" ENTER
+}
+
+launch_from_directory() {
+    local -r scripts_dir="$1"
+
+    log '[info] Looking for scripts in directory: "%s"' "$scripts_dir"
+    if test -d "$scripts_dir"
+    then
+        for script in "$scripts_dir"/*; do
+            log '[debug] Launching script: "%s"' "$script"
+            tmux_new_win "$script"
+            sleep 0.1 # TODO Find a way to block between starts instead.
+        done
+    else
+        log '[warning] Directory not found: %s' "$scripts_dir"
+    fi
+}
+
+_start() {
+    $TMUX new-session -d -s "$SESSION"
+    $TMUX set-option -gt "$SESSION" allow-rename off
+
+    _counter_file=$(mktemp)
+    launch_from_directory ~/.xlaunch.d
+    launch_from_directory ~/.xlaunch.d."$(hostname)"
+}
+
+_startx() {
+    log '[info] Starting X11'
+    _restart
+    log '[info] Launching dwm'
+    exec dwm
+}
+
+_stop() {
+    $TMUX kill-session -t "$SESSION"
+}
+
+_restart() {
+    _stop || true
+    _start
+}
+
+_attach() {
+    $TMUX attach -t "$SESSION"
+}
+
+main() {
+    local -r command="$1"
+
+    case "$command" in
+        #'' ) _startx;;
+        'startx'  ) _startx;;
+        'start'   ) _start;;
+        'stop'    ) _stop;;
+        'restart' ) _restart;;
+        'attach'  ) _attach;;
+        *)
+            echo "[error] Unknown command: \"$command\". Known: startx, start, stop, restart, attach."
+            exit 1;;
+    esac
+}
+
+main "$*"
This page took 0.028358 seconds and 4 git commands to generate.