[PD-cvs] SF.net SVN: pure-data:[10192] trunk/externals/iem/iemguts/src

zmoelnig at users.sourceforge.net zmoelnig at users.sourceforge.net
Mon Jul 21 23:43:36 CEST 2008


Revision: 10192
          http://pure-data.svn.sourceforge.net/pure-data/?rev=10192&view=rev
Author:   zmoelnig
Date:     2008-07-21 21:43:36 +0000 (Mon, 21 Jul 2008)

Log Message:
-----------
new guts

Added Paths:
-----------
    trunk/externals/iem/iemguts/src/canvasconnection.c
    trunk/externals/iem/iemguts/src/sendcanvas.c

Added: trunk/externals/iem/iemguts/src/canvasconnection.c
===================================================================
--- trunk/externals/iem/iemguts/src/canvasconnection.c	                        (rev 0)
+++ trunk/externals/iem/iemguts/src/canvasconnection.c	2008-07-21 21:43:36 UTC (rev 10192)
@@ -0,0 +1,127 @@
+
+/******************************************************
+ *
+ * canvasconnection - implementation file
+ *
+ * copyleft (c) IOhannes m zm\xF6lnig
+ *
+ *   2007:forum::f\xFCr::uml\xE4ute:2007
+ *
+ *   institute of electronic music and acoustics (iem)
+ *
+ ******************************************************
+ *
+ * license: GNU General Public License v.2
+ *
+ ******************************************************/
+
+
+/* 
+ * this object provides a way to send messages to upstream canvases
+ * by default it sends messages to the containing canvas, but you can give the
+ * "depth" as argument;
+ * e.g. [canvasconnection 1] will send messages to the parent of the containing canvas
+ */
+
+#include "m_pd.h"
+#include "g_canvas.h"
+#include "m_imp.h"
+
+int glist_getindex(t_glist *x, t_gobj *y);
+
+/* ------------------------- canvasconnection ---------------------------- */
+
+static t_class *canvasconnection_class;
+
+typedef struct _canvasconnection
+{
+  t_object  x_obj;
+  t_canvas  *x_parent;
+  t_object  *x_object;
+  t_outlet  *x_out;
+} t_canvasconnection;
+
+static void canvasconnection_outlets(t_canvasconnection *x)
+{
+  int noutlets=0;
+  int nout=0;
+  t_atom at;
+
+  if(0==x->x_object || 0==x->x_parent)
+    return;
+
+  noutlets=obj_noutlets(x->x_object);
+  SETFLOAT(&at, (t_float)noutlets);
+
+  outlet_anything(x->x_out, gensym("outlets"), 1, &at);
+  for(nout=0; nout<noutlets; nout++) {
+    t_outlet*out=0;
+    t_outconnect*conn=obj_starttraverseoutlet(x->x_object, &out, nout);
+    t_object*dest=0;
+    t_inlet*in=0;
+    int which=0;
+    int count=0, i=0;
+    t_atom*abuf=0;
+    while(conn) {
+      conn=obj_nexttraverseoutlet(conn, &dest, &in, &which);
+      count++;
+    }
+    abuf=(t_atom*)getbytes(sizeof(t_atom)*(count+1));
+    SETFLOAT(abuf, nout);
+    conn=obj_starttraverseoutlet(x->x_object, &out, nout);
+    while(conn) {
+      t_float connid=0;
+      conn=obj_nexttraverseoutlet(conn, &dest, &in, &which);
+      connid = glist_getindex(x->x_parent, (t_gobj*)dest);
+      SETFLOAT(abuf+1+i, connid);
+      i++;
+    }
+    outlet_anything(x->x_out, gensym("outlet"), count+1, abuf);
+    freebytes(abuf, sizeof(t_atom)*(count+1));
+  }
+}
+
+static void canvasconnection_bang(t_canvasconnection *x)
+{
+  canvasconnection_outlets(x);
+}
+
+
+static void canvasconnection_free(t_canvasconnection *x)
+{
+  x->x_object=0;
+  outlet_free(x->x_out);
+  x->x_out=0;
+}
+
+static void *canvasconnection_new(t_floatarg f)
+{
+  t_canvasconnection *x = (t_canvasconnection *)pd_new(canvasconnection_class);
+  t_glist *glist=(t_glist *)canvas_getcurrent();
+  t_canvas *canvas=(t_canvas*)glist_getcanvas(glist);
+  int depth=(int)f;
+  if(depth<0)depth=0;
+
+  x->x_parent=0;
+
+  while(depth && canvas) {
+    canvas=canvas->gl_owner;
+    depth--;
+  }
+
+  x->x_object = pd_checkobject((t_pd*)canvas);
+
+  if(canvas)
+    x->x_parent = canvas->gl_owner;
+
+  x->x_out=outlet_new(&x->x_obj, 0);
+
+  return (x);
+}
+
+void canvasconnection_setup(void)
+{
+  canvasconnection_class = class_new(gensym("canvasconnection"), (t_newmethod)canvasconnection_new,
+                               (t_method)canvasconnection_free, sizeof(t_canvasconnection), 0, A_DEFFLOAT, 0);
+  class_addbang(canvasconnection_class, (t_method)canvasconnection_bang);
+}

