URI:
       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 }