allow arrow keys to work on console or rio window; but since there's no way to position the cursor without erasing text ← and ^a don't work as one would expect. (this could be fixed, but norio itself seems a bit misguided) additionally, fix rune handling. ironicly vt can't handle this. Reference: /n/atom/patch/applied2013/noriofixes Date: Thu Dec 26 13:55:10 CET 2013 Signed-off-by: quanstro@quanstro.net --- /sys/src/cmd/aux/norio.c Thu Dec 26 13:52:06 2013 +++ /sys/src/cmd/aux/norio.c Thu Dec 26 13:52:07 2013 @@ -3,8 +3,10 @@ #include #include #include <9p.h> +#include #define Ctl(c) ((c) - '@') +#define Esc(c) ((c) << 24) enum { Hbufsz = 8192, @@ -333,7 +335,7 @@ char *e, *p; if(h->histfd == -1) - return nil; + return ""; if(h->reset == 1){ dohistreset(h); h->reset = 0; @@ -356,7 +358,7 @@ } if(histfil(h, 1) == -1){ h->dir = 0; - return nil; + return ""; } } } @@ -388,6 +390,27 @@ } int +cpnrune(char *s1, char *s2, int n) +{ + int rv, m; + Rune dummy; + + rv = 0; + for(;n > 0; n--){ + if(*s2 == 0){ + rv = -1; + break; + } + m = chartorune(&dummy, s2); + memcpy(s1, s2, m); + s1 += m; + s2 += m; + } + *s1 = 0; + return rv; +} + +int countrunes(char *s, char *e) { int i, n; @@ -424,7 +447,8 @@ if(n == 0) return -1; i->tick += n; - return n < 0? 1: 3; +// return n < 0? 1: 3; + return 3; } int @@ -527,8 +551,9 @@ c->outpt += n; } +/* esc sequences from ansi terminals */ int -ichar(Cp *p, int c) +irune(Cp *p, Rune c) { char *t, *tl, *rp, *s, *o, buf[256*4], tbuf[512]; int r, i, n, rv, esc, emit; @@ -537,8 +562,7 @@ cn = p->cons; emit = 3; r = cn->raw; - buf[0] = c; - buf[1] = 0; + snprint(buf, sizeof buf, "%C", c); s = o = buf; tl = nil; rv = 1; @@ -558,17 +582,17 @@ esc = 0; if(s == nil) r = 1; - else switch(cn->esc << 8 | c){ - case 1<<8 | '[': - case 1<<8 | 'O': + else switch(Esc(cn->esc) | c){ + case Esc(1) | '[': + case Esc(1) | 'O': esc = 2; emit = 0; break; - case 2<<8 | '3': + case Esc(2) | '3': esc = 3; emit = 0; break; - case 3<<8 | '~': + case Esc(3) | '~': if(cn->tick == cn->e){ emit = 0; break; @@ -579,7 +603,8 @@ o = ""; tl = " \b"; break; - case 2<<8 | 'A': + case Kup: + case Esc(2) | 'A': case Ctl('P'): s = hprev(cn); if(s == nil) @@ -600,39 +625,34 @@ cleanibuf(cn); addstr(cn, s); break; - case 2<<8 | 'B': + case Kdown: + case Esc(2) | 'B': case Ctl('N'): s = hnext(cn); - if(s == nil) - s = ""; goto h; - case 2<<8 | 'C': + case Kright: + case Esc(2) | 'C': case Ctl('F'): - buf[0] = cn->tick[0]; - buf[1] = 0; + cpnrune(buf, cn->tick, 1); emit = move(cn, 1); o = buf; break; - case 2<<8 | 'D': + case Kleft: + case Esc(2) | 'D': case Ctl('B'): emit = move(cn, -1); o = "\b"; break; case Ctl('A'): n = cn->tick-cn->ibuf; - for(i = 0; i < n;) - buf[i++] = Ctl('H'); - buf[i] = 0; + memset(buf, Ctl('H'), n); + buf[n] = 0; s = buf; cn->tick = cn->ibuf; emit = 1; break; case 0x7f: case Ctl('C'): - // proccreate(interruptproc, cn, 4096); - // o = ""; - // s = nil; - // break; interruptproc(cn); if(sendp(p->c, nil) == -1) sysfatal("sendp: %r"); @@ -656,7 +676,7 @@ n = cn->e - cn->tick; cut(cn, cn->tick, n); memset(buf, ' ', n); - memset(buf+n, '\b', n); + memset(buf+n, '\b', n); /* wrong, runes */ buf[2*n] = 0; s = buf; cn->e = cn->tick; @@ -737,22 +757,40 @@ cn->e[0] = 0; if(r != 1 && emit&2 && cn->tick != cn->e){ emitit(cn->co, cn->tick); - n = cn->e - cn->tick; - for(i = 0; i < n;) - buf[i++] = Ctl('H'); - buf[i] = 0; + n = countrunes(cn->tick, cn->e); + memset(buf, Ctl('H'), n); + buf[n] = 0; rp = buf; } if(tl != nil) emitit(cn->co, tl); if(rp != nil) - emitit(cn->co, buf); + emitit(cn->co, rp); } if(r) cleanibuf(cn); return rv; } +int +ichar(Cp *p, int c) +{ + Rune r; + static char rbuf[UTFmax+1]; + static int i; + + if(i == UTFmax) + i = 0; + rbuf[i++] = c; + if(!fullrune(rbuf, i)) + return 1; + i = 0; + chartorune(&r, rbuf); + if(r != Runeerror) + return irune(p, r); + return 1; +} + void consiproc(void *v) { @@ -777,7 +815,7 @@ dump:; } dead: -syslog(0, "norio", "%s exiting %s", buf, "dead"); +// syslog(0, "norio", "%s exiting %s", buf, "dead"); fprint(2, "%s: exiting\n", buf); chanclose(c->c); threadexitsall(""); @@ -802,8 +840,8 @@ if(n == -1) break; } -syslog(0, "norio", "%s exiting %s", buf, s); -fprint(2, "%s: exiting\n", buf); +// syslog(0, "norio", "%s exiting %s", buf, s); +fprint(2, "%s: exiting %s\n", buf, s); chanclose(c->c); threadexits(""); } @@ -1055,6 +1093,7 @@ return; } +// r->fid->aux = a; switch(a->type){ default: abort(); @@ -1071,7 +1110,6 @@ respond(r, nil); break; } - r->fid->aux = a; } void @@ -1156,7 +1194,7 @@ void usage(void) { - fprint(2, "usage: norio [Ssml]\n"); + fprint(2, "usage: norio [-Sl] [-s srvpt] [-m mtpt]\n"); exits(""); } @@ -1192,7 +1230,7 @@ if(!flag['l']){ c->ctlfd = open(consctl, OWRITE); if(c->ctlfd == -1) - sysfatal("open: %r"); + sysfatal("open: %r"); write(c->ctlfd, "rawon", 5); } @@ -1216,14 +1254,12 @@ threadpostmountsrv(&fs, srv, mtpt, MBEFORE); c->pid = rc(); threadnotify(nf0, 1); -// while(waitpid() != c->pid) -// ; for(;;){ w = wait(); if(w == nil) break; if(w->msg && w->msg[0]) - print("rc exits: %s\n", w->msg); + fprint(2, "rc exits: %s\n", w->msg); free(w); break; }