diff options
author | Jacob Moody <moody@posixcafe.org> | 2022-08-15 02:59:49 +0000 |
---|---|---|
committer | Jacob Moody <moody@posixcafe.org> | 2022-08-15 02:59:49 +0000 |
commit | 8906ad7c15744271d0f6a41ae2f590a8bc31bf21 (patch) | |
tree | ed459c7f4f912774921642a911949f75058f5d9e /sys/src/cmd/rio | |
parent | 4df168d98fb7b73e50d702b70ceffcaddfe8203c (diff) |
rio: add /dev/kbdtap
Diffstat (limited to 'sys/src/cmd/rio')
-rw-r--r-- | sys/src/cmd/rio/dat.h | 18 | ||||
-rw-r--r-- | sys/src/cmd/rio/fsys.c | 17 | ||||
-rw-r--r-- | sys/src/cmd/rio/rio.c | 66 | ||||
-rw-r--r-- | sys/src/cmd/rio/wind.c | 4 | ||||
-rw-r--r-- | sys/src/cmd/rio/xfid.c | 19 |
5 files changed, 115 insertions, 9 deletions
diff --git a/sys/src/cmd/rio/dat.h b/sys/src/cmd/rio/dat.h index dac32da5f..96ad631b1 100644 --- a/sys/src/cmd/rio/dat.h +++ b/sys/src/cmd/rio/dat.h @@ -18,6 +18,7 @@ enum Qwindow, Qwsys, /* directory of window directories */ Qwsysdir, /* window directory, child of wsys */ + Qtap, QMAX, }; @@ -40,6 +41,7 @@ typedef struct Timer Timer; typedef struct Wctlmesg Wctlmesg; typedef struct Window Window; typedef struct Xfid Xfid; +typedef struct Tapmesg Tapmesg; enum { @@ -117,7 +119,19 @@ struct Mouseinfo ulong lastcounter; /* serial no. of last mouse event sent to client */ int lastb; /* last button state we received */ uchar qfull; /* filled the queue; no more recording until client comes back */ -}; +}; + +enum{ + Fon = 'b', + Foff = 'e', + Freset = 'r', +}; + +struct Tapmesg +{ + char type; + char *s; +}; struct Window { @@ -313,6 +327,8 @@ int nwindow; int snarffd; int gotscreen; int servekbd; +Channel *fromtap; /* input from kbd tap program to window */ +Channel *totap; /* our keyboard input to tap program */ Window *input; QLock all; /* BUG */ Filsys *filsys; diff --git a/sys/src/cmd/rio/fsys.c b/sys/src/cmd/rio/fsys.c index be81a1d57..49c9c7d2f 100644 --- a/sys/src/cmd/rio/fsys.c +++ b/sys/src/cmd/rio/fsys.c @@ -37,6 +37,7 @@ Dirtab dirtab[]= { "wctl", QTFILE, Qwctl, 0600 }, { "window", QTFILE, Qwindow, 0400 }, { "wsys", QTDIR, Qwsys, 0500|DMDIR }, + { "kbdtap", QTFILE, Qtap, 0660 }, { nil, } }; @@ -115,6 +116,16 @@ 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) { @@ -506,7 +517,9 @@ 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; @@ -616,6 +629,8 @@ 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 bc53f1edb..ce64baba7 100644 --- a/sys/src/cmd/rio/rio.c +++ b/sys/src/cmd/rio/rio.c @@ -199,6 +199,9 @@ threadmain(int argc, char *argv[]) kbdchan = initkbd(); if(kbdchan == nil) error("can't find keyboard"); + totap = chancreate(sizeof(char*), 0); + fromtap = chancreate(sizeof(Tapmesg), 0); + wscreen = allocscreen(screen, background, 0); if(wscreen == nil) error("can't allocate screen"); @@ -340,15 +343,64 @@ void keyboardthread(void*) { char *s; + Tapmesg m; + Channel *out; + int mode; + enum { Kdev, Ktap, NALT}; + enum { Mnorm, Mfilt }; - threadsetname("keyboardthread"); + threadsetname("keyboardthread"); - while(s = recvp(kbdchan)){ - if(*s == 'k' || *s == 'K') - shiftdown = utfrune(s+1, Kshift) != nil; - if(input == nil || sendp(input->ck, s) <= 0) - free(s); - } + static Alt alts[NALT+1]; + alts[Kdev].c = kbdchan; + alts[Kdev].v = &s; + alts[Kdev].op = CHANRCV; + alts[Ktap].c = fromtap; + alts[Ktap].v = &m; + alts[Ktap].op = CHANRCV; + alts[NALT].op = CHANEND; + + out = nil; + mode = Mnorm; + for(;;) + switch(alt(alts)){ + case Ktap: + switch(m.type){ + case 'K': case 'k': case 'c': + break; + case Freset: + if(mode != Mfilt) + continue; + s = smprint("%c", m.type); + goto Send; + case Foff: + mode = Mnorm; + continue; + case Fon: + mode = Mfilt; + continue; + default: + continue; + } + s = smprint("%c%s", m.type, m.s); + out = input == nil ? nil : input->ck; + goto Send; + case Kdev: + switch(mode){ + case Mnorm: + out = input == nil ? nil : input->ck; + break; + case Mfilt: + out = totap; + break; + } + Send: + if(*s == 'k' || *s == 'K') + shiftdown = utfrune(s+1, Kshift) != nil; + if(out == nil || sendp(out, s) <= 0) + free(s); + break; + } } int diff --git a/sys/src/cmd/rio/wind.c b/sys/src/cmd/rio/wind.c index b74f8b8b2..217e877c0 100644 --- a/sys/src/cmd/rio/wind.c +++ b/sys/src/cmd/rio/wind.c @@ -81,6 +81,7 @@ void wcurrent(Window *w) { Channel *c; + Tapmesg m; if(input == nil){ input = w; @@ -88,6 +89,9 @@ wcurrent(Window *w) } if(w == input) return; + m.type = Freset; + m.s = nil; + send(fromtap, &m); 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 27054f8ef..8db600089 100644 --- a/sys/src/cmd/rio/xfid.c +++ b/sys/src/cmd/rio/xfid.c @@ -376,6 +376,7 @@ xfidwrite(Xfid *x) Window *w; Rune *r; Conswritemesg cwm; + Tapmesg fmsg; Stringpair pair; enum { CWdata, CWgone, CWflush, NCW }; Alt alts[NCW+1]; @@ -568,6 +569,16 @@ xfidwrite(Xfid *x) } break; + case Qtap: + if(cnt < 2){ + filsysrespond(x->fs, x, &fc, "malformed key"); + return; + } + fmsg.type = x->data[0]; + fmsg.s = strdup(x->data+1); + send(fromtap, &fmsg); + break; + default: fprint(2, "unknown qid %d in write\n", qid); filsysrespond(x->fs, x, &fc, "unknown qid in write"); @@ -682,6 +693,14 @@ xfidread(Xfid *x) free(t); break; + case Qtap: + recv(totap, &t); + fc.data = t; + fc.count = strlen(t)+1; + filsysrespond(x->fs, x, &fc, nil); + free(t); + break; + case Qlabel: n = strlen(w->label); if(off > n) |