Blame


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