That makes sense, all except the names. :)  Nice docs.<br><br><div class="gmail_quote">On Tue, Feb 8, 2011 at 6:33 AM, Hans-Christoph Steiner <span dir="ltr">&lt;<a href="mailto:hans@at.or.at">hans@at.or.at</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><div style="word-wrap:break-word"><div><br></div><div>t_canvas is now just a t_glist.  a t_glist is a list of objects that represents a patch, here&#39;s what I wrote about it a while back:</div>
<div><br></div><div><a href="http://wiki.puredata.info/en/glist" target="_blank">http://wiki.puredata.info/en/glist</a></div><div><br></div><div>I am pretty sure that t_pd is a generic class pointer, like a pointer to Object in Java.</div>
<div><br></div><div>.hc</div><br><div><div><div></div><div class="h5"><div>On Feb 6, 2011, at 2:15 AM, Rich E wrote:</div><br></div></div><blockquote type="cite"><div><div></div><div class="h5">Update to this: it seems that I can just use t_pd pointers to open and close the patches, although I still need to return the t_pd *x pointer from glob_evalfile().  I don&#39;t know which method is best for opening/closing, with t_canvas or t_pd..  <div>
 <br></div><div>The new methods look like this:</div><div><br></div><div><div>t_pd *glob_evalfile(t_pd *ignore, t_symbol *name, t_symbol *dir)</div><div>{</div><div>    t_pd *x = 0;</div><div>    t_pd *x_loaded = 0;</div>
 <div><br></div><div><span style="white-space:pre-wrap">        </span>/* even though binbuf_evalfile appears to take care of dspstate,</div><div><span style="white-space:pre-wrap">        </span> we have to do it again here, because canvas_startdsp() assumes</div>
 <div><span style="white-space:pre-wrap">        </span> that all toplevel canvases are visible.  LATER check if this</div><div><span style="white-space:pre-wrap">        </span> is still necessary -- probably not. */</div> <div><span style="white-space:pre-wrap">        </span></div>
<div>    int dspstate = canvas_suspend_dsp();</div><div>    binbuf_evalfile(name, dir);</div><div><span style="white-space:pre-wrap">        </span></div> <div>    while ((x != s__X.s_thing) &amp;&amp; (x = s__X.s_thing)) </div>
<div>    {</div><div><span style="white-space:pre-wrap">        </span>vmess(x, gensym(&quot;pop&quot;), &quot;i&quot;, 1);</div><div><span style="white-space:pre-wrap">        </span>x_loaded = x;</div> <div>    }</div><div>    pd_doloadbang();</div>
<div>    canvas_resume_dsp(dspstate);</div><div>    return x_loaded;</div><div>}</div></div><div><br></div><div><div>t_pd *libpd_openfile(const char *basename, const char *dirname) {</div> <div><span style="white-space:pre-wrap">        </span>t_pd *x = glob_evalfile(0, gensym(basename), gensym(dirname));</div>
<div><span style="white-space:pre-wrap">        </span></div><div><span style="white-space:pre-wrap">        </span>pd_pushsym(x);</div> <div><span style="white-space:pre-wrap">        </span>int dzero = canvas_getdollarzero();<span style="white-space:pre-wrap">        </span></div>
<div><span style="white-space:pre-wrap">        </span>pd_popsym(x);</div> <div><br></div><div><span style="white-space:pre-wrap">        </span>return x;</div><div>}</div><div><br></div><div>void libpd_closefile(t_pd *x) {</div><div><span style="white-space:pre-wrap">        </span>pd_free(x);</div>
 <div>}</div><div><br></div><div><br></div><div>I would appreciate any feedback/suggestions from you guys who know the pd API much, much more thoroughly that myself.</div><div><br></div><div>Cheers,</div><div>Rich</div><br>
 <div class="gmail_quote">On Sun, Feb 6, 2011 at 4:49 PM, Rich E <span dir="ltr">&lt;<a href="mailto:reakinator@gmail.com" target="_blank">reakinator@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
 I can&#39;t remember, are questions related to pd&#39;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.<br><br>I have been mucking around with opening and closing pd patches using API calls instead of pd&#39;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 <a href="http://www.mail-archive.com/pd-list@iem.at/msg41648.html" target="_blank">http://www.mail-archive.com/pd-list@iem.at/msg41648.html</a>).  So far, the method has been to hack glob_evalfile to look like:<br>
 <br><div><div><div>t_canvas *glob_evalfile(t_pd *ignore, t_symbol *name, t_symbol *dir)</div><div>{</div><div>    t_pd *x = 0;</div><div><span style="white-space:pre-wrap">        </span>/* even though binbuf_evalfile appears to take care of dspstate,</div>
 <div><span style="white-space:pre-wrap">        </span> we have to do it again here, because canvas_startdsp() assumes</div><div><span style="white-space:pre-wrap">        </span> that all toplevel canvases are visible.  LATER check if this</div>
 <div><span style="white-space:pre-wrap">        </span> is still necessary -- probably not. */</div><div><span style="white-space:pre-wrap">        </span></div><div>    t_canvas *x_canvas = 0; </div> <div><span style="white-space:pre-wrap">        </span></div>
<div>    int dspstate = canvas_suspend_dsp();</div><div>    binbuf_evalfile(name, dir);</div><div><span style="white-space:pre-wrap">        </span></div> <div><span style="white-space:pre-wrap">        </span>while ((x != s__X.s_thing) &amp;&amp; (x = s__X.s_thing)) </div>
<div><span style="white-space:pre-wrap">        </span>{</div><div><span style="white-space:pre-wrap">                </span>x_canvas = canvas_getcurrent();</div> <div><span style="white-space:pre-wrap">                </span>vmess(x, gensym(&quot;pop&quot;), &quot;i&quot;, 1);</div>
<div><span style="white-space:pre-wrap">        </span>}</div><div>    pd_doloadbang();</div> <div>    canvas_resume_dsp(dspstate);</div><div>    return x_canvas;</div><div>}</div></div><div><br></div><div>The only addition is that x_canvas is retrieved before x is &#39;popped&#39; off of pd&#39;s global stack, and is then returned, giving me a handle to close that particular patch with something like:</div>
 </div><div><br></div><div>canvas_menuclose(x_canvas, 0);</div><div><br></div><div>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?</div>
 <div><br></div><div>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?   </div>
 <div><br></div><div>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&#39;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.</div>
 <div><br></div><div>Cheers,<br><font color="#888888">Rich</font></div> </blockquote></div><br></div></div></div> _______________________________________________<br>Pd-dev mailing list<br><a href="mailto:Pd-dev@iem.at" target="_blank">Pd-dev@iem.at</a><br>
<a href="http://lists.puredata.info/listinfo/pd-dev" target="_blank">http://lists.puredata.info/listinfo/pd-dev</a><br></blockquote></div><br><div> <span style="font-size:12px"><br></span><span style="font-size:12px"><span style="border-collapse:separate;border-spacing:0px 0px;color:rgb(0, 0, 0);font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;line-height:normal;text-align:auto;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><div>
<br></div><div>----------------------------------------------------------------------------</div><div><br></div><div>The arc of history bends towards justice.     - Dr. Martin Luther King, Jr.</div><br></span></span> </div>
<br></div></blockquote></div><br>