]> git.lizzy.rs Git - plan9front.git/blob - sys/src/libmemlayer/ltofront.c
snoopy(8): avoid extra spaces in dhcp filter output
[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
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;
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
51 _memltofrontfill(Memimage *i, int fill)
52 {
53         _memltofront(i, nil, fill);
54         _memlsetclear(i->layer->screen);
55 }
56
57 void
58 memltofront(Memimage *i)
59 {
60         _memltofront(i, nil, 1);
61         _memlsetclear(i->layer->screen);
62 }
63
64 void
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 }