1 #include "lib9.h"
2 #include "draw.h"
3 #include "memdraw.h"
4 #include "memlayer.h"
5
6 void
_memltorear(Memimage * i,Memimage * rear)7 _memltorear(Memimage *i, Memimage *rear)
8 {
9 Memlayer *l;
10 Memscreen *s;
11 Memimage *f, *r, *rr;
12 Rectangle x;
13 int overlap;
14
15 l = i->layer;
16 s = l->screen;
17 while(l->rear != rear){
18 r = l->rear;
19 x = l->screenr;
20 overlap = rectclip(&x, r->layer->screenr);
21 if(overlap){
22 memlhide(i, x);
23 l->clear = 0;
24 }
25 /* swap l and r in screen's list */
26 rr = r->layer->rear;
27 f = l->front;
28 if(rr == nil)
29 s->rearmost = i;
30 else
31 rr->layer->front = i;
32 if(f == nil)
33 s->frontmost = r;
34 else
35 f->layer->rear = r;
36 l->rear = rr;
37 l->front = r;
38 r->layer->rear = i;
39 r->layer->front = f;
40 if(overlap)
41 memlexpose(r, x);
42 }
43 }
44
45 void
memltorear(Memimage * i)46 memltorear(Memimage *i)
47 {
48 _memltorear(i, nil);
49 _memlsetclear(i->layer->screen);
50 }
51
52 void
memltorearn(Memimage ** ip,int n)53 memltorearn(Memimage **ip, int n)
54 {
55 Memimage *i, *rear;
56 Memscreen *s;
57
58 if(n == 0)
59 return;
60 rear = nil;
61 while(--n >= 0){
62 i = *ip++;
63 _memltorear(i, rear);
64 rear = i;
65 }
66 s = rear->layer->screen;
67 _memlsetclear(s);
68 }
69