From 8c1af2f9ea510ba5ecbbe44ced9cc1a590c1d0b4 Mon Sep 17 00:00:00 2001 From: Andrew Cady Date: Mon, 12 Aug 2024 15:02:21 -0400 Subject: improve restarts --- twopane.bash | 72 ++++++++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 55 insertions(+), 17 deletions(-) (limited to 'twopane.bash') diff --git a/twopane.bash b/twopane.bash index ff1a143..672448e 100755 --- a/twopane.bash +++ b/twopane.bash @@ -7,7 +7,7 @@ PROGNAME=${0##*/} BOT_SIZE=8 BOT_TITLE=input -BOT_CMD=sendstream +BOT_CMD=start if [ $# = 0 ] then TOP_CMD="$SHELL -i" @@ -56,7 +56,7 @@ title 'output' focus top . -restart() +restart_top() { while screen -p1 -Q info >/dev/null do @@ -65,7 +65,29 @@ restart() screen -X source "$TWOPANE"/screenrc.startpane } -sendstream() +connect() +{ + coproc SOCAT \ + { + socat STDIN!!STDOUT UNIX-CONNECT:"$TWOPANE"/socket,forever + kill -USR1 $$ + [ "$TOP_EXIT" != restart ] || restart_top + } + eval "exec $1<&${SOCAT[0]} $2>&${SOCAT[1]}" +} + +disconnect() +{ + eval "exec $1<&- $2>&-" +} + +restart() +{ + [ "${SOCAT[0]}" ] || restart_top + start +} + +start() { socat_stty_opts=( rawer @@ -84,25 +106,43 @@ sendstream() ) stty=$(printf %s, "${socat_stty_opts[@]}") - trap ': SIGUSR1; restart' USR1 + trap ': SIGUSR1 ; ' USR1 exec 100<&0 101>&1 while true do - coproc SOCAT \ - { - socat STDIN!!STDOUT UNIX-CONNECT:"$TWOPANE"/socket,forever - kill -USR1 $$ - } - exec 200<&${SOCAT[0]} 201>&${SOCAT[1]} + connect 200 201 socat FD:100,${stty%,}!!STDOUT STDIN!!STDOUT <&200 | input_filter | tee >(output_filter | soft_cursor >&101) >&201 + reset -I -Q -w - exec 200<&- 201>&- + disconnect 200 201 wait -f "$SOCAT_PID" 2>/dev/null + + case "$TOP_EXIT" in + restart ) + continue ;; + quit ) + exit ;; + * ) + screen -X focus bottom + echo + break + ;; + esac done } +quit() +{ + screen -X quit +} + +focus() +{ + screen -X focus "$@" +} + input_filter() { while read -N1 @@ -122,19 +162,17 @@ output_filter() soft_cursor() { - printf $'\033[43m \b' + cursor_color=104 + cursor=$'\033['"$cursor_color"$'m \b\033[00m' + printf '%s' "$cursor" while read -N1 do - printf '%s' \ - $'\033[00m \b' \ - "$REPLY" \ - $'\033[43m \b' + printf '%s' "$REPLY" "$cursor" done } save_file bashrc <<. set -f -set -b set -o pipefail shopt -s lastpipe trap "screen -X quit" EXIT -- cgit v1.2.3