xref: /inferno-os/libmemlayer/lsetrefresh.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 int
memlsetrefresh(Memimage * i,Refreshfn fn,void * ptr)7*37da2899SCharles.Forsyth memlsetrefresh(Memimage *i, Refreshfn fn, void *ptr)
8*37da2899SCharles.Forsyth {
9*37da2899SCharles.Forsyth 	Memlayer *l;
10*37da2899SCharles.Forsyth 
11*37da2899SCharles.Forsyth 	l = i->layer;
12*37da2899SCharles.Forsyth 	if(l->refreshfn!=nil && fn!=nil){	/* just change functions */
13*37da2899SCharles.Forsyth 		l->refreshfn = fn;
14*37da2899SCharles.Forsyth 		l->refreshptr = ptr;
15*37da2899SCharles.Forsyth 		return 1;
16*37da2899SCharles.Forsyth 	}
17*37da2899SCharles.Forsyth 
18*37da2899SCharles.Forsyth 	if(l->refreshfn == nil){	/* is using backup image; just free it */
19*37da2899SCharles.Forsyth 		freememimage(l->save);
20*37da2899SCharles.Forsyth 		l->save = nil;
21*37da2899SCharles.Forsyth 		l->refreshfn = fn;
22*37da2899SCharles.Forsyth 		l->refreshptr = ptr;
23*37da2899SCharles.Forsyth 		return 1;
24*37da2899SCharles.Forsyth 	}
25*37da2899SCharles.Forsyth 
26*37da2899SCharles.Forsyth 	l->save = allocmemimage(i->r, i->chan);
27*37da2899SCharles.Forsyth 	if(l->save == nil)
28*37da2899SCharles.Forsyth 		return 0;
29*37da2899SCharles.Forsyth 	/* easiest way is just to update the entire save area */
30*37da2899SCharles.Forsyth 	l->refreshfn(i, i->r, l->refreshptr);
31*37da2899SCharles.Forsyth 	l->refreshfn = nil;
32*37da2899SCharles.Forsyth 	l->refreshptr = nil;
33*37da2899SCharles.Forsyth 	return 1;
34*37da2899SCharles.Forsyth }
35