diff options
author | Andrew Cady <d@jerkface.net> | 2024-09-02 07:28:31 -0400 |
---|---|---|
committer | Andrew Cady <d@jerkface.net> | 2024-09-02 07:28:31 -0400 |
commit | 2db546a062606f280376cc5c7c0ae528d0121cab (patch) | |
tree | 4684319023814915e0f9e4ed49b9654e52a54051 /src/twopane.bash | |
parent | b941676fe7a11af4bfdf3bde99ca597c32dea7d0 (diff) |
put write-tty under job control; simplifications
Diffstat (limited to 'src/twopane.bash')
-rwxr-xr-x | src/twopane.bash | 60 |
1 files 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() | |||
257 | disconnect_sink ECHOSEND | 257 | disconnect_sink ECHOSEND |
258 | connect_coproc TOP_PANE | 258 | connect_coproc TOP_PANE |
259 | fi | 259 | fi |
260 | connect_sink TTY_WRITER write-tty | ||
260 | connect_sink ECHOSEND echo_sender | 261 | connect_sink ECHOSEND echo_sender |
261 | } | 262 | } |
262 | 263 | ||
@@ -280,16 +281,6 @@ send() | |||
280 | printf '%s\n' "$*" >&${TOP_PANE_OUT?Internal error} | 281 | printf '%s\n' "$*" >&${TOP_PANE_OUT?Internal error} |
281 | } | 282 | } |
282 | 283 | ||
283 | check_restart_sink() | ||
284 | { | ||
285 | (( $# > 0 )) || set -- SINK | ||
286 | declare -n sinkfd="$1" | ||
287 | declare -n pid="${!sinkfd}_PID" | ||
288 | [ "$pid" ] || return | ||
289 | kill -0 "$pid" &>/dev/null || | ||
290 | start_sink_process "${!sinkfd}" | ||
291 | } | ||
292 | |||
293 | tty_forward() | 284 | tty_forward() |
294 | { | 285 | { |
295 | printf '%d\n' "$BASHPID" > "$TWOPANE"/tty_forward.pid | 286 | printf '%d\n' "$BASHPID" > "$TWOPANE"/tty_forward.pid |
@@ -302,14 +293,14 @@ TOP_PANE() | |||
302 | (exec -a bottom-pane-tty-forward socat - UNIX-CONNECT:"$TWOPANE"/socket,forever) | 293 | (exec -a bottom-pane-tty-forward socat - UNIX-CONNECT:"$TWOPANE"/socket,forever) |
303 | case "$TOP_EXIT" in | 294 | case "$TOP_EXIT" in |
304 | restart ) | 295 | restart ) |
305 | x kill_tty_forward -STOP | 296 | x kill_tty_forward -TSTP |
306 | x kill -INT $$ | 297 | x kill -INT $$ |
307 | ;; | 298 | ;; |
308 | quit ) | 299 | quit ) |
309 | quit | 300 | quit |
310 | ;; | 301 | ;; |
311 | prompt | * ) | 302 | prompt | * ) |
312 | x kill_tty_forward -STOP | 303 | x kill_tty_forward -TSTP |
313 | focus bottom | 304 | focus bottom |
314 | ;; | 305 | ;; |
315 | esac | 306 | esac |
@@ -356,41 +347,45 @@ fifo_sink() | |||
356 | connect_sink() | 347 | connect_sink() |
357 | { | 348 | { |
358 | (( $# > 0 )) || set -- SINK | 349 | (( $# > 0 )) || set -- SINK |
359 | (( $# > 1 )) || set -- "$1" "$1" | ||
360 | declare -n sinkfd="$1" | 350 | declare -n sinkfd="$1" |
361 | declare -n pid="${!sinkfd}_PID" | 351 | declare -n pid="${!sinkfd}_PID" |
362 | declare -n sinkstartcmd="${!sinkfd}_start_command" | 352 | declare -n sinkstartcmd="${!sinkfd}_start_command" |
363 | sinkstartcmd=$(printf '%q\n' "${@:2}") | 353 | if (( $# >= 2 )) |
364 | if [ "$pid" ] | 354 | then |
355 | sinkstartcmd=$(printf '%q\n' "${@:2}") | ||
356 | elif [ ! "$sinkstartcmd" ] | ||
357 | then | ||
358 | sinkstartcmd="${!sinkfd}" | ||
359 | fi | ||
360 | if kill -0 "$pid" &>/dev/null | ||
365 | then | 361 | then |
366 | i "sink already running: ${!sinkfd}" | 362 | i "sink already running: ${!sinkfd}" |
367 | else | 363 | else |
368 | start_sink_process "${!sinkfd}" | 364 | i "sink starting: ${!sinkfd}" |
365 | local cmd | ||
366 | cmd=($sinkstartcmd) | ||
367 | (( ${#cmd} > 0 )) || return | ||
368 | fifo_sink "${!sinkfd}" "${cmd[@]}" | ||
369 | pid=$! | ||
369 | fi | 370 | fi |
370 | } | 371 | } |
371 | 372 | ||
372 | start_sink_process() | 373 | check_restart_sink() |
373 | { | 374 | { |
374 | (( $# > 0 )) || set -- SINK | 375 | connect_sink "$1" |
375 | declare -n sinkfd="$1" | ||
376 | declare -n sinkstartcmd="${!sinkfd}_start_command" | ||
377 | declare -a cmd | ||
378 | cmd=($sinkstartcmd) | ||
379 | (( ${#cmd[@]} > 0 )) || return | ||
380 | i "sink starting: ${!sinkfd}" | ||
381 | fifo_sink "${!sinkfd}" "${cmd[@]}" | ||
382 | pid=$! | ||
383 | } | 376 | } |
384 | 377 | ||
385 | disconnect_sink() | 378 | disconnect_sink() |
386 | { | 379 | { |
387 | (( $# > 0 )) || set -- SINK | 380 | (( $# > 0 )) || set -- SINK |
388 | declare -n sinkfd="$1" | 381 | declare -n sinkfd="$1" |
389 | [ "$fd" ] || return | 382 | [ "$sinkfd" ] || return |
390 | declare -n pid="${!sinkfd}_PID" | 383 | declare -n pid="${!sinkfd}_PID" |
391 | i "sink stopping: ${!sinkfd}" | 384 | i "sink stopping: ${!sinkfd}" |
392 | exec {sinkfd}>&- | 385 | exec {sinkfd}>&- |
393 | kill $pid 2>/dev/null | 386 | kill $pid 2>/dev/null |
387 | kill -CONT $pid 2>/dev/null | ||
388 | disown $pid &>/dev/null | ||
394 | unset fd pid | 389 | unset fd pid |
395 | } | 390 | } |
396 | 391 | ||
@@ -421,8 +416,10 @@ quiet_bg() | |||
421 | # but we have none. | 416 | # but we have none. |
422 | echo_sender() | 417 | echo_sender() |
423 | { | 418 | { |
424 | (exec -a echo_sender socat - fd:${TOP_PANE_IN?$0: Internal error}!!-) | | 419 | trap 'exit' TTOU |
425 | tee >(write-tty) >&${TOP_PANE_OUT?$0: Internal error} | 420 | (exec -a echo_sender socat - fd:"${TOP_PANE_IN?${LINENO@Q}}"!!-) | |
421 | tee /dev/fd/"${TTY_WRITER?${LINENO@Q}}" | | ||
422 | socat - fd:"${TOP_PANE_OUT?${LINENO@Q}}" | ||
426 | } | 423 | } |
427 | 424 | ||
428 | restart_tty_forward() | 425 | restart_tty_forward() |
@@ -493,8 +490,6 @@ killpgrp() | |||
493 | 490 | ||
494 | prompt_command() | 491 | prompt_command() |
495 | { | 492 | { |
496 | check_restart_sink ECHOSEND | ||
497 | |||
498 | [ "$TOP_EXIT" = 'restart' ] || return 0 | 493 | [ "$TOP_EXIT" = 'restart' ] || return 0 |
499 | 494 | ||
500 | if [ "$SIG" = INT ] | 495 | if [ "$SIG" = INT ] |
@@ -503,6 +498,8 @@ prompt_command() | |||
503 | return | 498 | return |
504 | fi | 499 | fi |
505 | 500 | ||
501 | check_restart_sink ECHOSEND | ||
502 | |||
506 | local job | 503 | local job |
507 | if ! { job=$(jobs %tty_forward 2>/dev/null) && [ "$job" ]; } | 504 | if ! { job=$(jobs %tty_forward 2>/dev/null) && [ "$job" ]; } |
508 | then | 505 | then |
@@ -526,6 +523,7 @@ prompt_command() | |||
526 | SIGINT() | 523 | SIGINT() |
527 | { | 524 | { |
528 | i INT "${BASH_COMMAND@A}" | 525 | i INT "${BASH_COMMAND@A}" |
526 | disown $TOP_PANE_PID $ECHOSEND_PID 2>/dev/null | ||
529 | kill $TOP_PANE_PID $ECHOSEND_PID 2>/dev/null | 527 | kill $TOP_PANE_PID $ECHOSEND_PID 2>/dev/null |
530 | SIG=INT | 528 | SIG=INT |
531 | PROMPT_COMMAND=prompt_command | 529 | PROMPT_COMMAND=prompt_command |