xref: /plan9/sys/src/cmd/unix/drawterm/libmemlayer/lsetrefresh.c (revision ec59a3ddbfceee0efe34584c2c9981a5e5ff1ec4)
18ccd4a63SDavid du Colombier #include <u.h>
28ccd4a63SDavid du Colombier #include <libc.h>
38ccd4a63SDavid du Colombier #include <draw.h>
48ccd4a63SDavid du Colombier #include <memdraw.h>
58ccd4a63SDavid du Colombier #include <memlayer.h>
67dd7cddfSDavid du Colombier 
77dd7cddfSDavid du Colombier int
memlsetrefresh(Memimage * i,Refreshfn fn,void * ptr)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;
13*ec59a3ddSDavid du Colombier 	if(l->refreshfn!=0 && fn!=0){	/* 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 
19*ec59a3ddSDavid du Colombier 	if(l->refreshfn == 0){	/* 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);
32*ec59a3ddSDavid du Colombier 	l->refreshfn = 0;
337dd7cddfSDavid du Colombier 	l->refreshptr = nil;
347dd7cddfSDavid du Colombier 	return 1;
357dd7cddfSDavid du Colombier }
36