plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

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 }