xref: /plan9/sys/src/cmd/unix/drawterm/libmemlayer/ltofront.c (revision 8ccd4a6360d974db7bd7bbd4f37e7018419ea908)
1*8ccd4a63SDavid du Colombier #include <u.h>
2*8ccd4a63SDavid du Colombier #include <libc.h>
3*8ccd4a63SDavid du Colombier #include <draw.h>
4*8ccd4a63SDavid du Colombier #include <memdraw.h>
5*8ccd4a63SDavid du Colombier #include <memlayer.h>
67dd7cddfSDavid du Colombier 
77dd7cddfSDavid du Colombier /*
87dd7cddfSDavid du Colombier  * Pull i towards top of screen, just behind front
97dd7cddfSDavid du Colombier */
107dd7cddfSDavid du Colombier static
117dd7cddfSDavid du Colombier void
_memltofront(Memimage * i,Memimage * front,int fill)12*8ccd4a63SDavid du Colombier _memltofront(Memimage *i, Memimage *front, int fill)
137dd7cddfSDavid du Colombier {
147dd7cddfSDavid du Colombier 	Memlayer *l;
157dd7cddfSDavid du Colombier 	Memscreen *s;
167dd7cddfSDavid du Colombier 	Memimage *f, *ff, *rr;
177dd7cddfSDavid du Colombier 	Rectangle x;
187dd7cddfSDavid du Colombier 	int overlap;
197dd7cddfSDavid du Colombier 
207dd7cddfSDavid du Colombier 	l = i->layer;
217dd7cddfSDavid du Colombier 	s = l->screen;
227dd7cddfSDavid du Colombier 	while(l->front != front){
237dd7cddfSDavid du Colombier 		f = l->front;
247dd7cddfSDavid du Colombier 		x = l->screenr;
257dd7cddfSDavid du Colombier 		overlap = rectclip(&x, f->layer->screenr);
267dd7cddfSDavid du Colombier 		if(overlap){
277dd7cddfSDavid du Colombier 			memlhide(f, x);
287dd7cddfSDavid du Colombier 			f->layer->clear = 0;
297dd7cddfSDavid du Colombier 		}
307dd7cddfSDavid du Colombier 		/* swap l and f in screen's list */
317dd7cddfSDavid du Colombier 		ff = f->layer->front;
327dd7cddfSDavid du Colombier 		rr = l->rear;
337dd7cddfSDavid du Colombier 		if(ff == nil)
347dd7cddfSDavid du Colombier 			s->frontmost = i;
357dd7cddfSDavid du Colombier 		else
367dd7cddfSDavid du Colombier 			ff->layer->rear = i;
377dd7cddfSDavid du Colombier 		if(rr == nil)
387dd7cddfSDavid du Colombier 			s->rearmost = f;
397dd7cddfSDavid du Colombier 		else
407dd7cddfSDavid du Colombier 			rr->layer->front = f;
417dd7cddfSDavid du Colombier 		l->front = ff;
427dd7cddfSDavid du Colombier 		l->rear = f;
437dd7cddfSDavid du Colombier 		f->layer->front = i;
447dd7cddfSDavid du Colombier 		f->layer->rear = rr;
45*8ccd4a63SDavid du Colombier 		if(overlap && fill)
467dd7cddfSDavid du Colombier 			memlexpose(i, x);
477dd7cddfSDavid du Colombier 	}
487dd7cddfSDavid du Colombier }
497dd7cddfSDavid du Colombier 
507dd7cddfSDavid du Colombier void
_memltofrontfill(Memimage * i,int fill)51*8ccd4a63SDavid du Colombier _memltofrontfill(Memimage *i, int fill)
52*8ccd4a63SDavid du Colombier {
53*8ccd4a63SDavid du Colombier 	_memltofront(i, nil, fill);
54*8ccd4a63SDavid du Colombier 	_memlsetclear(i->layer->screen);
55*8ccd4a63SDavid du Colombier }
56*8ccd4a63SDavid du Colombier 
57*8ccd4a63SDavid du Colombier void
memltofront(Memimage * i)587dd7cddfSDavid du Colombier memltofront(Memimage *i)
597dd7cddfSDavid du Colombier {
60*8ccd4a63SDavid du Colombier 	_memltofront(i, nil, 1);
61*8ccd4a63SDavid du Colombier 	_memlsetclear(i->layer->screen);
627dd7cddfSDavid du Colombier }
637dd7cddfSDavid du Colombier 
647dd7cddfSDavid du Colombier void
memltofrontn(Memimage ** ip,int n)657dd7cddfSDavid du Colombier memltofrontn(Memimage **ip, int n)
667dd7cddfSDavid du Colombier {
677dd7cddfSDavid du Colombier 	Memimage *i, *front;
687dd7cddfSDavid du Colombier 	Memscreen *s;
697dd7cddfSDavid du Colombier 
707dd7cddfSDavid du Colombier 	if(n == 0)
717dd7cddfSDavid du Colombier 		return;
727dd7cddfSDavid du Colombier 	front = nil;
737dd7cddfSDavid du Colombier 	while(--n >= 0){
747dd7cddfSDavid du Colombier 		i = *ip++;
75*8ccd4a63SDavid du Colombier 		_memltofront(i, front, 1);
767dd7cddfSDavid du Colombier 		front = i;
777dd7cddfSDavid du Colombier 	}
787dd7cddfSDavid du Colombier 	s = front->layer->screen;
79*8ccd4a63SDavid du Colombier 	_memlsetclear(s);
807dd7cddfSDavid du Colombier }
81