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