summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xsrc/twopane.bash60
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
283check_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
293tty_forward() 284tty_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()
356connect_sink() 347connect_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
372start_sink_process() 373check_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
385disconnect_sink() 378disconnect_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.
422echo_sender() 417echo_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
428restart_tty_forward() 425restart_tty_forward()
@@ -493,8 +490,6 @@ killpgrp()
493 490
494prompt_command() 491prompt_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()
526SIGINT() 523SIGINT()
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