diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2016-04-03 22:54:22 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2016-04-03 22:54:22 +0200 |
commit | ce84082205f8367c1a4676c4810d92b30ae87f49 (patch) | |
tree | 1f33dee7fb1674e0c18dcafb5cb56b7ee92aa395 /sys/src/cmd/rio | |
parent | cd9cddf3dd64b01e7e54ba3a3371a8d0a5c70748 (diff) |
change /dev/kbd to return multiple messages per read
Diffstat (limited to 'sys/src/cmd/rio')
-rw-r--r-- | sys/src/cmd/rio/dat.h | 7 | ||||
-rw-r--r-- | sys/src/cmd/rio/rio.c | 9 | ||||
-rw-r--r-- | sys/src/cmd/rio/wind.c | 49 | ||||
-rw-r--r-- | sys/src/cmd/rio/xfid.c | 148 |
4 files changed, 77 insertions, 136 deletions
diff --git a/sys/src/cmd/rio/dat.h b/sys/src/cmd/rio/dat.h index 73f03eaf7..5d8891162 100644 --- a/sys/src/cmd/rio/dat.h +++ b/sys/src/cmd/rio/dat.h @@ -95,11 +95,6 @@ struct Mousereadmesg Channel *cm; /* chan(Mouse) */ }; -struct Kbdreadmesg -{ - Channel *ck; /* chan(char*) */ -}; - struct Stringpair /* rune and nrune or byte and nbyte */ { void *s; @@ -137,7 +132,7 @@ struct Window Channel *consread; /* chan(Consreadmesg) */ Channel *mouseread; /* chan(Mousereadmesg) */ Channel *wctlread; /* chan(Consreadmesg) */ - Channel *kbdread; /* chan(Kbdreadmesg) */ + Channel *kbdread; /* chan(Consreadmesg) */ Channel *complete; /* chan(Completion*) */ Channel *gone; /* chan(char*) */ uint nr; /* number of runes in window */ diff --git a/sys/src/cmd/rio/rio.c b/sys/src/cmd/rio/rio.c index 0c1564f53..4a887ab20 100644 --- a/sys/src/cmd/rio/rio.c +++ b/sys/src/cmd/rio/rio.c @@ -1302,8 +1302,13 @@ kbdproc(void *arg) servekbd = 1; /* read kbd state */ - while((n = read(kfd, buf, sizeof(buf))) > 0) - chanprint(c, "%.*s", n, buf); + while((n = read(kfd, buf, sizeof(buf)-1)) > 0){ + e = buf+n; + e[-1] = 0; + e[0] = 0; + for(p = buf; p < e; p += strlen(p)+1) + chanprint(c, "%s", p); + } } else { /* read single characters */ p = buf; diff --git a/sys/src/cmd/rio/wind.c b/sys/src/cmd/rio/wind.c index 53365576f..e833422d4 100644 --- a/sys/src/cmd/rio/wind.c +++ b/sys/src/cmd/rio/wind.c @@ -41,7 +41,7 @@ wmk(Image *i, Mousectl *mc, Channel *ck, Channel *cctl, int scrolling) w->cursorp = nil; w->conswrite = chancreate(sizeof(Conswritemesg), 0); w->consread = chancreate(sizeof(Consreadmesg), 0); - w->kbdread = chancreate(sizeof(Kbdreadmesg), 0); + w->kbdread = chancreate(sizeof(Consreadmesg), 0); w->mouseread = chancreate(sizeof(Mousereadmesg), 0); w->wctlread = chancreate(sizeof(Consreadmesg), 0); w->complete = chancreate(sizeof(Completion*), 0); @@ -167,11 +167,9 @@ winctl(void *arg) Mousestate *mp, m; enum { WKbd, WKbdread, WMouse, WMouseread, WCtl, WCwrite, WCread, WWread, WComplete, Wgone, NWALT }; Alt alts[NWALT+1]; + Consreadmesg crm; Mousereadmesg mrm; - Kbdreadmesg krm; Conswritemesg cwm; - Consreadmesg crm; - Consreadmesg cwrm; Stringpair pair; Wctlmesg wcm; Completion *cr; @@ -182,18 +180,15 @@ winctl(void *arg) threadsetname("winctl-id%d", w->id); mrm.cm = chancreate(sizeof(Mouse), 0); - krm.ck = chancreate(sizeof(char*), 0); - cwm.cw = chancreate(sizeof(Stringpair), 0); crm.c1 = chancreate(sizeof(Stringpair), 0); crm.c2 = chancreate(sizeof(Stringpair), 0); - cwrm.c1 = chancreate(sizeof(Stringpair), 0); - cwrm.c2 = chancreate(sizeof(Stringpair), 0); + cwm.cw = chancreate(sizeof(Stringpair), 0); alts[WKbd].c = w->ck; alts[WKbd].v = &kbds; alts[WKbd].op = CHANRCV; alts[WKbdread].c = w->kbdread; - alts[WKbdread].v = &krm; + alts[WKbdread].v = &crm; alts[WKbdread].op = CHANSND; alts[WMouse].c = w->mc.c; alts[WMouse].v = &w->mc.Mouse; @@ -211,7 +206,7 @@ winctl(void *arg) alts[WCread].v = &crm; alts[WCread].op = CHANSND; alts[WWread].c = w->wctlread; - alts[WWread].v = &cwrm; + alts[WWread].v = &crm; alts[WWread].op = CHANSND; alts[WComplete].c = w->complete; alts[WComplete].v = &cr; @@ -279,14 +274,27 @@ winctl(void *arg) break; case WKbdread: - i = (kbdqr+1) % nelem(kbdq); - if(kbdqr != kbdqw) - kbdqr = i; - if(kbdq[i]){ - sendp(krm.ck, kbdq[i]); + recv(crm.c1, &pair); + nb = pair.ns; + pair.ns = 0; + t = pair.s; + while(kbdqr != kbdqw){ + int m; + + i = (kbdqr+1) % nelem(kbdq); + if(kbdq[i] == nil) + break; + m = strlen(kbdq[i])+1; + nb -= m; + if(nb < 0) + break; + memmove(t, kbdq[i], m); + t += m, pair.ns += m; + free(kbdq[i]); kbdq[i] = nil; - }else - sendp(krm.ck, strdup("K")); + kbdqr = i; + } + send(crm.c2, &pair); continue; case WMouse: @@ -329,10 +337,7 @@ winctl(void *arg) chanfree(crm.c1); chanfree(crm.c2); chanfree(mrm.cm); - chanfree(krm.ck); chanfree(cwm.cw); - chanfree(cwrm.c1); - chanfree(cwrm.c2); threadexits(nil); } continue; @@ -406,14 +411,14 @@ winctl(void *arg) continue; case WWread: w->wctlready = 0; - recv(cwrm.c1, &pair); + recv(crm.c1, &pair); s = Dx(w->screenr) > 0 ? "visible" : "hidden"; t = "notcurrent"; if(w == input) t = "current"; pair.ns = snprint(pair.s, pair.ns, "%11d %11d %11d %11d %s %s ", w->i->r.min.x, w->i->r.min.y, w->i->r.max.x, w->i->r.max.y, t, s); - send(cwrm.c2, &pair); + send(crm.c2, &pair); continue; case WComplete: if(w->i!=nil){ diff --git a/sys/src/cmd/rio/xfid.c b/sys/src/cmd/rio/xfid.c index a213bcffb..879dc01d5 100644 --- a/sys/src/cmd/rio/xfid.c +++ b/sys/src/cmd/rio/xfid.c @@ -614,13 +614,9 @@ xfidread(Xfid *x) Channel *c1, *c2; /* chan (tuple(char*, int)) */ Consreadmesg crm; Mousereadmesg mrm; - Consreadmesg cwrm; - Kbdreadmesg krm; Stringpair pair; - enum { CRdata, CRgone, CRflush, NCR }; - enum { MRdata, MRgone, MRflush, NMR }; - enum { WCRdata, WCRgone, WCRflush, NWCR }; - Alt alts[NCR+1]; + enum { Adata, Agone, Aflush, Aend }; + Alt alts[Aend+1]; w = x->f->w; if(w->deleted){ @@ -631,29 +627,42 @@ xfidread(Xfid *x) off = x->offset; cnt = x->count; switch(qid){ + case Qwctl: + if(cnt < 4*12){ + filsysrespond(x->fs, x, &fc, Etooshort); + break; + } + alts[Adata].c = w->wctlread; + goto Consmesg; + + case Qkbd: + alts[Adata].c = w->kbdread; + goto Consmesg; + case Qcons: - alts[CRdata].c = w->consread; - alts[CRdata].v = &crm; - alts[CRdata].op = CHANRCV; - alts[CRgone].c = w->gone; - alts[CRgone].v = nil; - alts[CRgone].op = CHANRCV; - alts[CRflush].c = x->flushc; - alts[CRflush].v = nil; - alts[CRflush].op = CHANRCV; - alts[NCR].op = CHANEND; + alts[Adata].c = w->consread; + + Consmesg: + alts[Adata].v = &crm; + alts[Adata].op = CHANRCV; + alts[Agone].c = w->gone; + alts[Agone].v = nil; + alts[Agone].op = CHANRCV; + alts[Aflush].c = x->flushc; + alts[Aflush].v = nil; + alts[Aflush].op = CHANRCV; + alts[Aend].op = CHANEND; switch(alt(alts)){ - case CRdata: + case Adata: break; - case CRgone: + case Agone: filsysrespond(x->fs, x, &fc, Edeleted); return; - case CRflush: + case Aflush: filsyscancel(x); return; } - c1 = crm.c1; c2 = crm.c2; t = malloc(cnt+UTFmax+1); /* room to unpack partial rune plus */ @@ -679,24 +688,24 @@ xfidread(Xfid *x) break; case Qmouse: - alts[MRdata].c = w->mouseread; - alts[MRdata].v = &mrm; - alts[MRdata].op = CHANRCV; - alts[MRgone].c = w->gone; - alts[MRgone].v = nil; - alts[MRgone].op = CHANRCV; - alts[MRflush].c = x->flushc; - alts[MRflush].v = nil; - alts[MRflush].op = CHANRCV; - alts[NMR].op = CHANEND; + alts[Adata].c = w->mouseread; + alts[Adata].v = &mrm; + alts[Adata].op = CHANRCV; + alts[Agone].c = w->gone; + alts[Agone].v = nil; + alts[Agone].op = CHANRCV; + alts[Aflush].c = x->flushc; + alts[Aflush].v = nil; + alts[Aflush].op = CHANRCV; + alts[Aend].op = CHANEND; switch(alt(alts)){ - case MRdata: + case Adata: break; - case MRgone: + case Agone: filsysrespond(x->fs, x, &fc, Edeleted); return; - case MRflush: + case Aflush: filsyscancel(x); return; } @@ -712,36 +721,6 @@ xfidread(Xfid *x) filsysrespond(x->fs, x, &fc, nil); break; - case Qkbd: - alts[MRdata].c = w->kbdread; - alts[MRdata].v = &krm; - alts[MRdata].op = CHANRCV; - alts[MRgone].c = w->gone; - alts[MRgone].v = nil; - alts[MRgone].op = CHANRCV; - alts[MRflush].c = x->flushc; - alts[MRflush].v = nil; - alts[MRflush].op = CHANRCV; - alts[NMR].op = CHANEND; - - switch(alt(alts)){ - case MRdata: - break; - case MRgone: - filsysrespond(x->fs, x, &fc, Edeleted); - return; - case MRflush: - filsyscancel(x); - return; - } - - t = recvp(krm.ck); - fc.data = t; - fc.count = strlen(t)+1; - filsysrespond(x->fs, x, &fc, nil); - free(t); - break; - case Qcursor: filsysrespond(x->fs, x, &fc, "cursor read not implemented"); break; @@ -833,49 +812,6 @@ xfidread(Xfid *x) free(t); return; - case Qwctl: /* read returns rectangle, hangs if not resized */ - if(cnt < 4*12){ - filsysrespond(x->fs, x, &fc, Etooshort); - break; - } - - alts[WCRdata].c = w->wctlread; - alts[WCRdata].v = &cwrm; - alts[WCRdata].op = CHANRCV; - alts[WCRgone].c = w->gone; - alts[WCRgone].v = nil; - alts[WCRgone].op = CHANRCV; - alts[WCRflush].c = x->flushc; - alts[WCRflush].v = nil; - alts[WCRflush].op = CHANRCV; - alts[NWCR].op = CHANEND; - - switch(alt(alts)){ - case WCRdata: - break; - case WCRgone: - filsysrespond(x->fs, x, &fc, Edeleted); - return; - case WCRflush: - filsyscancel(x); - return; - } - - c1 = cwrm.c1; - c2 = cwrm.c2; - t = malloc(cnt+1); /* be sure to have room for NUL */ - pair.s = t; - pair.ns = cnt+1; - send(c1, &pair); - recv(c2, &pair); - fc.data = pair.s; - if(pair.ns > cnt) - pair.ns = cnt; - fc.count = pair.ns; - filsysrespond(x->fs, x, &fc, nil); - free(t); - break; - default: fprint(2, "unknown qid %d in read\n", qid); snprint(buf, sizeof(buf), "unknown qid in read"); |