diff options
Diffstat (limited to 'src/cmd/devdraw/drawclient.c')
-rw-r--r-- | src/cmd/devdraw/drawclient.c | 128 |
1 files changed, 128 insertions, 0 deletions
diff --git a/src/cmd/devdraw/drawclient.c b/src/cmd/devdraw/drawclient.c new file mode 100644 index 00000000..87df3f18 --- /dev/null +++ b/src/cmd/devdraw/drawclient.c @@ -0,0 +1,128 @@ +#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); +} + |