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