]> git.lizzy.rs Git - plan9front.git/blob - sys/src/libmemlayer/ltofront.c
Import sources from 2011-03-30 iso image
[plan9front.git] / sys / src / libmemlayer / ltofront.c
1 #include <u.h>
2 #include <libc.h>
3 #include <draw.h>
4 #include <memdraw.h>
5 #include <memlayer.h>
6 #include <pool.h>
7
8 /*
9  * Pull i towards top of screen, just behind front
10 */
11 static
12 void
13 _memltofront(Memimage *i, Memimage *front, int fill)
14 {
15         Memlayer *l;
16         Memscreen *s;
17         Memimage *f, *ff, *rr;
18         Rectangle x;
19         int overlap;
20
21         l = i->layer;
22         s = l->screen;
23         while(l->front != front){
24                 f = l->front;
25                 x = l->screenr;
26                 overlap = rectclip(&x, f->layer->screenr);
27                 if(overlap){
28                         memlhide(f, x);
29                         f->layer->clear = 0;
30                 }
31                 /* swap l and f in screen's list */
32                 ff = f->layer->front;
33                 rr = l->rear;
34                 if(ff == nil)
35                         s->frontmost = i;
36                 else
37                         ff->layer->rear = i;
38                 if(rr == nil)
39                         s->rearmost = f;
40                 else
41                         rr->layer->front = f;
42                 l->front = ff;
43                 l->rear = f;
44                 f->layer->front = i;
45                 f->layer->rear = rr;
46                 if(overlap && fill)
47                         memlexpose(i, x);
48         }
49 }
50
51 void
52 _memltofrontfill(Memimage *i, int fill)
53 {
54         _memltofront(i, nil, fill);
55         _memlsetclear(i->layer->screen);
56 }
57
58 void
59 memltofront(Memimage *i)
60 {
61         _memltofront(i, nil, 1);
62         _memlsetclear(i->layer->screen);
63 }
64
65 void
66 memltofrontn(Memimage **ip, int n)
67 {
68         Memimage *i, *front;
69         Memscreen *s;
70
71         if(n == 0)
72                 return;
73         front = nil;
74         while(--n >= 0){
75                 i = *ip++;
76                 _memltofront(i, front, 1);
77                 front = i;
78         }
79         s = front->layer->screen;
80         _memlsetclear(s);
81 }