diff options
-rwxr-xr-x | twopane.bash | 46 |
1 files changed, 30 insertions, 16 deletions
diff --git a/twopane.bash b/twopane.bash index 2aacab2..c4587e6 100755 --- a/twopane.bash +++ b/twopane.bash | |||
@@ -44,34 +44,25 @@ split | |||
44 | focus bottom | 44 | focus bottom |
45 | resize $BOT_SIZE | 45 | resize $BOT_SIZE |
46 | screen -ln -t "$BOT_TITLE" 0 bash --noprofile --rcfile "$TWOPANE"/bashrc -i | 46 | screen -ln -t "$BOT_TITLE" 0 bash --noprofile --rcfile "$TWOPANE"/bashrc -i |
47 | |||
48 | source "$TWOPANE"/screenrc.startpane | 47 | source "$TWOPANE"/screenrc.startpane |
48 | layout save 0 | ||
49 | . | 49 | . |
50 | 50 | ||
51 | save_screenrc 'startpane' <<. | 51 | save_screenrc 'startpane' <<. |
52 | focus top | 52 | focus top |
53 | screen -ln -t "\$TOP_TITLE" 1 $TOP_CMD | 53 | screen -ln -t "\$TOP_TITLE" 1 $TOP_CMD |
54 | exec .!. sh -c 'socat -u UNIX-RECV:"\$TWOPANE"/socket STDOUT & socat -u STDIN,rawer UNIX-SEND:"\$TWOPANE"/socket' | 54 | exec .!. sh -c 'socat -u UNIX-RECV:"\$TWOPANE"/socket STDOUT & socat -u STDIN,rawer UNIX-SEND:"\$TWOPANE"/rsocket' |
55 | title 'output' | 55 | title 'output' |
56 | focus bottom | ||
57 | layout save 0 | ||
58 | . | ||
59 | |||
60 | save_screenrc 'restart' <<. | ||
61 | focus top | 56 | focus top |
62 | screen -ln -t "\$TOP_TITLE" 1 $TOP_CMD | ||
63 | exec .!. sh -c 'socat -u UNIX-RECV:"\$TWOPANE"/socket STDOUT & socat -u STDIN,rawer UNIX-SEND:"\$TWOPANE"/socket' | ||
64 | title 'output' | ||
65 | focus bottom | ||
66 | . | 57 | . |
67 | 58 | ||
68 | restart() | 59 | restart() |
69 | { | 60 | { |
70 | while screen -p1 -Q info | 61 | while screen -p1 -Q info >/dev/null |
71 | do | 62 | do |
72 | screen -p1 -X kill | 63 | screen -p1 -X kill |
73 | done | 64 | done |
74 | screen -X source "$TWOPANE"/screenrc.restart | 65 | screen -X source "$TWOPANE"/screenrc.startpane |
75 | } | 66 | } |
76 | sendp() | 67 | sendp() |
77 | { | 68 | { |
@@ -139,11 +130,21 @@ start() | |||
139 | done | 130 | done |
140 | } | 131 | } |
141 | 132 | ||
133 | recvstream() | ||
134 | { | ||
135 | socat -u UNIX-RECV:"$TWOPANE"/rsocket STDOUT | | ||
136 | tee >(socat -u STDIN UNIX-SENDTO:"$TWOPANE"/socket) | | ||
137 | cat -v | ||
138 | } | ||
139 | |||
142 | sendstream() | 140 | sendstream() |
143 | { | 141 | { |
144 | #trap ': SIGPIPE ;' SIGPIPE | 142 | while ! recvstream |
145 | #trap ': SIGCHLD ;' SIGCHLD | 143 | do |
146 | trap '' SIGPIPE SIGCHLD | 144 | continue |
145 | done & | ||
146 | trap "kill $!" EXIT | ||
147 | trap '' SIGPIPE | ||
147 | trap 'SOCAT=(); RETRY=$REPLY;' SIGUSR1 | 148 | trap 'SOCAT=(); RETRY=$REPLY;' SIGUSR1 |
148 | raw | 149 | raw |
149 | while [ "$RETRY" ] || read -t 0.1 -r -N1 || [ $? -gt 128 ] | 150 | while [ "$RETRY" ] || read -t 0.1 -r -N1 || [ $? -gt 128 ] |
@@ -153,10 +154,23 @@ sendstream() | |||
153 | if [ "$REPLY" ] | 154 | if [ "$REPLY" ] |
154 | then | 155 | then |
155 | sendc "$REPLY" | 156 | sendc "$REPLY" |
157 | elif ! [ -e "$TWOPANE"/socket ] | ||
158 | then | ||
159 | restart | ||
156 | fi | 160 | fi |
157 | done | 161 | done |
158 | } | 162 | } |
159 | 163 | ||
164 | focus() | ||
165 | { | ||
166 | screen -X focus "$@" | ||
167 | } | ||
168 | |||
169 | quit() | ||
170 | { | ||
171 | screen -X quit | ||
172 | } | ||
173 | |||
160 | save_file bashrc <<. | 174 | save_file bashrc <<. |
161 | set -f | 175 | set -f |
162 | set -b | 176 | set -b |