|  | #include <u.h> | 
|  | #include <libc.h> | 
|  | #include <draw.h> | 
|  | #include <memdraw.h> | 
|  | #include <memlayer.h> | 
|  |  | 
|  | void | 
|  | _memltorear(Memimage *i, Memimage *rear) | 
|  | { | 
|  | Memlayer *l; | 
|  | Memscreen *s; | 
|  | Memimage *f, *r, *rr; | 
|  | Rectangle x; | 
|  | int overlap; | 
|  |  | 
|  | l = i->layer; | 
|  | s = l->screen; | 
|  | while(l->rear != rear){ | 
|  | r = l->rear; | 
|  | x = l->screenr; | 
|  | overlap = rectclip(&x, r->layer->screenr); | 
|  | if(overlap){ | 
|  | memlhide(i, x); | 
|  | l->clear = 0; | 
|  | } | 
|  | /* swap l and r in screen's list */ | 
|  | rr = r->layer->rear; | 
|  | f = l->front; | 
|  | if(rr == nil) | 
|  | s->rearmost = i; | 
|  | else | 
|  | rr->layer->front = i; | 
|  | if(f == nil) | 
|  | s->frontmost = r; | 
|  | else | 
|  | f->layer->rear = r; | 
|  | l->rear = rr; | 
|  | l->front = r; | 
|  | r->layer->rear = i; | 
|  | r->layer->front = f; | 
|  | if(overlap) | 
|  | memlexpose(r, x); | 
|  | } | 
|  | } | 
|  |  | 
|  | void | 
|  | memltorear(Memimage *i) | 
|  | { | 
|  | _memltorear(i, nil); | 
|  | _memlsetclear(i->layer->screen); | 
|  | } | 
|  |  | 
|  | void | 
|  | memltorearn(Memimage **ip, int n) | 
|  | { | 
|  | Memimage *i, *rear; | 
|  | Memscreen *s; | 
|  |  | 
|  | if(n == 0) | 
|  | return; | 
|  | rear = nil; | 
|  | while(--n >= 0){ | 
|  | i = *ip++; | 
|  | _memltorear(i, rear); | 
|  | rear = i; | 
|  | } | 
|  | s = rear->layer->screen; | 
|  | _memlsetclear(s); | 
|  | } |