xref: /plan9/sys/src/cmd/unix/drawterm/libmemlayer/ldelete.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 void
memldelete(Memimage * i)87dd7cddfSDavid du Colombier memldelete(Memimage *i)
97dd7cddfSDavid du Colombier {
107dd7cddfSDavid du Colombier 	Memscreen *s;
117dd7cddfSDavid du Colombier 	Memlayer *l;
127dd7cddfSDavid du Colombier 
137dd7cddfSDavid du Colombier 	l = i->layer;
147dd7cddfSDavid du Colombier 	/* free backing store and disconnect refresh, to make pushback fast */
157dd7cddfSDavid du Colombier 	freememimage(l->save);
167dd7cddfSDavid du Colombier 	l->save = nil;
177dd7cddfSDavid du Colombier 	l->refreshptr = nil;
187dd7cddfSDavid du Colombier 	memltorear(i);
197dd7cddfSDavid du Colombier 
207dd7cddfSDavid du Colombier 	/* window is now the rearmost;  clean up screen structures and deallocate */
217dd7cddfSDavid du Colombier 	s = i->layer->screen;
227dd7cddfSDavid du Colombier 	if(s->fill){
237dd7cddfSDavid du Colombier 		i->clipr = i->r;
24*8ccd4a63SDavid du Colombier 		memdraw(i, i->r, s->fill, i->r.min, nil, i->r.min, S);
257dd7cddfSDavid du Colombier 	}
267dd7cddfSDavid du Colombier 	if(l->front){
277dd7cddfSDavid du Colombier 		l->front->layer->rear = nil;
287dd7cddfSDavid du Colombier 		s->rearmost = l->front;
297dd7cddfSDavid du Colombier 	}else{
307dd7cddfSDavid du Colombier 		s->frontmost = nil;
317dd7cddfSDavid du Colombier 		s->rearmost = nil;
327dd7cddfSDavid du Colombier 	}
337dd7cddfSDavid du Colombier 	free(l);
347dd7cddfSDavid du Colombier 	freememimage(i);
357dd7cddfSDavid du Colombier }
367dd7cddfSDavid du Colombier 
377dd7cddfSDavid du Colombier /*
387dd7cddfSDavid du Colombier  * Just free the data structures, don't do graphics
397dd7cddfSDavid du Colombier  */
407dd7cddfSDavid du Colombier void
memlfree(Memimage * i)417dd7cddfSDavid du Colombier memlfree(Memimage *i)
427dd7cddfSDavid du Colombier {
437dd7cddfSDavid du Colombier 	Memlayer *l;
447dd7cddfSDavid du Colombier 
457dd7cddfSDavid du Colombier 	l = i->layer;
467dd7cddfSDavid du Colombier 	freememimage(l->save);
477dd7cddfSDavid du Colombier 	free(l);
487dd7cddfSDavid du Colombier 	freememimage(i);
497dd7cddfSDavid du Colombier }
507dd7cddfSDavid du Colombier 
517dd7cddfSDavid du Colombier void
_memlsetclear(Memscreen * s)52*8ccd4a63SDavid du Colombier _memlsetclear(Memscreen *s)
537dd7cddfSDavid du Colombier {
547dd7cddfSDavid du Colombier 	Memimage *i, *j;
557dd7cddfSDavid du Colombier 	Memlayer *l;
567dd7cddfSDavid du Colombier 
577dd7cddfSDavid du Colombier 	for(i=s->rearmost; i; i=i->layer->front){
587dd7cddfSDavid du Colombier 		l = i->layer;
597dd7cddfSDavid du Colombier 		l->clear = rectinrect(l->screenr, l->screen->image->clipr);
607dd7cddfSDavid du Colombier 		if(l->clear)
617dd7cddfSDavid du Colombier 			for(j=l->front; j; j=j->layer->front)
627dd7cddfSDavid du Colombier 				if(rectXrect(l->screenr, j->layer->screenr)){
637dd7cddfSDavid du Colombier 					l->clear = 0;
647dd7cddfSDavid du Colombier 					break;
657dd7cddfSDavid du Colombier 				}
667dd7cddfSDavid du Colombier 	}
677dd7cddfSDavid du Colombier }
68