xref: /inferno-os/libmemlayer/ltorear.c (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
1 #include "lib9.h"
2 #include "draw.h"
3 #include "memdraw.h"
4 #include "memlayer.h"
5 
6 void
_memltorear(Memimage * i,Memimage * rear)7 _memltorear(Memimage *i, Memimage *rear)
8 {
9 	Memlayer *l;
10 	Memscreen *s;
11 	Memimage *f, *r, *rr;
12 	Rectangle x;
13 	int overlap;
14 
15 	l = i->layer;
16 	s = l->screen;
17 	while(l->rear != rear){
18 		r = l->rear;
19 		x = l->screenr;
20 		overlap = rectclip(&x, r->layer->screenr);
21 		if(overlap){
22 			memlhide(i, x);
23 			l->clear = 0;
24 		}
25 		/* swap l and r in screen's list */
26 		rr = r->layer->rear;
27 		f = l->front;
28 		if(rr == nil)
29 			s->rearmost = i;
30 		else
31 			rr->layer->front = i;
32 		if(f == nil)
33 			s->frontmost = r;
34 		else
35 			f->layer->rear = r;
36 		l->rear = rr;
37 		l->front = r;
38 		r->layer->rear = i;
39 		r->layer->front = f;
40 		if(overlap)
41 			memlexpose(r, x);
42 	}
43 }
44 
45 void
memltorear(Memimage * i)46 memltorear(Memimage *i)
47 {
48 	_memltorear(i, nil);
49 	_memlsetclear(i->layer->screen);
50 }
51 
52 void
memltorearn(Memimage ** ip,int n)53 memltorearn(Memimage **ip, int n)
54 {
55 	Memimage *i, *rear;
56 	Memscreen *s;
57 
58 	if(n == 0)
59 		return;
60 	rear = nil;
61 	while(--n >= 0){
62 		i = *ip++;
63 		_memltorear(i, rear);
64 		rear = i;
65 	}
66 	s = rear->layer->screen;
67 	_memlsetclear(s);
68 }
69