xref: /inferno-os/appl/lib/devpointer.b (revision 9b29ac7ea714507a9c0690620c02c8ca5ab25f90)
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