summaryrefslogtreecommitdiff
path: root/src/twopane.bash
diff options
context:
space:
mode:
Diffstat (limited to 'src/twopane.bash')
-rwxr-xr-xsrc/twopane.bash50
1 files changed, 21 insertions, 29 deletions
diff --git a/src/twopane.bash b/src/twopane.bash
index b353269..2f65211 100755
--- a/src/twopane.bash
+++ b/src/twopane.bash
@@ -12,7 +12,7 @@ BOT_TITLE=input
12if [ $# = 0 ] 12if [ $# = 0 ]
13then 13then
14 TOP_CMD="$SHELL -i" 14 TOP_CMD="$SHELL -i"
15 BOT_CMD=background 15 BOT_CMD=foreground
16 TOP_EXIT=prompt 16 TOP_EXIT=prompt
17 #BOT_CMD=start 17 #BOT_CMD=start
18 #TOP_EXIT=restart 18 #TOP_EXIT=restart
@@ -68,22 +68,26 @@ screen -ln -t "$BOT_TITLE" 0 bash --noprofile --rcfile "$TWOPANE"/bashrc -i
68layout save 0 68layout save 0
69. 69.
70 70
71check_top() 71check_screen_pane()
72{ 72{
73 screen -p1 -Q info >/dev/null 73 screen -p "$pane" -Q info >/dev/null
74} 74}
75 75
76kill_top() 76kill_screen_pane()
77{ 77{
78 while check_top 78 while check_screen_pane
79 do 79 do
80 screen -p1 -X kill 80 screen -p "$pane" -X kill
81 done 81 done
82} 82}
83 83
84start_top() 84start_screen_pane()
85{ 85{
86 if check_top 86 declare -g -a PANES
87 declare -i pane="${1:-1}"
88 (( pane > 0 )) || return
89 PANES+=("$pane")
90 if check_screen_pane "$pane"
87 then 91 then
88 return 92 return
89 fi 93 fi
@@ -95,18 +99,13 @@ start_top()
95 TOP_TITLE="Command: ${*@Q}" 99 TOP_TITLE="Command: ${*@Q}"
96 screen -X focus top 100 screen -X focus top
97 screen -X screen -ln -t "$TOP_TITLE" 1 "$@" 101 screen -X screen -ln -t "$TOP_TITLE" 1 "$@"
98 screen -p1 -X exec .!. sh -c 'exec socat UNIX-LISTEN:"$TWOPANE"/socket STDIN,cfmakeraw!!STDOUT' 102 screen -p "$pane" -X exec .!. sh -c 'exec socat UNIX-LISTEN:"$TWOPANE"/socket STDIN,cfmakeraw!!STDOUT'
99} 103}
100 104
101restart_top() 105restart_screen_pane()
102{ 106{
103 kill_top 107 kill_screen_pane
104 start_top "$@" 108 start_screen_pane "$@"
105}
106
107socat_connect()
108{
109 socat STDIN!!STDOUT UNIX-CONNECT:"$TWOPANE"/socket,forever
110} 109}
111 110
112# Start SOCAT if necessary. 111# Start SOCAT if necessary.
@@ -120,17 +119,17 @@ socat_connect()
120connect() 119connect()
121{ 120{
122 case $# in 121 case $# in
123 3 | 5 ) 122 3 )
124 declare -n pid="$1" std0="$2" std1="$3" 123 declare -n pid="$1" std0="$2" std1="$3"
125 shift 3 124 shift 3
126 ;; 125 ;;
127 2 | 4 ) 126 2 )
128 local pid 127 local pid
129 declare -n std0="$1" std1="$2" 128 declare -n std0="$1" std1="$2"
130 shift 2 129 shift 2
131 ;; 130 ;;
132 0 ) 131 0 )
133 local std0 std1 pid 132 local pid std0 std1
134 ;; 133 ;;
135 * ) 134 * )
136 return 1 135 return 1
@@ -183,18 +182,11 @@ start()
183 foreground "$@" 182 foreground "$@"
184} 183}
185 184
186background()
187{
188 start_top "$@"
189 focus bottom
190 connect stdin stdout
191}
192
193foreground_loop() 185foreground_loop()
194{ 186{
195 while true 187 while true
196 do 188 do
197 start_top "$@" 189 start_screen_pane "$@"
198 connect stdin stdout 190 connect stdin stdout
199 forward 191 forward
200 disconnect stdin stdout 192 disconnect stdin stdout
@@ -222,7 +214,7 @@ forwarding()
222forward() 214forward()
223{ 215{
224 declare -g FORWARD_PID 216 declare -g FORWARD_PID
225 if ! check_top 217 if ! check_screen_pane
226 then 218 then
227 echo "$0: Warning: Nothing to forward. Starting anew." >&2 219 echo "$0: Warning: Nothing to forward. Starting anew." >&2
228 background "$@" 220 background "$@"