From 1bf4d7a1b6b170eef35ce6a9113cc8348be77f76 Mon Sep 17 00:00:00 2001
From: Ivica Ico Bukvic <ico@vt.edu>
Date: Sun, 24 Nov 2013 21:42:13 -0500
Subject: [PATCH] added forward mess patch by Jonathan Wilkes that enhances
 in-patch interaction (think: prancing ponies patch demo)

---
 pd/src/g_canvas.c | 25 +++++++++++++++++++++++++
 1 file changed, 25 insertions(+)

diff --git a/pd/src/g_canvas.c b/pd/src/g_canvas.c
index 6152c5f19..3f56a7f4f 100644
--- a/pd/src/g_canvas.c
+++ b/pd/src/g_canvas.c
@@ -1280,6 +1280,29 @@ static void canvas_rename_method(t_canvas *x, t_symbol *s, int ac, t_atom *av)
     else canvas_rename(x, gensym("Pd"), 0);
 }
 
+static int forwardmess_recurse = 0;
+
+static void canvas_forwardmess(t_canvas *x, t_symbol *s, int ac, t_atom *av)
+{
+    if (av[0].a_type != A_FLOAT)
+    {
+        pd_error(x, "error: canvas: forwardmess: need object index");
+        return;
+    }
+    t_int indexno = (t_int)atom_getfloatarg(0, ac--, av++);
+    if (indexno < 0) indexno = 0;
+    t_gobj *y;
+    t_int i;
+    for (i = 0, y = x->gl_list; y && i < indexno; i++)
+        y = y->g_next;
+    if (!y) return;
+    if (forwardmess_recurse++ < 1)
+        pd_forwardmess((t_pd *)y, ac, av);
+    else
+        pd_error(y, "error: canvas: forwardmess can't be in a recursive loop");
+    forwardmess_recurse = 0;
+}
+
 /* ------------------ table ---------------------------*/
 
 static int tabcount = 0;
@@ -2150,6 +2173,8 @@ void g_canvas_setup(void)
     class_addmethod(canvas_class, (t_method)canvas_dsp, gensym("dsp"), 0);
     class_addmethod(canvas_class, (t_method)canvas_rename_method,
         gensym("rename"), A_GIMME, 0);
+    class_addmethod(canvas_class, (t_method)canvas_forwardmess,
+        gensym("forwardmess"), A_GIMME, 0);
 
 /*---------------------------- tables -- GG ------------------- */
 
-- 
GitLab