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