diff options
author | Andrew Cady <d@jerkface.net> | 2024-08-21 20:39:05 -0400 |
---|---|---|
committer | Andrew Cady <d@jerkface.net> | 2024-08-21 20:47:18 -0400 |
commit | 92cce772cb7361ec9cae418d676bfa39713872be (patch) | |
tree | 32d9fcfb5e09942aee38c8e9bfa2a22074d936c8 /src/twopane.bash | |
parent | 98497a1a5e4eeba4d003c80e609ca2924148303f (diff) |
reattaching is now working again
Diffstat (limited to 'src/twopane.bash')
-rwxr-xr-x | src/twopane.bash | 92 |
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 |
22 | else | 22 | else |
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 | |||
111 | start_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 | ||
111 | restart_screen_pane() | 123 | restart_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 | ||
185 | sendc() | 193 | sendc() |
@@ -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 | ||
271 | echo_sender() | 275 | disconnect_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 | ||
277 | quiet_bg() | 286 | quiet_bg() |
@@ -282,14 +291,22 @@ quiet_bg() | |||
282 | } {STDERR}>&2 2>/dev/null | 291 | } {STDERR}>&2 2>/dev/null |
283 | } | 292 | } |
284 | 293 | ||
294 | echo_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 | |||
285 | background() | 300 | background() |
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 | ||
303 | foreground_once() | 320 | foreground() |
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 | |||
314 | foreground_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 | |||
335 | foreground() | ||
336 | { | ||
337 | foreground_loop "$@" | ||
338 | } | 326 | } |
339 | 327 | ||
340 | twopane() | 328 | twopane() |
@@ -359,7 +347,7 @@ resize() | |||
359 | 347 | ||
360 | SIGUSR1() | 348 | SIGUSR1() |
361 | { | 349 | { |
362 | i "${BASH_COMMAND@A}" | 350 | i SIGUSR1 "${BASH_COMMAND@A}" |
363 | } | 351 | } |
364 | 352 | ||
365 | our_bashrc_main() | 353 | our_bashrc_main() |