xref: /plan9/sys/src/cmd/unix/drawterm/libmemlayer/lsetrefresh.c (revision 8ccd4a6360d974db7bd7bbd4f37e7018419ea908)
1*8ccd4a63SDavid du Colombier #include <u.h>
2*8ccd4a63SDavid du Colombier #include <libc.h>
3*8ccd4a63SDavid du Colombier #include <draw.h>
4*8ccd4a63SDavid du Colombier #include <memdraw.h>
5*8ccd4a63SDavid du Colombier #include <memlayer.h>
67dd7cddfSDavid du Colombier 
77dd7cddfSDavid du Colombier int
87dd7cddfSDavid du Colombier memlsetrefresh(Memimage *i, Refreshfn fn, void *ptr)
97dd7cddfSDavid du Colombier {
107dd7cddfSDavid du Colombier 	Memlayer *l;
117dd7cddfSDavid du Colombier 
127dd7cddfSDavid du Colombier 	l = i->layer;
137dd7cddfSDavid du Colombier 	if(l->refreshfn!=nil && fn!=nil){	/* just change functions */
147dd7cddfSDavid du Colombier 		l->refreshfn = fn;
157dd7cddfSDavid du Colombier 		l->refreshptr = ptr;
167dd7cddfSDavid du Colombier 		return 1;
177dd7cddfSDavid du Colombier 	}
187dd7cddfSDavid du Colombier 
197dd7cddfSDavid du Colombier 	if(l->refreshfn == nil){	/* is using backup image; just free it */
207dd7cddfSDavid du Colombier 		freememimage(l->save);
217dd7cddfSDavid du Colombier 		l->save = nil;
227dd7cddfSDavid du Colombier 		l->refreshfn = fn;
237dd7cddfSDavid du Colombier 		l->refreshptr = ptr;
247dd7cddfSDavid du Colombier 		return 1;
257dd7cddfSDavid du Colombier 	}
267dd7cddfSDavid du Colombier 
277dd7cddfSDavid du Colombier 	l->save = allocmemimage(i->r, i->chan);
287dd7cddfSDavid du Colombier 	if(l->save == nil)
297dd7cddfSDavid du Colombier 		return 0;
307dd7cddfSDavid du Colombier 	/* easiest way is just to update the entire save area */
317dd7cddfSDavid du Colombier 	l->refreshfn(i, i->r, l->refreshptr);
327dd7cddfSDavid du Colombier 	l->refreshfn = nil;
337dd7cddfSDavid du Colombier 	l->refreshptr = nil;
347dd7cddfSDavid du Colombier 	return 1;
357dd7cddfSDavid du Colombier }
36