137da2899SCharles.Forsythimplement Devpointer; 237da2899SCharles.Forsyth 337da2899SCharles.Forsythinclude "sys.m"; 437da2899SCharles.Forsyth sys: Sys; 537da2899SCharles.Forsyth 637da2899SCharles.Forsythinclude "draw.m"; 737da2899SCharles.Forsyth Pointer: import Draw; 837da2899SCharles.Forsyth 937da2899SCharles.Forsythinclude "devpointer.m"; 1037da2899SCharles.Forsyth 1137da2899SCharles.Forsythinit() 1237da2899SCharles.Forsyth{ 1337da2899SCharles.Forsyth sys = load Sys Sys->PATH; 1437da2899SCharles.Forsyth} 1537da2899SCharles.Forsyth 1637da2899SCharles.Forsythreader(file: string, posn: chan of ref Pointer, pid: chan of (int, string)) 1737da2899SCharles.Forsyth{ 1837da2899SCharles.Forsyth if(file == nil) 1937da2899SCharles.Forsyth file = "/dev/pointer"; 2037da2899SCharles.Forsyth dfd := sys->open(file, sys->OREAD); 2137da2899SCharles.Forsyth if(dfd == nil){ 2237da2899SCharles.Forsyth if(pid != nil){ 2337da2899SCharles.Forsyth pid <-= (-1, sys->sprint("cannot open %s: %r", file)); 2437da2899SCharles.Forsyth return; 2537da2899SCharles.Forsyth } 2637da2899SCharles.Forsyth } 2737da2899SCharles.Forsyth if(pid != nil) 2837da2899SCharles.Forsyth pid <-= (sys->pctl(0, nil), nil); 2937da2899SCharles.Forsyth b:= array[Size] of byte; 30*9b29ac7eSCharles.Forsyth while(sys->read(dfd, b, len b) == Size) 3137da2899SCharles.Forsyth posn <-= bytes2ptr(b); 3237da2899SCharles.Forsyth} 3337da2899SCharles.Forsyth 3437da2899SCharles.Forsythbytes2ptr(b: array of byte): ref Pointer 3537da2899SCharles.Forsyth{ 3637da2899SCharles.Forsyth if(len b < Size || int b[0] != 'm') 3737da2899SCharles.Forsyth return nil; 3837da2899SCharles.Forsyth x := int string b[1:13]; 3937da2899SCharles.Forsyth y := int string b[13:25]; 4037da2899SCharles.Forsyth but := int string b[25:37]; 4137da2899SCharles.Forsyth msec := int string b[37:49]; 4237da2899SCharles.Forsyth return ref Pointer (but, (x, y), msec); 4337da2899SCharles.Forsyth} 4437da2899SCharles.Forsyth 4537da2899SCharles.Forsythptr2bytes(p: ref Pointer): array of byte 4637da2899SCharles.Forsyth{ 4737da2899SCharles.Forsyth if(p == nil) 4837da2899SCharles.Forsyth return nil; 4937da2899SCharles.Forsyth return sys->aprint("m%11d %11d %11d %11ud ", p.xy.x, p.xy.y, p.buttons, p.msec); 5037da2899SCharles.Forsyth} 5137da2899SCharles.Forsyth 5237da2899SCharles.Forsythsrv(c: chan of ref Pointer, f: ref Sys->FileIO) 5337da2899SCharles.Forsyth{ 5437da2899SCharles.Forsyth ptrq := ref Ptrqueue; 5537da2899SCharles.Forsyth dummy := chan of (int, int, int, Sys->Rread); 5637da2899SCharles.Forsyth sys = load Sys Sys->PATH; 5737da2899SCharles.Forsyth 5837da2899SCharles.Forsyth for(;;){ 5937da2899SCharles.Forsyth r := dummy; 6037da2899SCharles.Forsyth if(ptrq.nonempty()) 6137da2899SCharles.Forsyth r = f.read; 6237da2899SCharles.Forsyth alt{ 6337da2899SCharles.Forsyth p := <-c => 6437da2899SCharles.Forsyth if(p == nil) 6537da2899SCharles.Forsyth exit; 6637da2899SCharles.Forsyth ptrq.put(p); 67*9b29ac7eSCharles.Forsyth (nil, nil, nil, rc) := <-r => 6837da2899SCharles.Forsyth if(rc != nil){ 6937da2899SCharles.Forsyth alt{ 7037da2899SCharles.Forsyth rc <-= (ptr2bytes(ptrq.get()), nil) =>; 7137da2899SCharles.Forsyth * =>; 7237da2899SCharles.Forsyth } 7337da2899SCharles.Forsyth } 7437da2899SCharles.Forsyth (nil, nil, nil, rc) := <-f.write => 7537da2899SCharles.Forsyth if(rc != nil) 7637da2899SCharles.Forsyth rc <-= (0, "read only"); 7737da2899SCharles.Forsyth } 7837da2899SCharles.Forsyth } 7937da2899SCharles.Forsyth} 8037da2899SCharles.Forsyth 8137da2899SCharles.ForsythPtrqueue.put(q: self ref Ptrqueue, s: ref Pointer) 8237da2899SCharles.Forsyth{ 8337da2899SCharles.Forsyth if(q.last != nil && s.buttons == q.last.buttons) 8437da2899SCharles.Forsyth *q.last = *s; 8537da2899SCharles.Forsyth else{ 8637da2899SCharles.Forsyth q.t = s :: q.t; 8737da2899SCharles.Forsyth q.last = s; 8837da2899SCharles.Forsyth } 8937da2899SCharles.Forsyth} 9037da2899SCharles.Forsyth 9137da2899SCharles.ForsythPtrqueue.get(q: self ref Ptrqueue): ref Pointer 9237da2899SCharles.Forsyth{ 9337da2899SCharles.Forsyth s: ref Pointer; 9437da2899SCharles.Forsyth h := q.h; 9537da2899SCharles.Forsyth if(h == nil){ 9637da2899SCharles.Forsyth for(t := q.t; t != nil; t = tl t) 9737da2899SCharles.Forsyth h = hd t :: h; 9837da2899SCharles.Forsyth q.t = nil; 9937da2899SCharles.Forsyth } 10037da2899SCharles.Forsyth if(h != nil){ 10137da2899SCharles.Forsyth s = hd h; 10237da2899SCharles.Forsyth h = tl h; 10337da2899SCharles.Forsyth if(h == nil) 10437da2899SCharles.Forsyth q.last = nil; 10537da2899SCharles.Forsyth } 10637da2899SCharles.Forsyth q.h = h; 10737da2899SCharles.Forsyth return s; 10837da2899SCharles.Forsyth} 10937da2899SCharles.ForsythPtrqueue.peek(q: self ref Ptrqueue): ref Pointer 11037da2899SCharles.Forsyth{ 11137da2899SCharles.Forsyth s: ref Pointer; 11237da2899SCharles.Forsyth if (q.h == nil && q.t == nil) 11337da2899SCharles.Forsyth return s; 11437da2899SCharles.Forsyth t := q.last; 11537da2899SCharles.Forsyth s = q.get(); 11637da2899SCharles.Forsyth q.h = s :: q.h; 11737da2899SCharles.Forsyth q.last = t; 11837da2899SCharles.Forsyth return s; 11937da2899SCharles.Forsyth} 12037da2899SCharles.ForsythPtrqueue.nonempty(q: self ref Ptrqueue): int 12137da2899SCharles.Forsyth{ 12237da2899SCharles.Forsyth return q.h != nil || q.t != nil; 12337da2899SCharles.Forsyth} 124