diff options
author | Jacob Moody <moody@posixcafe.org> | 2022-08-19 23:35:41 +0000 |
---|---|---|
committer | Jacob Moody <moody@posixcafe.org> | 2022-08-19 23:35:41 +0000 |
commit | 4009eb2feecfa4722d5cb22be4f5db9f26d15be3 (patch) | |
tree | 70861cb2df8a4a881110d1b57973fa23499095a0 /sys/src/cmd/rio | |
parent | a36f997368057fe298524de52310cc4e98bddba8 (diff) |
rio: correct tap code
Remove tapmesg, allow the reads to accept
flushes, accept writes of multiple messages,
move open/close to Xfid code.
Diffstat (limited to 'sys/src/cmd/rio')
-rw-r--r-- | sys/src/cmd/rio/dat.h | 12 | ||||
-rw-r--r-- | sys/src/cmd/rio/fsys.c | 14 | ||||
-rw-r--r-- | sys/src/cmd/rio/rio.c | 31 | ||||
-rw-r--r-- | sys/src/cmd/rio/wind.c | 5 | ||||
-rw-r--r-- | sys/src/cmd/rio/xfid.c | 36 |
5 files changed, 49 insertions, 49 deletions
diff --git a/sys/src/cmd/rio/dat.h b/sys/src/cmd/rio/dat.h index b500dad54..6d9ba8495 100644 --- a/sys/src/cmd/rio/dat.h +++ b/sys/src/cmd/rio/dat.h @@ -122,15 +122,9 @@ struct Mouseinfo }; enum{ - Fon = 'b', - Foff = 'e', - Freset = 'r', -}; - -struct Tapmesg -{ - char type; - char *s; + Tapon = 'b', + Tapoff = 'e', + Tapreset = 'r', }; struct Window diff --git a/sys/src/cmd/rio/fsys.c b/sys/src/cmd/rio/fsys.c index 49c9c7d2f..601802545 100644 --- a/sys/src/cmd/rio/fsys.c +++ b/sys/src/cmd/rio/fsys.c @@ -116,16 +116,6 @@ cexecpipe(int *p0, int *p1) return 0; } -void -toggletap(char mode) -{ - Tapmesg m; - - m.type = mode; - m.s = nil; - send(fromtap, &m); -} - Filsys* filsysinit(Channel *cxfidalloc) { @@ -518,8 +508,6 @@ filsysopen(Filsys *fs, Xfid *x, Fid *f) if(((f->dir->perm&~(DMDIR|DMAPPEND))&m) != m) goto Deny; - if(FILE(f->qid) == Qtap) - toggletap(Fon); sendp(x->c, xfidopen); return nil; @@ -629,8 +617,6 @@ filsysclunk(Filsys *fs, Xfid *x, Fid *f) if(f->open){ f->busy = FALSE; f->open = FALSE; - if(FILE(f->qid) == Qtap) - toggletap(Foff); sendp(x->c, xfidclose); return nil; } diff --git a/sys/src/cmd/rio/rio.c b/sys/src/cmd/rio/rio.c index 9d666bf15..481451d56 100644 --- a/sys/src/cmd/rio/rio.c +++ b/sys/src/cmd/rio/rio.c @@ -197,7 +197,7 @@ threadmain(int argc, char *argv[]) if(kbdchan == nil) error("can't find keyboard"); totap = chancreate(sizeof(char*), 0); - fromtap = chancreate(sizeof(Tapmesg), 0); + fromtap = chancreate(sizeof(char*), 0); wscreen = allocscreen(screen, background, 0); if(wscreen == nil) @@ -340,11 +340,10 @@ void keyboardthread(void*) { char *s; - Tapmesg m; Channel *out; int mode; enum { Kdev, Ktap, NALT}; - enum { Mnorm, Mfilt }; + enum { Mnorm, Mtap }; threadsetname("keyboardthread"); @@ -353,7 +352,7 @@ keyboardthread(void*) alts[Kdev].v = &s; alts[Kdev].op = CHANRCV; alts[Ktap].c = fromtap; - alts[Ktap].v = &m; + alts[Ktap].v = &s; alts[Ktap].op = CHANRCV; alts[NALT].op = CHANEND; @@ -362,24 +361,24 @@ keyboardthread(void*) for(;;) switch(alt(alts)){ case Ktap: - switch(m.type){ + switch(*s){ case 'K': case 'k': case 'c': break; - case Freset: - if(mode != Mfilt) - continue; - s = smprint("%c", m.type); + case Tapreset: + if(mode != Mtap) + goto Next; goto Send; - case Foff: + case Tapoff: mode = Mnorm; - continue; - case Fon: - mode = Mfilt; - continue; + goto Next; + case Tapon: + mode = Mtap; + /* fallthrough */ default: + Next: + free(s); continue; } - s = smprint("%c%s", m.type, m.s); out = input == nil ? nil : input->ck; goto Send; case Kdev: @@ -387,7 +386,7 @@ keyboardthread(void*) case Mnorm: out = input == nil ? nil : input->ck; break; - case Mfilt: + case Mtap: out = totap; break; } diff --git a/sys/src/cmd/rio/wind.c b/sys/src/cmd/rio/wind.c index 217e877c0..d6e6c3ff6 100644 --- a/sys/src/cmd/rio/wind.c +++ b/sys/src/cmd/rio/wind.c @@ -81,7 +81,6 @@ void wcurrent(Window *w) { Channel *c; - Tapmesg m; if(input == nil){ input = w; @@ -89,9 +88,7 @@ wcurrent(Window *w) } if(w == input) return; - m.type = Freset; - m.s = nil; - send(fromtap, &m); + chanprint(fromtap, "%c", Tapreset); incref(input); c = chancreate(sizeof(Window*), 0); wsendctlmesg(input, Repaint, ZR, c); diff --git a/sys/src/cmd/rio/xfid.c b/sys/src/cmd/rio/xfid.c index 8db600089..1b7ce9db9 100644 --- a/sys/src/cmd/rio/xfid.c +++ b/sys/src/cmd/rio/xfid.c @@ -307,6 +307,9 @@ xfidopen(Xfid *x) wsendctlmesg(w, Wakeup, ZR, nil); } break; + case Qtap: + chanprint(fromtap, "%c", Tapon); + break; } t.qid = x->f->qid; t.iounit = messagesize-IOHDRSZ; @@ -361,6 +364,9 @@ xfidclose(Xfid *x) if(x->f->mode==OREAD || x->f->mode==ORDWR) w->wctlopen = FALSE; break; + case Qtap: + chanprint(fromtap, "%c", Tapoff); + break; } wclose(w); filsysrespond(x->fs, x, &t, nil); @@ -371,12 +377,11 @@ xfidwrite(Xfid *x) { Fcall fc; int cnt, qid, nb, off, nr; - char err[ERRMAX], *p; + char err[ERRMAX], *p, *e; Point pt; Window *w; Rune *r; Conswritemesg cwm; - Tapmesg fmsg; Stringpair pair; enum { CWdata, CWgone, CWflush, NCW }; Alt alts[NCW+1]; @@ -574,9 +579,9 @@ xfidwrite(Xfid *x) filsysrespond(x->fs, x, &fc, "malformed key"); return; } - fmsg.type = x->data[0]; - fmsg.s = strdup(x->data+1); - send(fromtap, &fmsg); + e = x->data + cnt; + for(p = x->data; p < e; p += strlen(p)+1) + chanprint(fromtap, "%s", p); break; default: @@ -694,7 +699,26 @@ xfidread(Xfid *x) break; case Qtap: - recv(totap, &t); + alts[Adata].c = totap; + alts[Adata].v = &t; + 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 Adata: + break; + case Agone: + filsysrespond(x->fs, x, &fc, Edeleted); + return; + case Aflush: + filsyscancel(x); + return; + } fc.data = t; fc.count = strlen(t)+1; filsysrespond(x->fs, x, &fc, nil); |