xref: /plan9/sys/src/cmd/unix/drawterm/libmemlayer/ltofront.c (revision 8ccd4a6360d974db7bd7bbd4f37e7018419ea908)
1 #include <u.h>
2 #include <libc.h>
3 #include <draw.h>
4 #include <memdraw.h>
5 #include <memlayer.h>
6 
7 /*
8  * Pull i towards top of screen, just behind front
9 */
10 static
11 void
_memltofront(Memimage * i,Memimage * front,int fill)12 _memltofront(Memimage *i, Memimage *front, int fill)
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 && fill)
46 			memlexpose(i, x);
47 	}
48 }
49 
50 void
_memltofrontfill(Memimage * i,int fill)51 _memltofrontfill(Memimage *i, int fill)
52 {
53 	_memltofront(i, nil, fill);
54 	_memlsetclear(i->layer->screen);
55 }
56 
57 void
memltofront(Memimage * i)58 memltofront(Memimage *i)
59 {
60 	_memltofront(i, nil, 1);
61 	_memlsetclear(i->layer->screen);
62 }
63 
64 void
memltofrontn(Memimage ** ip,int n)65 memltofrontn(Memimage **ip, int n)
66 {
67 	Memimage *i, *front;
68 	Memscreen *s;
69 
70 	if(n == 0)
71 		return;
72 	front = nil;
73 	while(--n >= 0){
74 		i = *ip++;
75 		_memltofront(i, front, 1);
76 		front = i;
77 	}
78 	s = front->layer->screen;
79 	_memlsetclear(s);
80 }
81