aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/devdraw/drawclient.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/devdraw/drawclient.c')
-rw-r--r--src/cmd/devdraw/drawclient.c128
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);
+}
+