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 front9 */10 static11 void12 _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 else36 ff->layer->rear = i;37 if(rr == nil)38 s->rearmost = f;39 else40 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 void51 _memltofrontfill(Memimage *i, int fill)52 {53 _memltofront(i, nil, fill);54 _memlsetclear(i->layer->screen);55 }57 void58 memltofront(Memimage *i)59 {60 _memltofront(i, nil, 1);61 _memlsetclear(i->layer->screen);62 }64 void65 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 }