1 #include "../lib9.h" 2 3 #include "../libdraw/draw.h" 4 #include "../libmemdraw/memdraw.h" 5 #include "../libmemlayer/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) 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) 46 memlexpose(i, x); 47 } 48 } 49 50 void 51 memltofront(Memimage *i) 52 { 53 _memltofront(i, nil); 54 memlsetclear(i->layer->screen); 55 } 56 57 void 58 memltofrontn(Memimage **ip, int n) 59 { 60 Memimage *i, *front; 61 Memscreen *s; 62 63 if(n == 0) 64 return; 65 front = nil; 66 while(--n >= 0){ 67 i = *ip++; 68 _memltofront(i, front); 69 front = i; 70 } 71 s = front->layer->screen; 72 memlsetclear(s); 73 } 74