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 void
20 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 int
40 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 void
56 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 void
70 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 void
86 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 void
104 main(int argc, char **argv)
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;
122 if(i == nelem(cmdtab))
123 print("! unrecognized command %s\n", f[0]);
124 free(p);
126 exits(0);