| #include <u.h> |
| #include <libc.h> |
| #include <draw.h> |
| #include <memdraw.h> |
| #include <memlayer.h> |
| |
| /* |
| * Pull i towards top of screen, just behind front |
| */ |
| static |
| void |
| _memltofront(Memimage *i, Memimage *front, int fill) |
| { |
| Memlayer *l; |
| Memscreen *s; |
| Memimage *f, *ff, *rr; |
| Rectangle x; |
| int overlap; |
| |
| l = i->layer; |
| s = l->screen; |
| while(l->front != front){ |
| f = l->front; |
| x = l->screenr; |
| overlap = rectclip(&x, f->layer->screenr); |
| if(overlap){ |
| memlhide(f, x); |
| f->layer->clear = 0; |
| } |
| /* swap l and f in screen's list */ |
| ff = f->layer->front; |
| rr = l->rear; |
| if(ff == nil) |
| s->frontmost = i; |
| else |
| ff->layer->rear = i; |
| if(rr == nil) |
| s->rearmost = f; |
| else |
| rr->layer->front = f; |
| l->front = ff; |
| l->rear = f; |
| f->layer->front = i; |
| f->layer->rear = rr; |
| if(overlap && fill) |
| memlexpose(i, x); |
| } |
| } |
| |
| void |
| _memltofrontfill(Memimage *i, int fill) |
| { |
| _memltofront(i, nil, fill); |
| _memlsetclear(i->layer->screen); |
| } |
| |
| void |
| memltofront(Memimage *i) |
| { |
| _memltofront(i, nil, 1); |
| _memlsetclear(i->layer->screen); |
| } |
| |
| void |
| memltofrontn(Memimage **ip, int n) |
| { |
| Memimage *i, *front; |
| Memscreen *s; |
| |
| if(n == 0) |
| return; |
| front = nil; |
| while(--n >= 0){ |
| i = *ip++; |
| _memltofront(i, front, 1); |
| front = i; |
| } |
| s = front->layer->screen; |
| _memlsetclear(s); |
| } |