From 92cce772cb7361ec9cae418d676bfa39713872be Mon Sep 17 00:00:00 2001 From: Andrew Cady Date: Wed, 21 Aug 2024 20:39:05 -0400 Subject: reattaching is now working again --- src/twopane.bash | 92 ++++++++++++++++++++++++-------------------------------- 1 file changed, 40 insertions(+), 52 deletions(-) diff --git a/src/twopane.bash b/src/twopane.bash index e2b12c9..56d462a 100755 --- a/src/twopane.bash +++ b/src/twopane.bash @@ -17,8 +17,8 @@ then BOT_CMD=foreground #BOT_CMD=start #TOP_EXIT=quit - TOP_EXIT=prompt - #TOP_EXIT=restart + #TOP_EXIT=prompt + TOP_EXIT=restart else TOP_CMD=$* BOT_CMD=start @@ -105,7 +105,19 @@ start_screen_pane() TOP_TITLE="Command: ${*@Q}" screen -X focus top screen -X screen -ln -t "$TOP_TITLE" 1 "$@" - screen -p "$pane" -X exec .!. bash -c 'exec -a top-pane-tty-forward socat UNIX-LISTEN:"$TWOPANE"/socket STDIN,cfmakeraw,opost=1,onlcr=1!!STDOUT' + start_screen_pane_subprocess "$pane" +} + +start_screen_pane_subprocess() +{ + declare -i pane="${1:-1}" + subproc_command=( + exec -a top-pane-tty-forward + socat + UNIX-LISTEN:"$TWOPANE"/socket + STDIN,cfmakeraw,opost=1,onlcr=1!!STDOUT + ) + screen -p "$pane" -X exec .!. bash -c "${subproc_command[*]}" } restart_screen_pane() @@ -174,12 +186,8 @@ disconnect() { : "${TOP_PANE_STDIN@A} ${TOP_PANE_STDOUT@A} ${TOP_PANE_PID@A} ${TOP_PANE[@]@A}" disconnect_coproc TOP_PANE - if [ "$ECHOSEND" ] - then - exec {ECHOSEND}>&- - kill $ECHOSEND_PID 2>/dev/null - unset ECHOSEND ECHOSEND_PID - fi + : "${ECHOSEND@A} ${ECHOSEND_PID@A}" + disconnect_sink ECHOSEND } sendc() @@ -242,6 +250,7 @@ TOP_PANE() kill_tty_forward case "$TOP_EXIT" in restart ) + start_screen_pane 1 kill -USR1 $$ ;; quit ) @@ -258,20 +267,20 @@ sink() { declare -n fd="$1" declare -n pid="${!fd}_PID" - if [ "$fd" ] - then - exec {fd}>&- - kill $pid 2>/dev/null - unset fd pid - fi + disconnect_sink "$fd" exec {fd}> >("${@:2}") pid=$! } -echo_sender() +disconnect_sink() { - (exec -a echo_sender socat - fd:${TOP_PANE_STDIN?$0: Internal error}!!-) | - tee >(write-tty) >&${TOP_PANE_STDOUT?$0: Internal error} + [ "$1" ] || return + declare -n fd="$1" + [ "$fd" ] || return + declare -n pid="${!fd}_PID" + exec {fd}>&- + kill $pid 2>/dev/null + unset fd pid } quiet_bg() @@ -282,14 +291,22 @@ quiet_bg() } {STDERR}>&2 2>/dev/null } +echo_sender() +{ + (exec -a echo_sender socat - fd:${TOP_PANE_STDIN?$0: Internal error}!!-) | + tee >(write-tty) >&${TOP_PANE_STDOUT?$0: Internal error} +} + background() { - disconnect start_screen_pane 1 "$@" focus bottom + + disconnect_sink ECHOSEND connect sink ECHOSEND echo_sender quiet_bg tty_forward >&$ECHOSEND + TTY_FORWARD_PID=$! printf '%d\n' "$TTY_FORWARD_PID" > "$TWOPANE"/tty_forward.pid printf '%s\n' \ @@ -300,41 +317,12 @@ background() chmod +x "$TWOPANE"/unforward } -foreground_once() +foreground() { check_tty_reader || background "$@" focus top - while jobs %tty_forward >/dev/null 2>&1 - do - fg %tty_forward >/dev/null - kill %tty_forward 2>/dev/null - done -} - -foreground_loop() -{ - while true - do - foreground_once "$@" - case "$TOP_EXIT" in - restart ) - start_screen_pane "$@" - continue - ;; - quit ) - quit - ;; - prompt | * ) - kill -INT 0 - break # unreached - ;; - esac - done -} - -foreground() -{ - foreground_loop "$@" + fg %tty_forward >/dev/null 2>&1 + focus bottom } twopane() @@ -359,7 +347,7 @@ resize() SIGUSR1() { - i "${BASH_COMMAND@A}" + i SIGUSR1 "${BASH_COMMAND@A}" } our_bashrc_main() -- cgit v1.2.3