Blob


1 #include <u.h>
2 #include <libc.h>
3 #include <draw.h>
4 #include <memdraw.h>
5 #include <memlayer.h>
7 /*
8 * Pull i towards top of screen, just behind front
9 */
10 static
11 void
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;
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 }
50 void
51 _memltofrontfill(Memimage *i, int fill)
52 {
53 _memltofront(i, nil, fill);
54 _memlsetclear(i->layer->screen);
55 }
57 void
58 memltofront(Memimage *i)
59 {
60 _memltofront(i, nil, 1);
61 _memlsetclear(i->layer->screen);
62 }
64 void
65 memltofrontn(Memimage **ip, int n)
66 {
67 Memimage *i, *front;
68 Memscreen *s;
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 }