From 2db546a062606f280376cc5c7c0ae528d0121cab Mon Sep 17 00:00:00 2001 From: Andrew Cady Date: Mon, 2 Sep 2024 07:28:31 -0400 Subject: put write-tty under job control; simplifications --- src/twopane.bash | 60 +++++++++++++++++++++++++++----------------------------- 1 file changed, 29 insertions(+), 31 deletions(-) diff --git a/src/twopane.bash b/src/twopane.bash index 990035d..0284e4b 100755 --- a/src/twopane.bash +++ b/src/twopane.bash @@ -257,6 +257,7 @@ connect() disconnect_sink ECHOSEND connect_coproc TOP_PANE fi + connect_sink TTY_WRITER write-tty connect_sink ECHOSEND echo_sender } @@ -280,16 +281,6 @@ send() printf '%s\n' "$*" >&${TOP_PANE_OUT?Internal error} } -check_restart_sink() -{ - (( $# > 0 )) || set -- SINK - declare -n sinkfd="$1" - declare -n pid="${!sinkfd}_PID" - [ "$pid" ] || return - kill -0 "$pid" &>/dev/null || - start_sink_process "${!sinkfd}" -} - tty_forward() { printf '%d\n' "$BASHPID" > "$TWOPANE"/tty_forward.pid @@ -302,14 +293,14 @@ TOP_PANE() (exec -a bottom-pane-tty-forward socat - UNIX-CONNECT:"$TWOPANE"/socket,forever) case "$TOP_EXIT" in restart ) - x kill_tty_forward -STOP + x kill_tty_forward -TSTP x kill -INT $$ ;; quit ) quit ;; prompt | * ) - x kill_tty_forward -STOP + x kill_tty_forward -TSTP focus bottom ;; esac @@ -356,41 +347,45 @@ fifo_sink() connect_sink() { (( $# > 0 )) || set -- SINK - (( $# > 1 )) || set -- "$1" "$1" declare -n sinkfd="$1" declare -n pid="${!sinkfd}_PID" declare -n sinkstartcmd="${!sinkfd}_start_command" - sinkstartcmd=$(printf '%q\n' "${@:2}") - if [ "$pid" ] + if (( $# >= 2 )) + then + sinkstartcmd=$(printf '%q\n' "${@:2}") + elif [ ! "$sinkstartcmd" ] + then + sinkstartcmd="${!sinkfd}" + fi + if kill -0 "$pid" &>/dev/null then i "sink already running: ${!sinkfd}" else - start_sink_process "${!sinkfd}" + i "sink starting: ${!sinkfd}" + local cmd + cmd=($sinkstartcmd) + (( ${#cmd} > 0 )) || return + fifo_sink "${!sinkfd}" "${cmd[@]}" + pid=$! fi } -start_sink_process() +check_restart_sink() { - (( $# > 0 )) || set -- SINK - declare -n sinkfd="$1" - declare -n sinkstartcmd="${!sinkfd}_start_command" - declare -a cmd - cmd=($sinkstartcmd) - (( ${#cmd[@]} > 0 )) || return - i "sink starting: ${!sinkfd}" - fifo_sink "${!sinkfd}" "${cmd[@]}" - pid=$! + connect_sink "$1" } disconnect_sink() { (( $# > 0 )) || set -- SINK declare -n sinkfd="$1" - [ "$fd" ] || return + [ "$sinkfd" ] || return declare -n pid="${!sinkfd}_PID" i "sink stopping: ${!sinkfd}" exec {sinkfd}>&- kill $pid 2>/dev/null + kill -CONT $pid 2>/dev/null + disown $pid &>/dev/null unset fd pid } @@ -421,8 +416,10 @@ quiet_bg() # but we have none. echo_sender() { - (exec -a echo_sender socat - fd:${TOP_PANE_IN?$0: Internal error}!!-) | - tee >(write-tty) >&${TOP_PANE_OUT?$0: Internal error} + trap 'exit' TTOU + (exec -a echo_sender socat - fd:"${TOP_PANE_IN?${LINENO@Q}}"!!-) | + tee /dev/fd/"${TTY_WRITER?${LINENO@Q}}" | + socat - fd:"${TOP_PANE_OUT?${LINENO@Q}}" } restart_tty_forward() @@ -493,8 +490,6 @@ killpgrp() prompt_command() { - check_restart_sink ECHOSEND - [ "$TOP_EXIT" = 'restart' ] || return 0 if [ "$SIG" = INT ] @@ -503,6 +498,8 @@ prompt_command() return fi + check_restart_sink ECHOSEND + local job if ! { job=$(jobs %tty_forward 2>/dev/null) && [ "$job" ]; } then @@ -526,6 +523,7 @@ prompt_command() SIGINT() { i INT "${BASH_COMMAND@A}" + disown $TOP_PANE_PID $ECHOSEND_PID 2>/dev/null kill $TOP_PANE_PID $ECHOSEND_PID 2>/dev/null SIG=INT PROMPT_COMMAND=prompt_command -- cgit v1.2.3