#include #include #include #include #include #include #include typedef struct Cmd Cmd; struct Cmd { char *cmd; void (*fn)(int, char**); }; Biobuf b; int fd; uchar buf[64*1024]; void startsrv(void) { int pid, p[2]; if(pipe(p) < 0) sysfatal("pipe"); if((pid=fork()) < 0) sysfatal("fork"); if(pid == 0){ close(p[0]); dup(p[1], 0); dup(p[1], 1); execl("o.drawsrv", "o.drawsrv", "-D", nil); sysfatal("exec: %r"); } close(p[1]); fd = p[0]; } int domsg(Wsysmsg *m) { int n, nn; n = convW2M(m, buf, sizeof buf); fprint(2, "write %d to %d\n", n, fd); write(fd, buf, n); n = readwsysmsg(fd, buf, sizeof buf); nn = convM2W(buf, n, m); assert(nn == n); if(m->op == Rerror) return -1; return 0; } void cmdinit(int argc, char **argv) { Wsysmsg m; memset(&m, 0, sizeof m); m.op = Tinit; m.winsize = "100x100"; m.label = "label"; m.font = ""; if(domsg(&m) < 0) sysfatal("domsg"); } void cmdmouse(int argc, char **argv) { Wsysmsg m; memset(&m, 0, sizeof m); m.op = Trdmouse; if(domsg(&m) < 0) sysfatal("domsg"); print("%c %d %d %d\n", m.resized ? 'r' : 'm', m.mouse.xy.x, m.mouse.xy.y, m.mouse.buttons); } void cmdkbd(int argc, char **argv) { Wsysmsg m; memset(&m, 0, sizeof m); m.op = Trdkbd; if(domsg(&m) < 0) sysfatal("domsg"); print("%s\n", m.runes); } Cmd cmdtab[] = { { "init", cmdinit, }, { "mouse", cmdmouse, }, { "kbd", cmdkbd, }, }; void main(int argc, char **argv) { char *p, *f[20]; int i, nf; startsrv(); fprint(2, "started...\n"); Binit(&b, 0, OREAD); while((p = Brdstr(&b, '\n', 1)) != nil){ fprint(2, "%s...\n", p); nf = tokenize(p, f, nelem(f)); for(i=0; i