Blob
1 #include <u.h>2 #include <libc.h>3 #include <bio.h>4 #include <draw.h>5 #include <mouse.h>6 #include <cursor.h>7 #include <drawsrv.h>9 typedef struct Cmd Cmd;10 struct Cmd {11 char *cmd;12 void (*fn)(int, char**);13 };15 Biobuf b;16 int fd;17 uchar buf[64*1024];19 void20 startsrv(void)21 {22 int pid, p[2];24 if(pipe(p) < 0)25 sysfatal("pipe");26 if((pid=fork()) < 0)27 sysfatal("fork");28 if(pid == 0){29 close(p[0]);30 dup(p[1], 0);31 dup(p[1], 1);32 execl("o.drawsrv", "o.drawsrv", "-D", nil);33 sysfatal("exec: %r");34 }35 close(p[1]);36 fd = p[0];37 }39 int40 domsg(Wsysmsg *m)41 {42 int n, nn;44 n = convW2M(m, buf, sizeof buf);45 fprint(2, "write %d to %d\n", n, fd);46 write(fd, buf, n);47 n = readwsysmsg(fd, buf, sizeof buf);48 nn = convM2W(buf, n, m);49 assert(nn == n);50 if(m->op == Rerror)51 return -1;52 return 0;53 }55 void56 cmdinit(int argc, char **argv)57 {58 Wsysmsg m;60 memset(&m, 0, sizeof m);61 m.op = Tinit;62 m.winsize = "100x100";63 m.label = "label";64 m.font = "";65 if(domsg(&m) < 0)66 sysfatal("domsg");67 }69 void70 cmdmouse(int argc, char **argv)71 {72 Wsysmsg m;74 memset(&m, 0, sizeof m);75 m.op = Trdmouse;76 if(domsg(&m) < 0)77 sysfatal("domsg");78 print("%c %d %d %d\n",79 m.resized ? 'r' : 'm',80 m.mouse.xy.x,81 m.mouse.xy.y,82 m.mouse.buttons);83 }85 void86 cmdkbd(int argc, char **argv)87 {88 Wsysmsg m;90 memset(&m, 0, sizeof m);91 m.op = Trdkbd;92 if(domsg(&m) < 0)93 sysfatal("domsg");94 print("%s\n", m.runes);95 }97 Cmd cmdtab[] = {98 { "init", cmdinit, },99 { "mouse", cmdmouse, },100 { "kbd", cmdkbd, },101 };103 void104 main(int argc, char **argv)105 {106 char *p, *f[20];107 int i, nf;109 startsrv();111 fprint(2, "started...\n");112 Binit(&b, 0, OREAD);113 while((p = Brdstr(&b, '\n', 1)) != nil){114 fprint(2, "%s...\n", p);115 nf = tokenize(p, f, nelem(f));116 for(i=0; i<nelem(cmdtab); i++){117 if(strcmp(cmdtab[i].cmd, f[0]) == 0){118 cmdtab[i].fn(nf, f);119 break;120 }121 }122 if(i == nelem(cmdtab))123 print("! unrecognized command %s\n", f[0]);124 free(p);125 }126 exits(0);127 }