1*37da2899SCharles.Forsythimplement Test; 2*37da2899SCharles.Forsyth 3*37da2899SCharles.Forsythinclude "sys.m"; 4*37da2899SCharles.Forsythinclude "draw.m"; 5*37da2899SCharles.Forsythdraw: Draw; 6*37da2899SCharles.ForsythScreen, Display, Image: import draw; 7*37da2899SCharles.Forsythinclude "tk.m"; 8*37da2899SCharles.Forsyth 9*37da2899SCharles.ForsythTest: module 10*37da2899SCharles.Forsyth{ 11*37da2899SCharles.Forsyth init: fn(ctxt: ref Draw->Context, argv: list of string); 12*37da2899SCharles.Forsyth}; 13*37da2899SCharles.Forsyth 14*37da2899SCharles.Forsythtk: Tk; 15*37da2899SCharles.Forsythsys: Sys; 16*37da2899SCharles.Forsyth 17*37da2899SCharles.Forsythinit(nil: ref Draw->Context, argv: list of string) 18*37da2899SCharles.Forsyth{ 19*37da2899SCharles.Forsyth cmd: string; 20*37da2899SCharles.Forsyth 21*37da2899SCharles.Forsyth sys = load Sys Sys->PATH; 22*37da2899SCharles.Forsyth draw = load Draw Draw->PATH; 23*37da2899SCharles.Forsyth tk = load Tk Tk->PATH; 24*37da2899SCharles.Forsyth 25*37da2899SCharles.Forsyth display := Display.allocate(nil); 26*37da2899SCharles.Forsyth if(display == nil) { 27*37da2899SCharles.Forsyth sys->print("can't initialize display: %r\n"); 28*37da2899SCharles.Forsyth return; 29*37da2899SCharles.Forsyth } 30*37da2899SCharles.Forsyth 31*37da2899SCharles.Forsyth disp := display.image; 32*37da2899SCharles.Forsyth screen := Screen.allocate(disp, display.rgb(161, 195, 209), 1); 33*37da2899SCharles.Forsyth if(screen == nil) { 34*37da2899SCharles.Forsyth sys->print("can't allocate screen: %r\n"); 35*37da2899SCharles.Forsyth return; 36*37da2899SCharles.Forsyth } 37*37da2899SCharles.Forsyth fd := sys->open("/dev/pointer", sys->OREAD); 38*37da2899SCharles.Forsyth if(fd == nil) { 39*37da2899SCharles.Forsyth sys->print("open: %s: %r\n", "/dev/pointer"); 40*37da2899SCharles.Forsyth sys->print("run wm/wish instead\n"); 41*37da2899SCharles.Forsyth return; 42*37da2899SCharles.Forsyth } 43*37da2899SCharles.Forsyth 44*37da2899SCharles.Forsyth t := tk->toplevel(display, ""); 45*37da2899SCharles.Forsyth spawn mouse(t, fd); 46*37da2899SCharles.Forsyth spawn keyboard(t); 47*37da2899SCharles.Forsyth disp.draw(disp.r, screen.fill, nil, disp.r.min); 48*37da2899SCharles.Forsyth 49*37da2899SCharles.Forsyth input := array[8192] of byte; 50*37da2899SCharles.Forsyth stdin := sys->fildes(0); 51*37da2899SCharles.Forsyth 52*37da2899SCharles.Forsyth if(argv != nil) 53*37da2899SCharles.Forsyth argv = tl argv; 54*37da2899SCharles.Forsyth while(argv != nil) { 55*37da2899SCharles.Forsyth exec(t, hd argv); 56*37da2899SCharles.Forsyth argv = tl argv; 57*37da2899SCharles.Forsyth } 58*37da2899SCharles.Forsyth 59*37da2899SCharles.Forsyth for(;;) { 60*37da2899SCharles.Forsyth tk->cmd(t, "update"); 61*37da2899SCharles.Forsyth 62*37da2899SCharles.Forsyth prompt := '%'; 63*37da2899SCharles.Forsyth if(cmd != nil) 64*37da2899SCharles.Forsyth prompt = '>'; 65*37da2899SCharles.Forsyth sys->print("%c ", prompt); 66*37da2899SCharles.Forsyth 67*37da2899SCharles.Forsyth n := sys->read(stdin, input, len input); 68*37da2899SCharles.Forsyth if(n <= 0) 69*37da2899SCharles.Forsyth break; 70*37da2899SCharles.Forsyth if(n == 1) 71*37da2899SCharles.Forsyth continue; 72*37da2899SCharles.Forsyth cmd += string input[0:n-1]; 73*37da2899SCharles.Forsyth if(cmd[len cmd-1] != '\\') { 74*37da2899SCharles.Forsyth cmd = esc(cmd); 75*37da2899SCharles.Forsyth s := tk->cmd(t, cmd); 76*37da2899SCharles.Forsyth if(len s != 0) 77*37da2899SCharles.Forsyth sys->print("%s\n", s); 78*37da2899SCharles.Forsyth cmd = nil; 79*37da2899SCharles.Forsyth continue; 80*37da2899SCharles.Forsyth } 81*37da2899SCharles.Forsyth cmd = cmd[0:len cmd-1]; 82*37da2899SCharles.Forsyth } 83*37da2899SCharles.Forsyth} 84*37da2899SCharles.Forsyth 85*37da2899SCharles.Forsythesc(s: string): string 86*37da2899SCharles.Forsyth{ 87*37da2899SCharles.Forsyth c: int; 88*37da2899SCharles.Forsyth 89*37da2899SCharles.Forsyth for(i := 0; i < len s; i++) { 90*37da2899SCharles.Forsyth if(s[i] != '\\') 91*37da2899SCharles.Forsyth continue; 92*37da2899SCharles.Forsyth case s[i+1] { 93*37da2899SCharles.Forsyth 'n'=> c = '\n'; 94*37da2899SCharles.Forsyth 't'=> c = '\t'; 95*37da2899SCharles.Forsyth 'b'=> c = '\b'; 96*37da2899SCharles.Forsyth '\\'=> c = '\\'; 97*37da2899SCharles.Forsyth * => c = 0; 98*37da2899SCharles.Forsyth } 99*37da2899SCharles.Forsyth if(c != 0) { 100*37da2899SCharles.Forsyth s[i] = c; 101*37da2899SCharles.Forsyth s = s[0:i+1]+s[i+2:len s]; 102*37da2899SCharles.Forsyth } 103*37da2899SCharles.Forsyth } 104*37da2899SCharles.Forsyth return s; 105*37da2899SCharles.Forsyth} 106*37da2899SCharles.Forsyth 107*37da2899SCharles.Forsythexec(t: ref Tk->Toplevel, path: string) 108*37da2899SCharles.Forsyth{ 109*37da2899SCharles.Forsyth fd := sys->open(path, sys->OREAD); 110*37da2899SCharles.Forsyth if(fd == nil) { 111*37da2899SCharles.Forsyth sys->print("open: %s: %r\n", path); 112*37da2899SCharles.Forsyth return; 113*37da2899SCharles.Forsyth } 114*37da2899SCharles.Forsyth (ok, d) := sys->fstat(fd); 115*37da2899SCharles.Forsyth if(ok < 0) { 116*37da2899SCharles.Forsyth sys->print("fstat: %s: %r\n", path); 117*37da2899SCharles.Forsyth return; 118*37da2899SCharles.Forsyth } 119*37da2899SCharles.Forsyth buf := array[int d.length] of byte; 120*37da2899SCharles.Forsyth if(sys->read(fd, buf, len buf) < 0) { 121*37da2899SCharles.Forsyth sys->print("read: %s: %r\n", path); 122*37da2899SCharles.Forsyth return; 123*37da2899SCharles.Forsyth } 124*37da2899SCharles.Forsyth (n, l) := sys->tokenize(string buf, "\n"); 125*37da2899SCharles.Forsyth buf = nil; 126*37da2899SCharles.Forsyth n = -1; 127*37da2899SCharles.Forsyth for(; l != nil; l = tl l) { 128*37da2899SCharles.Forsyth n++; 129*37da2899SCharles.Forsyth s := hd l; 130*37da2899SCharles.Forsyth if(len s == 0 || s[0] == '#') 131*37da2899SCharles.Forsyth continue; 132*37da2899SCharles.Forsyth 133*37da2899SCharles.Forsyth while(s[len s-1] == '\\') { 134*37da2899SCharles.Forsyth s = s[0:len s-1]; 135*37da2899SCharles.Forsyth if(tl l != nil) { 136*37da2899SCharles.Forsyth l = tl l; 137*37da2899SCharles.Forsyth s = s + hd l; 138*37da2899SCharles.Forsyth } 139*37da2899SCharles.Forsyth else 140*37da2899SCharles.Forsyth break; 141*37da2899SCharles.Forsyth } 142*37da2899SCharles.Forsyth 143*37da2899SCharles.Forsyth s = tk->cmd(t, esc(s)); 144*37da2899SCharles.Forsyth 145*37da2899SCharles.Forsyth if(len s != 0 && s[0] == '!') { 146*37da2899SCharles.Forsyth sys->print("%s:%d %s\n", path, n, s); 147*37da2899SCharles.Forsyth sys->print("%s:%d %s\n", path, n, hd l); 148*37da2899SCharles.Forsyth } 149*37da2899SCharles.Forsyth } 150*37da2899SCharles.Forsyth} 151*37da2899SCharles.Forsyth 152*37da2899SCharles.Forsythmouse(t: ref Tk->Toplevel, fd: ref Sys->FD) 153*37da2899SCharles.Forsyth{ 154*37da2899SCharles.Forsyth n := 0; 155*37da2899SCharles.Forsyth buf := array[100] of byte; 156*37da2899SCharles.Forsyth for(;;) { 157*37da2899SCharles.Forsyth n = sys->read(fd, buf, len buf); 158*37da2899SCharles.Forsyth if(n <= 0) 159*37da2899SCharles.Forsyth break; 160*37da2899SCharles.Forsyth 161*37da2899SCharles.Forsyth if(int buf[0] == 'm' && n >= 1+3*12) { 162*37da2899SCharles.Forsyth x := int(string buf[ 1:13]); 163*37da2899SCharles.Forsyth y := int(string buf[12:25]); 164*37da2899SCharles.Forsyth b := int(string buf[24:37]); 165*37da2899SCharles.Forsyth tk->pointer(t, Draw->Pointer(b, Draw->Point(x, y), sys->millisec())); 166*37da2899SCharles.Forsyth } 167*37da2899SCharles.Forsyth } 168*37da2899SCharles.Forsyth} 169*37da2899SCharles.Forsyth 170*37da2899SCharles.Forsythkeyboard(t: ref Tk->Toplevel) 171*37da2899SCharles.Forsyth{ 172*37da2899SCharles.Forsyth dfd := sys->open("/dev/keyboard", sys->OREAD); 173*37da2899SCharles.Forsyth if(dfd == nil) 174*37da2899SCharles.Forsyth return; 175*37da2899SCharles.Forsyth 176*37da2899SCharles.Forsyth b:= array[1] of byte; 177*37da2899SCharles.Forsyth buf := array[10] of byte; 178*37da2899SCharles.Forsyth i := 0; 179*37da2899SCharles.Forsyth for(;;) { 180*37da2899SCharles.Forsyth n := sys->read(dfd, buf[i:], len buf - i); 181*37da2899SCharles.Forsyth if(n < 1) 182*37da2899SCharles.Forsyth break; 183*37da2899SCharles.Forsyth i += n; 184*37da2899SCharles.Forsyth while(i >0 && (nutf := sys->utfbytes(buf, i)) > 0){ 185*37da2899SCharles.Forsyth s := string buf[0:nutf]; 186*37da2899SCharles.Forsyth tk->keyboard(t, int s[0]); 187*37da2899SCharles.Forsyth buf[0:] = buf[nutf:i]; 188*37da2899SCharles.Forsyth i -= nutf; 189*37da2899SCharles.Forsyth } 190*37da2899SCharles.Forsyth } 191*37da2899SCharles.Forsyth} 192