Blame


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