Added: trunk/externals/iem/iemguts/src/sendcanvas.c
===================================================================
--- trunk/externals/iem/iemguts/src/sendcanvas.c	                        (rev 0)
+++ trunk/externals/iem/iemguts/src/sendcanvas.c	2008-07-21 21:43:36 UTC (rev 10192)
@@ -0,0 +1,76 @@
+
+/******************************************************
+ *
+ * sendcanvas - implementation file
+ *
+ * copyleft (c) IOhannes m zm\xF6lnig
+ *
+ *   2007:forum::f\xFCr::uml\xE4ute:2007
+ *
+ *   institute of electronic music and acoustics (iem)
+ *
+ ******************************************************
+ *
+ * license: GNU General Public License v.2
+ *
+ ******************************************************/
+
+
+/* 
+ * this object provides a way to send messages to upstream canvases
+ * by default it sends messages to the containing canvas, but you can give the
+ * "depth" as argument;
+ * e.g. [sendcanvas 1] will send messages to the parent of the containing canvas
+ */
+
+#include "m_pd.h"
+#include "g_canvas.h"
+
+int glist_getindex(t_glist *x, t_gobj *y);
+
+/* ------------------------- sendcanvas ---------------------------- */
+
+static t_class *sendcanvas_class;
+
+typedef struct _sendcanvas
+{
+  t_object  x_obj;
+  t_pd  *x_pd;
+} t_sendcanvas;
+
+static void sendcanvas_anything(t_sendcanvas *x, t_symbol*s, int argc, t_atom*argv)
+{
+  if(0==x->x_pd)
+    return;
+
+  typedmess(x->x_pd, s, argc, argv);
+}
+
+static void sendcanvas_free(t_sendcanvas *x)
+{
+  x->x_pd=0;
+}
+
+static void *sendcanvas_new(t_floatarg f)
+{
+  t_sendcanvas *x = (t_sendcanvas *)pd_new(sendcanvas_class);
+  t_glist *glist=(t_glist *)canvas_getcurrent();
+  t_canvas *canvas=(t_canvas*)glist_getcanvas(glist);
+  int depth=(int)f;
+  if(depth<0)depth=0;
+
+  while(depth && canvas) {
+    canvas=canvas->gl_owner;
+    depth--;
+  }
+
+  x->x_pd = (t_pd*)canvas;
+  return (x);
+}
+
+void sendcanvas_setup(void)
+{
+  sendcanvas_class = class_new(gensym("sendcanvas"), (t_newmethod)sendcanvas_new,
+                               (t_method)sendcanvas_free, sizeof(t_sendcanvas), 0, A_DEFFLOAT, 0);
+  class_addanything(sendcanvas_class, (t_method)sendcanvas_anything);
+}


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Pd-cvs mailing list