[PD-dev] difference between t_canvas and t_pd
Rich E
reakinator at gmail.com
Sun Feb 6 06:49:38 CET 2011
I can't remember, are questions related to pd's C API appropriate for
pd-list, or are they better asked here? It seems that everyone who responds
to those questions is on this list just as much, anyway.
I have been mucking around with opening and closing pd patches using API
calls instead of pd's messaging system. The reason for this is that I would
like to be able to manage (open/close) multiple instances of a patch, and be
able to send each copy of the patch a unique message via its $0 argument
(see http://www.mail-archive.com/pd-list@iem.at/msg41648.html). So far, the
method has been to hack glob_evalfile to look like:
t_canvas *glob_evalfile(t_pd *ignore, t_symbol *name, t_symbol *dir)
{
t_pd *x = 0;
/* even though binbuf_evalfile appears to take care of dspstate,
we have to do it again here, because canvas_startdsp() assumes
that all toplevel canvases are visible. LATER check if this
is still necessary -- probably not. */
t_canvas *x_canvas = 0;
int dspstate = canvas_suspend_dsp();
binbuf_evalfile(name, dir);
while ((x != s__X.s_thing) && (x = s__X.s_thing))
{
x_canvas = canvas_getcurrent();
vmess(x, gensym("pop"), "i", 1);
}
pd_doloadbang();
canvas_resume_dsp(dspstate);
return x_canvas;
}
The only addition is that x_canvas is retrieved before x is 'popped' off of
pd's global stack, and is then returned, giving me a handle to close that
particular patch with something like:
canvas_menuclose(x_canvas, 0);
But I realize that in global_evalfile, t_pd and x_canvas point to the same
address space. This leads me to ask, what is the difference between these
two pointers? Is t_canvas a t_pd along with variables for its graphical
nature?
Mathieu also pointed to me (as I was using the first set of these) that
canvas_setcurrent() and canvas_unsetcurrent() are aliases of pd_pushsym()
and pd_popsym(). Is there a good reason to use one over the other?
Last question: Does anyone see a way that I could get the value of x in
glob_evalfile above without changing the function? I don't think it is a
dangerous change (and it looks like I could just hand x.gl_pd to
canvas_menuclose, thereby not really needing a t_canvas pointer), but I
would of course prefer to not change the API if possible.
Cheers,
Rich
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.puredata.info/pipermail/pd-dev/attachments/20110206/e33eb230/attachment.htm>
More information about the Pd-dev
mailing list