|  | #include <u.h> | 
|  | #include <libc.h> | 
|  | #include <bio.h> | 
|  | #include <draw.h> | 
|  | #include <mouse.h> | 
|  | #include <cursor.h> | 
|  | #include <drawsrv.h> | 
|  |  | 
|  | 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<nelem(cmdtab); i++){ | 
|  | if(strcmp(cmdtab[i].cmd, f[0]) == 0){ | 
|  | cmdtab[i].fn(nf, f); | 
|  | break; | 
|  | } | 
|  | } | 
|  | if(i == nelem(cmdtab)) | 
|  | print("! unrecognized command %s\n", f[0]); | 
|  | free(p); | 
|  | } | 
|  | exits(0); | 
|  | } | 
|  |  |