diff options
-rwxr-xr-x | src/twopane.bash | 50 |
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 | |||
12 | if [ $# = 0 ] | 12 | if [ $# = 0 ] |
13 | then | 13 | then |
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 | |||
68 | layout save 0 | 68 | layout save 0 |
69 | . | 69 | . |
70 | 70 | ||
71 | check_top() | 71 | check_screen_pane() |
72 | { | 72 | { |
73 | screen -p1 -Q info >/dev/null | 73 | screen -p "$pane" -Q info >/dev/null |
74 | } | 74 | } |
75 | 75 | ||
76 | kill_top() | 76 | kill_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 | ||
84 | start_top() | 84 | start_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 | ||
101 | restart_top() | 105 | restart_screen_pane() |
102 | { | 106 | { |
103 | kill_top | 107 | kill_screen_pane |
104 | start_top "$@" | 108 | start_screen_pane "$@" |
105 | } | ||
106 | |||
107 | socat_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() | |||
120 | connect() | 119 | connect() |
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 | ||
186 | background() | ||
187 | { | ||
188 | start_top "$@" | ||
189 | focus bottom | ||
190 | connect stdin stdout | ||
191 | } | ||
192 | |||
193 | foreground_loop() | 185 | foreground_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() | |||
222 | forward() | 214 | forward() |
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 "$@" |