xref: /plan9/sys/src/cmd/unix/drawterm/libmemlayer/ldelete.c (revision 7dd7cddf99dd7472612f1413b4da293630e6b1bc)
1*7dd7cddfSDavid du Colombier #include "../lib9.h"
2*7dd7cddfSDavid du Colombier 
3*7dd7cddfSDavid du Colombier #include "../libdraw/draw.h"
4*7dd7cddfSDavid du Colombier #include "../libmemdraw/memdraw.h"
5*7dd7cddfSDavid du Colombier #include "../libmemlayer/memlayer.h"
6*7dd7cddfSDavid du Colombier 
7*7dd7cddfSDavid du Colombier void
8*7dd7cddfSDavid du Colombier memldelete(Memimage *i)
9*7dd7cddfSDavid du Colombier {
10*7dd7cddfSDavid du Colombier 	Memscreen *s;
11*7dd7cddfSDavid du Colombier 	Memlayer *l;
12*7dd7cddfSDavid du Colombier 
13*7dd7cddfSDavid du Colombier 	l = i->layer;
14*7dd7cddfSDavid du Colombier 	/* free backing store and disconnect refresh, to make pushback fast */
15*7dd7cddfSDavid du Colombier 	freememimage(l->save);
16*7dd7cddfSDavid du Colombier 	l->save = nil;
17*7dd7cddfSDavid du Colombier 	l->refreshptr = nil;
18*7dd7cddfSDavid du Colombier 	memltorear(i);
19*7dd7cddfSDavid du Colombier 
20*7dd7cddfSDavid du Colombier 	/* window is now the rearmost;  clean up screen structures and deallocate */
21*7dd7cddfSDavid du Colombier 	s = i->layer->screen;
22*7dd7cddfSDavid du Colombier 	if(s->fill){
23*7dd7cddfSDavid du Colombier 		i->clipr = i->r;
24*7dd7cddfSDavid du Colombier 		memdraw(i, i->r, s->fill, i->r.min, nil, i->r.min);
25*7dd7cddfSDavid du Colombier 	}
26*7dd7cddfSDavid du Colombier 	if(l->front){
27*7dd7cddfSDavid du Colombier 		l->front->layer->rear = nil;
28*7dd7cddfSDavid du Colombier 		s->rearmost = l->front;
29*7dd7cddfSDavid du Colombier 	}else{
30*7dd7cddfSDavid du Colombier 		s->frontmost = nil;
31*7dd7cddfSDavid du Colombier 		s->rearmost = nil;
32*7dd7cddfSDavid du Colombier 	}
33*7dd7cddfSDavid du Colombier 	free(l);
34*7dd7cddfSDavid du Colombier 	freememimage(i);
35*7dd7cddfSDavid du Colombier }
36*7dd7cddfSDavid du Colombier 
37*7dd7cddfSDavid du Colombier /*
38*7dd7cddfSDavid du Colombier  * Just free the data structures, don't do graphics
39*7dd7cddfSDavid du Colombier  */
40*7dd7cddfSDavid du Colombier void
41*7dd7cddfSDavid du Colombier memlfree(Memimage *i)
42*7dd7cddfSDavid du Colombier {
43*7dd7cddfSDavid du Colombier 	Memlayer *l;
44*7dd7cddfSDavid du Colombier 
45*7dd7cddfSDavid du Colombier 	l = i->layer;
46*7dd7cddfSDavid du Colombier 	freememimage(l->save);
47*7dd7cddfSDavid du Colombier 	free(l);
48*7dd7cddfSDavid du Colombier 	freememimage(i);
49*7dd7cddfSDavid du Colombier }
50*7dd7cddfSDavid du Colombier 
51*7dd7cddfSDavid du Colombier void
52*7dd7cddfSDavid du Colombier memlsetclear(Memscreen *s)
53*7dd7cddfSDavid du Colombier {
54*7dd7cddfSDavid du Colombier 	Memimage *i, *j;
55*7dd7cddfSDavid du Colombier 	Memlayer *l;
56*7dd7cddfSDavid du Colombier 
57*7dd7cddfSDavid du Colombier 	for(i=s->rearmost; i; i=i->layer->front){
58*7dd7cddfSDavid du Colombier 		l = i->layer;
59*7dd7cddfSDavid du Colombier 		l->clear = rectinrect(l->screenr, l->screen->image->clipr);
60*7dd7cddfSDavid du Colombier 		if(l->clear)
61*7dd7cddfSDavid du Colombier 			for(j=l->front; j; j=j->layer->front)
62*7dd7cddfSDavid du Colombier 				if(rectXrect(l->screenr, j->layer->screenr)){
63*7dd7cddfSDavid du Colombier 					l->clear = 0;
64*7dd7cddfSDavid du Colombier 					break;
65*7dd7cddfSDavid du Colombier 				}
66*7dd7cddfSDavid du Colombier 	}
67*7dd7cddfSDavid du Colombier }
68