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