#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]; | |
void | |
startsrv(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]; | |
} | |
int | |
domsg(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; | |
} | |
void | |
cmdinit(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"); | |
} | |
void | |
cmdmouse(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); | |
} | |
void | |
cmdkbd(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, }, | |
}; | |
void | |
main(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); | |
} | |