xref: /plan9/sys/src/libmemlayer/lsetrefresh.c (revision 7dd7cddf99dd7472612f1413b4da293630e6b1bc)
1*7dd7cddfSDavid du Colombier #include <u.h>
2*7dd7cddfSDavid du Colombier #include <libc.h>
3*7dd7cddfSDavid du Colombier #include <draw.h>
4*7dd7cddfSDavid du Colombier #include <memdraw.h>
5*7dd7cddfSDavid du Colombier #include <memlayer.h>
6*7dd7cddfSDavid du Colombier 
7*7dd7cddfSDavid du Colombier int
memlsetrefresh(Memimage * i,Refreshfn fn,void * ptr)8*7dd7cddfSDavid du Colombier memlsetrefresh(Memimage *i, Refreshfn fn, void *ptr)
9*7dd7cddfSDavid du Colombier {
10*7dd7cddfSDavid du Colombier 	Memlayer *l;
11*7dd7cddfSDavid du Colombier 
12*7dd7cddfSDavid du Colombier 	l = i->layer;
13*7dd7cddfSDavid du Colombier 	if(l->refreshfn!=nil && fn!=nil){	/* just change functions */
14*7dd7cddfSDavid du Colombier 		l->refreshfn = fn;
15*7dd7cddfSDavid du Colombier 		l->refreshptr = ptr;
16*7dd7cddfSDavid du Colombier 		return 1;
17*7dd7cddfSDavid du Colombier 	}
18*7dd7cddfSDavid du Colombier 
19*7dd7cddfSDavid du Colombier 	if(l->refreshfn == nil){	/* is using backup image; just free it */
20*7dd7cddfSDavid du Colombier 		freememimage(l->save);
21*7dd7cddfSDavid du Colombier 		l->save = nil;
22*7dd7cddfSDavid du Colombier 		l->refreshfn = fn;
23*7dd7cddfSDavid du Colombier 		l->refreshptr = ptr;
24*7dd7cddfSDavid du Colombier 		return 1;
25*7dd7cddfSDavid du Colombier 	}
26*7dd7cddfSDavid du Colombier 
27*7dd7cddfSDavid du Colombier 	l->save = allocmemimage(i->r, i->chan);
28*7dd7cddfSDavid du Colombier 	if(l->save == nil)
29*7dd7cddfSDavid du Colombier 		return 0;
30*7dd7cddfSDavid du Colombier 	/* easiest way is just to update the entire save area */
31*7dd7cddfSDavid du Colombier 	l->refreshfn(i, i->r, l->refreshptr);
32*7dd7cddfSDavid du Colombier 	l->refreshfn = nil;
33*7dd7cddfSDavid du Colombier 	l->refreshptr = nil;
34*7dd7cddfSDavid du Colombier 	return 1;
35*7dd7cddfSDavid du Colombier }
36