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