summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Cady <d@jerkface.net>2024-08-21 20:39:05 -0400
committerAndrew Cady <d@jerkface.net>2024-08-21 20:47:18 -0400
commit92cce772cb7361ec9cae418d676bfa39713872be (patch)
tree32d9fcfb5e09942aee38c8e9bfa2a22074d936c8
parent98497a1a5e4eeba4d003c80e609ca2924148303f (diff)
reattaching is now working again
-rwxr-xr-xsrc/twopane.bash92
1 files 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
17 BOT_CMD=foreground 17 BOT_CMD=foreground
18 #BOT_CMD=start 18 #BOT_CMD=start
19 #TOP_EXIT=quit 19 #TOP_EXIT=quit
20 TOP_EXIT=prompt 20 #TOP_EXIT=prompt
21 #TOP_EXIT=restart 21 TOP_EXIT=restart
22else 22else
23 TOP_CMD=$* 23 TOP_CMD=$*
24 BOT_CMD=start 24 BOT_CMD=start
@@ -105,7 +105,19 @@ start_screen_pane()
105 TOP_TITLE="Command: ${*@Q}" 105 TOP_TITLE="Command: ${*@Q}"
106 screen -X focus top 106 screen -X focus top
107 screen -X screen -ln -t "$TOP_TITLE" 1 "$@" 107 screen -X screen -ln -t "$TOP_TITLE" 1 "$@"
108 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' 108 start_screen_pane_subprocess "$pane"
109}
110
111start_screen_pane_subprocess()
112{
113 declare -i pane="${1:-1}"
114 subproc_command=(
115 exec -a top-pane-tty-forward
116 socat
117 UNIX-LISTEN:"$TWOPANE"/socket
118 STDIN,cfmakeraw,opost=1,onlcr=1!!STDOUT
119 )
120 screen -p "$pane" -X exec .!. bash -c "${subproc_command[*]}"
109} 121}
110 122
111restart_screen_pane() 123restart_screen_pane()
@@ -174,12 +186,8 @@ disconnect()
174{ 186{
175 : "${TOP_PANE_STDIN@A} ${TOP_PANE_STDOUT@A} ${TOP_PANE_PID@A} ${TOP_PANE[@]@A}" 187 : "${TOP_PANE_STDIN@A} ${TOP_PANE_STDOUT@A} ${TOP_PANE_PID@A} ${TOP_PANE[@]@A}"
176 disconnect_coproc TOP_PANE 188 disconnect_coproc TOP_PANE
177 if [ "$ECHOSEND" ] 189 : "${ECHOSEND@A} ${ECHOSEND_PID@A}"
178 then 190 disconnect_sink ECHOSEND
179 exec {ECHOSEND}>&-
180 kill $ECHOSEND_PID 2>/dev/null
181 unset ECHOSEND ECHOSEND_PID
182 fi
183} 191}
184 192
185sendc() 193sendc()
@@ -242,6 +250,7 @@ TOP_PANE()
242 kill_tty_forward 250 kill_tty_forward
243 case "$TOP_EXIT" in 251 case "$TOP_EXIT" in
244 restart ) 252 restart )
253 start_screen_pane 1
245 kill -USR1 $$ 254 kill -USR1 $$
246 ;; 255 ;;
247 quit ) 256 quit )
@@ -258,20 +267,20 @@ sink()
258{ 267{
259 declare -n fd="$1" 268 declare -n fd="$1"
260 declare -n pid="${!fd}_PID" 269 declare -n pid="${!fd}_PID"
261 if [ "$fd" ] 270 disconnect_sink "$fd"
262 then
263 exec {fd}>&-
264 kill $pid 2>/dev/null
265 unset fd pid
266 fi
267 exec {fd}> >("${@:2}") 271 exec {fd}> >("${@:2}")
268 pid=$! 272 pid=$!
269} 273}
270 274
271echo_sender() 275disconnect_sink()
272{ 276{
273 (exec -a echo_sender socat - fd:${TOP_PANE_STDIN?$0: Internal error}!!-) | 277 [ "$1" ] || return
274 tee >(write-tty) >&${TOP_PANE_STDOUT?$0: Internal error} 278 declare -n fd="$1"
279 [ "$fd" ] || return
280 declare -n pid="${!fd}_PID"
281 exec {fd}>&-
282 kill $pid 2>/dev/null
283 unset fd pid
275} 284}
276 285
277quiet_bg() 286quiet_bg()
@@ -282,14 +291,22 @@ quiet_bg()
282 } {STDERR}>&2 2>/dev/null 291 } {STDERR}>&2 2>/dev/null
283} 292}
284 293
294echo_sender()
295{
296 (exec -a echo_sender socat - fd:${TOP_PANE_STDIN?$0: Internal error}!!-) |
297 tee >(write-tty) >&${TOP_PANE_STDOUT?$0: Internal error}
298}
299
285background() 300background()
286{ 301{
287 disconnect
288 start_screen_pane 1 "$@" 302 start_screen_pane 1 "$@"
289 focus bottom 303 focus bottom
304
305 disconnect_sink ECHOSEND
290 connect 306 connect
291 sink ECHOSEND echo_sender 307 sink ECHOSEND echo_sender
292 quiet_bg tty_forward >&$ECHOSEND 308 quiet_bg tty_forward >&$ECHOSEND
309
293 TTY_FORWARD_PID=$! 310 TTY_FORWARD_PID=$!
294 printf '%d\n' "$TTY_FORWARD_PID" > "$TWOPANE"/tty_forward.pid 311 printf '%d\n' "$TTY_FORWARD_PID" > "$TWOPANE"/tty_forward.pid
295 printf '%s\n' \ 312 printf '%s\n' \
@@ -300,41 +317,12 @@ background()
300 chmod +x "$TWOPANE"/unforward 317 chmod +x "$TWOPANE"/unforward
301} 318}
302 319
303foreground_once() 320foreground()
304{ 321{
305 check_tty_reader || background "$@" 322 check_tty_reader || background "$@"
306 focus top 323 focus top
307 while jobs %tty_forward >/dev/null 2>&1 324 fg %tty_forward >/dev/null 2>&1
308 do 325 focus bottom
309 fg %tty_forward >/dev/null
310 kill %tty_forward 2>/dev/null
311 done
312}
313
314foreground_loop()
315{
316 while true
317 do
318 foreground_once "$@"
319 case "$TOP_EXIT" in
320 restart )
321 start_screen_pane "$@"
322 continue
323 ;;
324 quit )
325 quit
326 ;;
327 prompt | * )
328 kill -INT 0
329 break # unreached
330 ;;
331 esac
332 done
333}
334
335foreground()
336{
337 foreground_loop "$@"
338} 326}
339 327
340twopane() 328twopane()
@@ -359,7 +347,7 @@ resize()
359 347
360SIGUSR1() 348SIGUSR1()
361{ 349{
362 i "${BASH_COMMAND@A}" 350 i SIGUSR1 "${BASH_COMMAND@A}"
363} 351}
364 352
365our_bashrc_main() 353our_bashrc_main()