#include #include #include #include "guic.h" enum { Argsmax = 8, Maxstack = 16384, }; Channel *guichan; static int gfd; static char buf[128]; static int lookup(char **keywords, char *s) { int k; for(k=0; keywords[k]; k++) if(strcmp(keywords[k], s) == 0) return k; return -1; } static void guiproc(void *) { char input[128]; char *argv[Argsmax]; int argc; int nr, k; Event ev; for(;;){ nr = read(gfd, input, sizeof(input)); if(nr <= 0) break; input[nr-1] = 0; argc = tokenize(input, argv, Argsmax); if(argv == 0) continue; k = lookup(keywords, argv[0]); if(k < 0) continue; ev.k = k; ev.n = argc > 1 ? atoi(argv[1]) : 0; send(guichan, &ev); } threadexitsall(0); } void guiwrite(char *fmt, ...) { va_list ap; va_start(ap, fmt); vfprint(gfd, fmt, ap); va_end(ap); } void guiload(char *path) { int fd, nr; fd = open(path, OREAD); if(fd < 0) sysfatal("gui: %r"); for(;;){ nr = read(fd, buf, sizeof(buf)); if(nr <= 0) break; write(gfd, buf, nr); } close(fd); } void guistart(char *path) { guichan = chancreate(sizeof(Event), 16); if(path == 0) return; gfd = open(path, OREAD); if(gfd < 0) sysfatal("gui: %r"); proccreate(guiproc, 0, Maxstack); }