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