drawclient.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 }