summaryrefslogtreecommitdiffstats
path: root/src/cmd/9term/win.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/9term/win.c')
-rw-r--r--src/cmd/9term/win.c58
1 files changed, 49 insertions, 9 deletions
diff --git a/src/cmd/9term/win.c b/src/cmd/9term/win.c
index bed7f2aa..25dfccc9 100644
--- a/src/cmd/9term/win.c
+++ b/src/cmd/9term/win.c
@@ -5,7 +5,6 @@
#include <9pclient.h>
#include "term.h"
-int noecho = 1;
#define EVENTSIZE 256
#define STACK 32768
@@ -71,6 +70,7 @@ void sende(Event*, int, CFid*, CFid*, CFid*, int);
char *onestring(int, char**);
int delete(Event*);
void deltype(uint, uint);
+void sendbs(int, int);
void runproc(void*);
int
@@ -349,6 +349,7 @@ stdinproc(void *v)
CFid *afd = addrfd;
int fd0 = rcfd;
Event e, e2, e3, e4;
+ int n;
USED(v);
@@ -411,7 +412,10 @@ stdinproc(void *v)
break;
case 'D':
- q.p -= delete(&e);
+ n = delete(&e);
+ q.p -= n;
+ if(!isecho(fd0))
+ sendbs(fd0, n);
break;
case 'x':
@@ -491,6 +495,14 @@ stdoutproc(void *v)
n = read(fd1, buf+npart, 8192);
if(n <= 0)
error(nil);
+
+ n = echocancel(buf+npart, n);
+ if(n == 0)
+ continue;
+
+ n = dropcrnl(buf+npart, n);
+ if(n == 0)
+ continue;
/* squash NULs */
s = memchr(buf+npart, 0, n);
@@ -525,8 +537,10 @@ stdoutproc(void *v)
qlock(&q.lk);
m = sprint(x, "#%d", q.p);
if(fswrite(afd, x, m) != m){
- fprint(2, "stdout writing address: %r; resetting\n");
- fswrite(afd, "$", 1);
+ fprint(2, "stdout writing address %s: %r; resetting\n", x);
+ if(fswrite(afd, "$", 1) < 0)
+ fprint(2, "reset: %r\n");
+ fsseek(afd, 0, 0);
m = fsread(afd, x, sizeof x-1);
if(m >= 0){
x[m] = 0;
@@ -660,13 +674,18 @@ addtype(int c, uint p0, char *b, int nb, int nr)
void
sendtype(int fd0)
{
- int i, n, nr;
-
- while(ntypebreak){
+ int i, n, nr, raw;
+
+ raw = !isecho(fd0);
+ while(ntypebreak || (raw && ntypeb > 0)){
for(i=0; i<ntypeb; i++)
- if(typing[i]=='\n' || typing[i]==0x04){
+ if(typing[i]=='\n' || typing[i]==0x04 || (i==ntypeb-1 && raw)){
+ if((typing[i] == '\n' || typing[i] == 0x04) && ntypebreak > 0)
+ ntypebreak--;
n = i+1;
i++;
+ if(isecho(fd0))
+ echoed(typing, n);
if(write(fd0, typing, n) != n)
error("sending to program");
nr = nrunes(typing, i);
@@ -674,7 +693,6 @@ sendtype(int fd0)
ntyper -= nr;
ntypeb -= i;
memmove(typing, typing+i, ntypeb);
- ntypebreak--;
goto cont2;
}
print("no breakchar\n");
@@ -684,6 +702,22 @@ cont2:;
}
void
+sendbs(int fd0, int n)
+{
+ char buf[128];
+ int m;
+
+ memset(buf, 0x08, sizeof buf);
+ while(n > 0) {
+ m = sizeof buf;
+ if(m > n)
+ m = n;
+ n -= m;
+ write(fd0, buf, m);
+ }
+}
+
+void
deltype(uint p0, uint p1)
{
int w;
@@ -738,6 +772,12 @@ type(Event *e, int fd0, CFid *afd, CFid *dfd)
m += nr;
}
}
+ if(!isecho(fd0)) {
+ n = sprint(buf, "#%d,#%d", e->q0, e->q1);
+ fswrite(afd, buf, n);
+ fswrite(dfd, "", 0);
+ q.p -= e->q1 - e->q0;
+ }
sendtype(fd0);
}