#include #include #include #include Rectangle getscr(void){ int fd; char buf[12*5]; fd=open("/dev/screen", OREAD); if(fd==-1) fd=open("/mnt/term/dev/screen", OREAD); if(fd==-1) return Rect(0,0,1024,1024); if(read(fd, buf, sizeof buf)!=sizeof buf){ fprint(2, "Can't read /dev/screen: %r\n"); exits("screen read"); } return Rect(atoi(buf+12), atoi(buf+24), atoi(buf+36), atoi(buf+48)); } char *rdenv(char *name){ char *v; int fd, size; fd=open(name, OREAD); if(fd<0) return 0; size=seek(fd, 0, 2); v=malloc(size+1); if(v==0){ fprint(2, "Can't malloc: %r\n"); exits("no mem"); } seek(fd, 0, 0); read(fd, v, size); v[size]=0; close(fd); return v; } void winit(void (*errfun)(char *), char *font, char *label, Rectangle r){ char *srv, *mntsrv; char spec[100]; int srvfd, cons, pid; switch(rfork(RFFDG|RFPROC|RFNAMEG|RFENVG|RFNOTEG|RFNOWAIT)){ case -1: fprint(2, "Can't fork: %r\n"); exits("no fork"); case 0: break; default: exits(0); } srv=rdenv("/env/8½srv"); if(srv==0){ free(srv); mntsrv=rdenv("/mnt/term/env/8½srv"); srv=malloc(strlen(mntsrv)+10); sprint(srv, "/mnt/term%s", mntsrv); free(mntsrv); pid=0; /* 8½srv can't send notes to remote processes! */ } else pid=getpid(); srvfd=open(srv, ORDWR); free(srv); if(srvfd==-1){ fprint(2, "Can't open %s: %r\n", srv); exits("no srv"); } sprint(spec, "N%d,%d,%d,%d,%d\n", pid, r.min.x, r.min.y, r.max.x, r.max.y); if(mount(srvfd, "/mnt/8½", 0, spec)==-1){ fprint(2, "Can't mount: %r\n"); exits("no mount"); } close(srvfd); bind("/mnt/8½", "/dev", MBEFORE); cons=open("/dev/cons", OREAD); if(cons==-1){ NoCons: fprint(2, "Can't open /dev/cons: %r"); exits("no cons"); } dup(cons, 0); close(cons); cons=open("/dev/cons", OWRITE); if(cons==-1) goto NoCons; dup(cons, 1); dup(cons, 2); close(cons); binit(errfun, font, label); } int nbit, npix; Bitmap *pixel; Rectangle crect[256]; void ereshaped(Rectangle newr){ int x, y, i, n, nx, ny; Rectangle r, b; screen.r=newr; n=1<<(1<>24, cmap[i].green>>24, cmap[i].blue>>24); string(&screen, add(screen.r.min, Pt(2,2)), font, buf, S); prev=i; break; } m=emouse(); } break; case 4: switch(menuhit(3, &m, &menu)){ case 0: exits(0); } } } }