128 lines · 1.9 KB · C
RawDownload
#include <u.h>#include <libc.h>#include <bio.h>#include <draw.h>#include <mouse.h>#include <cursor.h>#include <drawsrv.h> typedef struct Cmd Cmd;struct Cmd {	char *cmd;	void	(*fn)(int, char**);}; Biobuf b;int fd;uchar buf[64*1024]; voidstartsrv(void){	int pid, p[2];		if(pipe(p) < 0)		sysfatal("pipe");	if((pid=fork()) < 0)		sysfatal("fork");	if(pid == 0){		close(p[0]);		dup(p[1], 0);		dup(p[1], 1);		execl("o.drawsrv", "o.drawsrv", "-D", nil);		sysfatal("exec: %r");	}	close(p[1]);	fd = p[0];} intdomsg(Wsysmsg *m){	int n, nn; 	n = convW2M(m, buf, sizeof buf);fprint(2, "write %d to %d\n", n, fd);	write(fd, buf, n);	n = readwsysmsg(fd, buf, sizeof buf);	nn = convM2W(buf, n, m);	assert(nn == n);	if(m->op == Rerror)		return -1;	return 0;} voidcmdinit(int argc, char **argv){	Wsysmsg m;		memset(&m, 0, sizeof m);	m.op = Tinit;	m.winsize = "100x100";	m.label = "label";	m.font = "";	if(domsg(&m) < 0)		sysfatal("domsg");} voidcmdmouse(int argc, char **argv){	Wsysmsg m;		memset(&m, 0, sizeof m);	m.op = Trdmouse;	if(domsg(&m) < 0)		sysfatal("domsg");	print("%c %d %d %d\n",		m.resized ? 'r' : 'm',		m.mouse.xy.x,		m.mouse.xy.y,		m.mouse.buttons);} voidcmdkbd(int argc, char **argv){	Wsysmsg m;		memset(&m, 0, sizeof m);	m.op = Trdkbd;	if(domsg(&m) < 0)		sysfatal("domsg");	print("%s\n", m.runes);} Cmd cmdtab[] = {	{ "init", cmdinit, },	{ "mouse", cmdmouse, },	{ "kbd", cmdkbd, },}; voidmain(int argc, char **argv){	char *p, *f[20];	int i, nf; 	startsrv(); fprint(2, "started...\n");	Binit(&b, 0, OREAD);	while((p = Brdstr(&b, '\n', 1)) != nil){fprint(2, "%s...\n", p);		nf = tokenize(p, f, nelem(f));		for(i=0; i<nelem(cmdtab); i++){			if(strcmp(cmdtab[i].cmd, f[0]) == 0){				cmdtab[i].fn(nf, f);				break;			}		}		if(i == nelem(cmdtab))			print("! unrecognized command %s\n", f[0]);		free(p);	}	exits(0);}