summaryrefslogtreecommitdiff
path: root/sys/src/cmd/rio
diff options
context:
space:
mode:
authorJacob Moody <moody@posixcafe.org>2022-08-19 23:35:41 +0000
committerJacob Moody <moody@posixcafe.org>2022-08-19 23:35:41 +0000
commit4009eb2feecfa4722d5cb22be4f5db9f26d15be3 (patch)
tree70861cb2df8a4a881110d1b57973fa23499095a0 /sys/src/cmd/rio
parenta36f997368057fe298524de52310cc4e98bddba8 (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.h12
-rw-r--r--sys/src/cmd/rio/fsys.c14
-rw-r--r--sys/src/cmd/rio/rio.c31
-rw-r--r--sys/src/cmd/rio/wind.c5
-rw-r--r--sys/src/cmd/rio/xfid.c36
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);