| #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); |
| } |