tdrawclient.c - plan9port - [fork] Plan 9 from user space
HTML git clone git://src.adamsgaard.dk/plan9port
DIR Log
DIR Files
DIR Refs
DIR README
DIR LICENSE
---
tdrawclient.c (1917B)
---
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 <drawfcall.h>
8
9 typedef struct Cmd Cmd;
10 struct Cmd {
11 char *cmd;
12 void (*fn)(int, char**);
13 };
14
15 Biobuf b;
16 int fd;
17 uchar buf[64*1024];
18
19 void
20 startsrv(void)
21 {
22 int pid, p[2];
23
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.devdraw", "o.devdraw", "-D", nil);
33 sysfatal("exec: %r");
34 }
35 close(p[1]);
36 fd = p[0];
37 }
38
39 int
40 domsg(Wsysmsg *m)
41 {
42 int n, nn;
43
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->type == Rerror)
51 return -1;
52 return 0;
53 }
54
55 void
56 cmdinit(int argc, char **argv)
57 {
58 Wsysmsg m;
59
60 memset(&m, 0, sizeof m);
61 m.type = Tinit;
62 m.winsize = "100x100";
63 m.label = "label";
64 if(domsg(&m) < 0)
65 sysfatal("domsg");
66 }
67
68 void
69 cmdmouse(int argc, char **argv)
70 {
71 Wsysmsg m;
72
73 memset(&m, 0, sizeof m);
74 m.type = Trdmouse;
75 if(domsg(&m) < 0)
76 sysfatal("domsg");
77 print("%c %d %d %d\n",
78 m.resized ? 'r' : 'm',
79 m.mouse.xy.x,
80 m.mouse.xy.y,
81 m.mouse.buttons);
82 }
83
84 void
85 cmdkbd(int argc, char **argv)
86 {
87 Wsysmsg m;
88
89 memset(&m, 0, sizeof m);
90 m.type = Trdkbd;
91 if(domsg(&m) < 0)
92 sysfatal("domsg");
93 print("%d\n", m.rune);
94 }
95
96 Cmd cmdtab[] = {
97 { "init", cmdinit, },
98 { "mouse", cmdmouse, },
99 { "kbd", cmdkbd, },
100 };
101
102 void
103 main(int argc, char **argv)
104 {
105 char *p, *f[20];
106 int i, nf;
107
108 startsrv();
109
110 fprint(2, "started...\n");
111 Binit(&b, 0, OREAD);
112 while((p = Brdstr(&b, '\n', 1)) != nil){
113 fprint(2, "%s...\n", p);
114 nf = tokenize(p, f, nelem(f));
115 for(i=0; i<nelem(cmdtab); i++){
116 if(strcmp(cmdtab[i].cmd, f[0]) == 0){
117 cmdtab[i].fn(nf, f);
118 break;
119 }
120 }
121 if(i == nelem(cmdtab))
122 print("! unrecognized command %s\n", f[0]);
123 free(p);
124 }
125 exits(0);
126 }