From c28d81181498d5d9b551b3db3342f8e2b584ffb0 Mon Sep 17 00:00:00 2001
From: Jonathan Wilkes <jon.w.wilkes@gmail.com>
Date: Sun, 29 Oct 2017 21:17:54 -0400
Subject: [PATCH] add t_array pointer and index to the scalar event interface
 for the GUI

---
 pd/nw/pd_canvas.js  |   9 ++-
 pd/nw/pdgui.js      |   6 +-
 pd/src/g_canvas.h   |   4 +-
 pd/src/g_scalar.c   |  30 +++++-----
 pd/src/g_template.c | 136 ++++++++++++++++++++++----------------------
 5 files changed, 95 insertions(+), 90 deletions(-)

diff --git a/pd/nw/pd_canvas.js b/pd/nw/pd_canvas.js
index 7753dfbd7..8531298f1 100644
--- a/pd/nw/pd_canvas.js
+++ b/pd/nw/pd_canvas.js
@@ -450,7 +450,8 @@ var canvas_events = (function() {
                     ty = minv.b * dx + minv.d * dy;
                 var obj = scalar_draggables[draggable_elem.id];
                 pdgui.pdsend(obj.cid, "scalar_event", obj.scalar_sym,
-                    obj.drawcommand_sym, obj.event_name, dx, dy, tx, ty);
+                    obj.drawcommand_sym, obj.event_name, dx, dy, tx, ty,
+                    obj.array_sym, obj.index);
                 last_draggable_x = new_x;
                 last_draggable_y = new_y;
             },
@@ -963,12 +964,14 @@ var canvas_events = (function() {
             last_search_term = "";
         },
         add_scalar_draggable: function(cid, tag, scalar_sym, drawcommand_sym,
-            event_name) {
+            event_name, array_sym, index) {
             scalar_draggables[tag] = {
                 cid: cid,
                 scalar_sym: scalar_sym,
                 drawcommand_sym: drawcommand_sym,
-                event_name: event_name
+                event_name: event_name,
+                array_sym: array_sym,
+                index: index
             };
         },
         remove_scalar_draggable: function(id) {
diff --git a/pd/nw/pdgui.js b/pd/nw/pdgui.js
index 277517292..8b3f1a475 100644
--- a/pd/nw/pdgui.js
+++ b/pd/nw/pdgui.js
@@ -3345,7 +3345,7 @@ function gui_draw_coords(cid, tag, shape, points) {
 // of the bbox of the shape will still register as part of the event.
 // (Attempting to set the event more than once is ignored.)
 function gui_draw_drag_event(cid, tag, scalar_sym, drawcommand_sym,
-    event_name, state) {
+    event_name, array_sym, index, state) {
     var win = patchwin[cid].window;
     if (state === 0) {
         win.canvas_events.remove_scalar_draggable(tag);
@@ -3357,13 +3357,13 @@ function gui_draw_drag_event(cid, tag, scalar_sym, drawcommand_sym,
 
 // Events for scalars-- mouseover, mouseout, etc.
 function gui_draw_event(cid, tag, scalar_sym, drawcommand_sym, event_name,
-    state) {
+    array_sym, index, state) {
     var item = get_item(cid, tag),
         event_type = "on" + event_name;
     if (state === 1) {
         item[event_type] = function(e) {
             pdsend(cid, "scalar_event", scalar_sym, drawcommand_sym, event_name,
-                e.pageX, e.pageY);
+                e.pageX, e.pageY, array_sym, index);
         };
     } else {
         item[event_type] = null;
diff --git a/pd/src/g_canvas.h b/pd/src/g_canvas.h
index 231b84c47..b08ab48fe 100644
--- a/pd/src/g_canvas.h
+++ b/pd/src/g_canvas.h
@@ -344,7 +344,7 @@ struct _widgetbehavior
     t_deletefn w_deletefn;
     t_visfn w_visfn;
     t_clickfn w_clickfn;
-	t_displacefnwtag w_displacefnwtag;
+    t_displacefnwtag w_displacefnwtag;
 };
 
 /* -------- behaviors for scalars defined by objects in template --------- */
@@ -376,7 +376,7 @@ typedef void (*t_parentactivatefn)(t_gobj *x, struct _glist *glist,
 typedef void (*t_parentvisfn)(t_gobj *x, struct _glist *glist,
     struct _glist *parentglist, t_scalar *sc, 
     t_word *data, t_template *tmpl, t_float basex, t_float basey,
-    int flag);
+    struct _array *parentarray, int flag);
         /*  field a mouse click */
 typedef int (*t_parentclickfn)(t_gobj *x, struct _glist *glist,
     t_word *data, t_template *tmpl, t_scalar *sc, t_array *ap,
diff --git a/pd/src/g_scalar.c b/pd/src/g_scalar.c
index 897e709ea..f45cbee94 100644
--- a/pd/src/g_scalar.c
+++ b/pd/src/g_scalar.c
@@ -777,10 +777,11 @@ extern void svg_parentwidgettogui(t_gobj *z, t_scalar *sc, t_glist *owner,
     t_word *data, t_template *template);
 
 extern void svg_register_events(t_gobj *z, t_canvas *c, t_scalar *sc,
-    t_template *template, t_word *data);
+    t_template *template, t_word *data, t_array *parentarray);
 
 static void scalar_group_configure(t_scalar *x, t_glist *owner,
-    t_template *template, t_word *data, t_glist *gl, t_glist *parent)
+    t_template *template, t_word *data, t_glist *gl, t_glist *parent,
+    t_array *parentarray)
 {
     t_gobj *y;
     char tagbuf[MAXPDSTRING];
@@ -796,20 +797,21 @@ static void scalar_group_configure(t_scalar *x, t_glist *owner,
         glist_getcanvas(owner), tagbuf);
     svg_grouptogui(gl, template, data);
     gui_end_vmess();
-    svg_register_events((t_gobj *)gl, owner, x, template, data);
+    svg_register_events((t_gobj *)gl, owner, x, template, data, parentarray);
     for (y = gl->gl_list; y; y = y->g_next)
     {
         if (pd_class(&y->g_pd) == canvas_class &&
             ((t_glist *)y)->gl_svg)
         {
-            scalar_group_configure(x, owner, template, data, (t_glist *)y, gl);
+            scalar_group_configure(x, owner, template, data, (t_glist *)y, gl,
+                0);
         }
         t_parentwidgetbehavior *wb = pd_getparentwidget(&y->g_pd);
         if (!wb) continue;
         //(*wb->w_parentvisfn)(y, owner, gl, x, data, template,
-        //   0, 0, vis);
+        //   0, 0, 0, vis);
         svg_parentwidgettogui(y, x, owner, data, template);
-        svg_register_events(y, owner, x, template, data);
+        svg_register_events(y, owner, x, template, data, parentarray);
     }
 }
 
@@ -853,14 +855,14 @@ void scalar_doconfigure(t_gobj *xgobj, t_glist *owner)
                     ((t_glist *)y)->gl_svg)
                 {
                     scalar_group_configure(x, owner, template, x->sc_vec,
-                        (t_glist *)y, templatecanvas);
+                        (t_glist *)y, templatecanvas, 0);
                 }
                 continue;
             }
             //(*wb->w_parentvisfn)(y, owner, 0, x, x->sc_vec, template,
-            //    basex, basey, vis);
+            //    basex, basey, 0, vis);
             svg_parentwidgettogui(y, x, owner, x->sc_vec, template);
-            svg_register_events(y, owner, x, template, x->sc_vec);
+            svg_register_events(y, owner, x, template, x->sc_vec, 0);
         }
         if (glist_isselected(owner, &x->sc_gobj))
         {
@@ -909,12 +911,12 @@ void array_configure(t_scalar *x, t_glist *owner, t_array *a, t_word *data)
                 ((t_glist *)y)->gl_svg)
             {
                 scalar_group_configure(x, owner, template, data,
-                    (t_glist *)y, elemtemplatecanvas);
+                    (t_glist *)y, elemtemplatecanvas, a);
             }
             continue;
         }
         svg_parentwidgettogui(y, x, owner, data, elemtemplate);
-        svg_register_events(y, owner, x, elemtemplate, data);
+        svg_register_events(y, owner, x, elemtemplate, data, a);
     }
 
 }
@@ -938,7 +940,7 @@ static void scalar_groupvis(t_scalar *x, t_glist *owner, t_template *template,
         gui_end_vmess();
 
         /* register events */
-        svg_register_events((t_gobj *)gl, owner, x, template, x->sc_vec);
+        svg_register_events((t_gobj *)gl, owner, x, template, x->sc_vec, 0);
     }
     for (y = gl->gl_list; y; y = y->g_next)
     {
@@ -950,7 +952,7 @@ static void scalar_groupvis(t_scalar *x, t_glist *owner, t_template *template,
         t_parentwidgetbehavior *wb = pd_getparentwidget(&y->g_pd);
         if (!wb) continue;
         (*wb->w_parentvisfn)(y, owner, gl, x, x->sc_vec, template,
-            0, 0, vis);
+            0, 0, 0, vis);
     }
 }
 
@@ -1076,7 +1078,7 @@ static void scalar_vis(t_gobj *z, t_glist *owner, int vis)
             continue;
         }
         (*wb->w_parentvisfn)(y, owner, 0, x, x->sc_vec, template,
-            basex, basey, vis);
+            basex, basey, 0, vis);
     }
     if (!vis)
     {
diff --git a/pd/src/g_template.c b/pd/src/g_template.c
index 97cba00f3..b300d0c4e 100644
--- a/pd/src/g_template.c
+++ b/pd/src/g_template.c
@@ -1736,14 +1736,14 @@ extern void scalar_drawselectrect(t_scalar *x, t_glist *glist, int state);
 
 void svg_sendupdate(t_svg *x, t_canvas *c, t_symbol *s,
     t_template *template, t_word *data, int *predraw_bbox, void *parent,
-    t_scalar *sc)
+    t_scalar *sc, t_array *array)
 {
    /* todo-- I'm mixing "c" with glist_getcanvas(c) too freely...
       need to experiment with gop scalars to make sure I'm not breaking
       anything */ 
-    int in_array = (sc->sc_vec != data);
-    //post("in_array is %d", in_array);
     char tag[MAXPDSTRING];
+    int index = (array ?
+        ((((char *)data) - array->a_vec) / array->a_elemsize) : -1);
     if (x->x_type == gensym("g") || x->x_type == gensym("svg"))
     {
         sprintf(tag, "dgroup%lx.%lx",
@@ -1846,57 +1846,57 @@ void svg_sendupdate(t_svg *x, t_canvas *c, t_symbol *s,
     }
     else if (s == gensym("mouseover"))
     {
-        gui_vmess("gui_draw_event", "xsxxsi",
-            glist_getcanvas(c), tag, sc, x, "mouseover",
+        gui_vmess("gui_draw_event", "xsxxsxii",
+            glist_getcanvas(c), tag, sc, x, "mouseover", array, index,
             (int)fielddesc_getcoord(
                 &x->x_events.e_mouseover.a_attr, template, data, 0));
     }
     else if (s == gensym("mouseout"))
     {
-        gui_vmess("gui_draw_event", "xsxxsi",
-            glist_getcanvas(c), tag, sc, x, "mouseout",
+        gui_vmess("gui_draw_event", "xsxxsxii",
+            glist_getcanvas(c), tag, sc, x, "mouseout", array, index,
             (int)fielddesc_getcoord(
                 &x->x_events.e_mouseout.a_attr, template, data, 0));
     }
     else if (s == gensym("mousemove"))
     {
-        gui_vmess("gui_draw_event", "xsxxsi",
-            glist_getcanvas(c), tag, sc, x, "mousemove",
+        gui_vmess("gui_draw_event", "xsxxsxii",
+            glist_getcanvas(c), tag, sc, x, "mousemove", array, index,
             (int)fielddesc_getcoord(
                 &x->x_events.e_mousemove.a_attr, template, data, 0));
     }
     else if (s == gensym("mouseup"))
     {
-        gui_vmess("gui_draw_event", "xsxxsi",
-            glist_getcanvas(c), tag, sc, x, "mouseup",
+        gui_vmess("gui_draw_event", "xsxxsxii",
+            glist_getcanvas(c), tag, sc, x, "mouseup", array, index,
             (int)fielddesc_getcoord(
                 &x->x_events.e_mouseup.a_attr, template, data, 0));
     }
     else if (s == gensym("mousedown"))
     {
-        gui_vmess("gui_draw_event", "xsxxsi",
-            glist_getcanvas(c), tag, sc, x, "mousedown",
+        gui_vmess("gui_draw_event", "xsxxsxii",
+            glist_getcanvas(c), tag, sc, x, "mousedown", array, index,
             (int)fielddesc_getcoord(
                 &x->x_events.e_mousedown.a_attr, template, data, 0));
     }
     else if (s == gensym("mouseenter"))
     {
-        gui_vmess("gui_draw_event", "xsxxsi",
-            glist_getcanvas(c), tag, sc, x, "mouseenter",
+        gui_vmess("gui_draw_event", "xsxxsxii",
+            glist_getcanvas(c), tag, sc, x, "mouseenter", array, index,
             (int)fielddesc_getcoord(
                 &x->x_events.e_mouseenter.a_attr, template, data, 0));
     }
     else if (s == gensym("mouseleave"))
     {
-        gui_vmess("gui_draw_event", "xsxxsi",
-            glist_getcanvas(c), tag, sc, x, "mouseleave",
+        gui_vmess("gui_draw_event", "xsxxsxii",
+            glist_getcanvas(c), tag, sc, x, "mouseleave", array, index,
             (int)fielddesc_getcoord(
                 &x->x_events.e_mouseleave.a_attr, template, data, 0));
     }
     else if (s == gensym("drag"))
     {
-        gui_vmess("gui_draw_drag_event", "xsxxsi",
-            glist_getcanvas(c), tag, sc, x, "drag",
+        gui_vmess("gui_draw_drag_event", "xsxxsxii",
+            glist_getcanvas(c), tag, sc, x, "drag", array, index,
             (int)fielddesc_getcoord(
                 &x->x_events.e_drag.a_attr, template, data, 0));
     }
@@ -2058,7 +2058,7 @@ void svg_updatevec(t_canvas *c, t_word *data, t_template *template,
                 {
                     svg_sendupdate(x, glist_getcanvas(c), s,
                         elemtemplate, (t_word *)(elem + elemsize * j),
-                        predraw_bbox, parent, sc);
+                        predraw_bbox, parent, sc, array);
                 }
             }
             svg_updatevec(c, (t_word *)elem, elemtemplate, target, parent,
@@ -2096,7 +2096,7 @@ void svg_doupdate(t_svg *x, t_canvas *c, t_symbol *s)
             if (parenttemplate == template)
             { 
                 svg_sendupdate(x, visible, s, template,
-                    data, &redraw_bbox, parent, (t_scalar *)g);
+                    data, &redraw_bbox, parent, (t_scalar *)g, 0);
             }
             else
             {
@@ -2136,9 +2136,10 @@ void svg_update(t_svg *x, t_symbol *s)
 
 /* not sure if this will work with array elements */
 void svg_register_events(t_gobj *z, t_canvas *c, t_scalar *sc,
-    t_template *template, t_word *data)
+    t_template *template, t_word *data, t_array *a)
 {
     t_svg *svg;
+    int index = (a ? ((((char *)data) - a->a_vec) / a->a_elemsize) : -1);
     char tagbuf[MAXPDSTRING];
     if (pd_class(&z->g_pd) == canvas_class)
     {
@@ -2164,45 +2165,43 @@ void svg_register_events(t_gobj *z, t_canvas *c, t_scalar *sc,
         return;
     }
     if (svg->x_events.e_mouseover.a_flag)
-        gui_vmess("gui_draw_event", "xsxxsi",
-            glist_getcanvas(c), tagbuf, sc, svg, "mouseover",
+        gui_vmess("gui_draw_event", "xsxxsxii",
+            glist_getcanvas(c), tagbuf, sc, svg, "mouseover", a, index,
             (int)fielddesc_getcoord(&svg->x_events.e_mouseover.a_attr, template,
             data, 1));
     if (svg->x_events.e_mouseout.a_flag)
-        gui_vmess("gui_draw_event", "xsxxsi",
-            glist_getcanvas(c), tagbuf, sc, svg, "mouseout",
+        gui_vmess("gui_draw_event", "xsxxsxii",
+            glist_getcanvas(c), tagbuf, sc, svg, "mouseout", a, index,
             (int)fielddesc_getcoord(&svg->x_events.e_mouseout.a_attr, template,
             data, 1));
     if (svg->x_events.e_mousemove.a_flag)
-        gui_vmess("gui_draw_event", "xsxxsi",
-            glist_getcanvas(c), tagbuf, sc, svg, "mousemove",
+        gui_vmess("gui_draw_event", "xsxxsxii",
+            glist_getcanvas(c), tagbuf, sc, svg, "mousemove", a, index,
             (int)fielddesc_getcoord(&svg->x_events.e_mousemove.a_attr, template,
             data, 1));
     if (svg->x_events.e_mousedown.a_flag)
-        gui_vmess("gui_draw_event", "xsxxsi",
-            glist_getcanvas(c), tagbuf, sc, svg, "mousedown",
+        gui_vmess("gui_draw_event", "xsxxsxii",
+            glist_getcanvas(c), tagbuf, sc, svg, "mousedown", a, index,
             (int)fielddesc_getcoord(&svg->x_events.e_mousedown.a_attr, template,
             data, 1));
     if (svg->x_events.e_mouseup.a_flag)
-        gui_vmess("gui_draw_event", "xsxxsi",
-            glist_getcanvas(c), tagbuf, sc, svg, "mouseup",
+        gui_vmess("gui_draw_event", "xsxxsxii",
+            glist_getcanvas(c), tagbuf, sc, svg, "mouseup", a, index,
             (int)fielddesc_getcoord(&svg->x_events.e_mouseup.a_attr, template,
             data, 1));
-
-
     if (svg->x_events.e_mouseenter.a_flag)
-        gui_vmess("gui_draw_event", "xsxxsi",
-            glist_getcanvas(c), tagbuf, sc, svg, "mouseenter",
-            (int)fielddesc_getcoord(&svg->x_events.e_mouseenter.a_attr, template,
-            data, 1));
+        gui_vmess("gui_draw_event", "xsxxsxii",
+            glist_getcanvas(c), tagbuf, sc, svg, "mouseenter", a, index,
+            (int)fielddesc_getcoord(&svg->x_events.e_mouseenter.a_attr,
+            template, data, 1));
     if (svg->x_events.e_mouseleave.a_flag)
-        gui_vmess("gui_draw_event", "xsxxsi",
-            glist_getcanvas(c), tagbuf, sc, svg, "mouseleave",
-            (int)fielddesc_getcoord(&svg->x_events.e_mouseleave.a_attr, template,
-            data, 1));
+        gui_vmess("gui_draw_event", "xsxxsxii",
+            glist_getcanvas(c), tagbuf, sc, svg, "mouseleave", a, index,
+            (int)fielddesc_getcoord(&svg->x_events.e_mouseleave.a_attr,
+            template, data, 1));
     if (svg->x_events.e_drag.a_flag)
-        gui_vmess("gui_draw_drag_event", "xsxxsi",
-            glist_getcanvas(c), tagbuf, sc, svg, "drag",
+        gui_vmess("gui_draw_drag_event", "xsxxsxii",
+            glist_getcanvas(c), tagbuf, sc, svg, "drag", a, index,
             (int)fielddesc_getcoord(&svg->x_events.e_drag.a_attr, template,
             data, 1));
 }
@@ -4145,7 +4144,7 @@ void svg_grouptogui(t_glist *g, t_template *template, t_word *data)
 
 static void draw_vis(t_gobj *z, t_glist *glist, t_glist *parentglist,
     t_scalar *sc, t_word *data, t_template *template,
-    t_float basex, t_float basey, int vis)
+    t_float basex, t_float basey, t_array *parentarray, int vis)
 {
     t_draw *x = (t_draw *)z;
     t_svg *sa = (t_svg *)x->x_attr;
@@ -4228,7 +4227,7 @@ static void draw_vis(t_gobj *z, t_glist *glist, t_glist *parentglist,
         }
 
         /* register events */
-        svg_register_events(z, glist, sc, template, data);
+        svg_register_events(z, glist, sc, template, data, parentarray);
     }
     else
     {
@@ -5094,7 +5093,7 @@ static void numbertocolor(int n, char *s)
 
 static void curve_vis(t_gobj *z, t_glist *glist, t_glist *parentglist,
     t_scalar *sc, t_word *data, t_template *template,
-    t_float basex, t_float basey, int vis)
+    t_float basex, t_float basey, t_array *parentarray, int vis)
 {
     t_curve *x = (t_curve *)z;
     int i, n = x->x_npoints;
@@ -5870,7 +5869,8 @@ static void plot_activate(t_gobj *z, t_glist *glist,
 
 static void plot_groupvis(t_scalar *x, t_glist *owner, t_word *data,
     t_template *template,
-    t_glist *groupcanvas, t_glist *parent, t_float basex, t_float basey)
+    t_glist *groupcanvas, t_glist *parent, t_float basex, t_float basey,
+    t_array *parentarray)
 {
     t_gobj *y;
     char tagbuf[MAXPDSTRING], parent_tagbuf[MAXPDSTRING];
@@ -5891,12 +5891,12 @@ static void plot_groupvis(t_scalar *x, t_glist *owner, t_word *data,
             ((t_glist *)y)->gl_svg)
         {
             plot_groupvis(x, owner, data, template, (t_glist *)y, groupcanvas,
-                basex, basey);
+                basex, basey, parentarray);
         }
         t_parentwidgetbehavior *wb = pd_getparentwidget(&y->g_pd);
         if (!wb) continue;
         (*wb->w_parentvisfn)(y, owner, groupcanvas, x, data, template,
-            basex, basey, 1);
+            basex, basey, parentarray, 1);
     }
 }
 
@@ -5916,7 +5916,7 @@ int plot_has_drawcommand(t_canvas *elemtemplatecanvas)
 
 static void plot_vis(t_gobj *z, t_glist *glist, t_glist *parentglist,
     t_scalar *sc, t_word *data, t_template *template,
-    t_float basex, t_float basey, int tovis)
+    t_float basex, t_float basey, t_array *parentarray, int tovis)
 {
     t_plot *x = (t_plot *)z;
     int elemsize, yonset, wonset, xonset, i;
@@ -5970,7 +5970,6 @@ static void plot_vis(t_gobj *z, t_glist *glist, t_glist *parentglist,
         if (symoutline == &s_) symoutline = gensym("#000000");
         if (symfill == &s_) symfill = gensym("#000000");
 
-
         t_float xscale = glist_xtopixels(glist, 1) - glist_xtopixels(glist, 0);
         t_float yscale = glist_ytopixels(glist, 1) - glist_ytopixels(glist, 0);
         t_float x_inverse = 1 / xscale;
@@ -6371,13 +6370,13 @@ static void plot_vis(t_gobj *z, t_glist *glist, t_glist *parentglist,
                         plot_groupvis(sc, glist,
                             (t_word *)(elem + elemsize * i),
                         template, (t_glist *)y, 
-                            elemtemplatecanvas, usexloc, useyloc);
+                            elemtemplatecanvas, usexloc, useyloc, array);
                     }
                     t_parentwidgetbehavior *wb = pd_getparentwidget(&y->g_pd);
                     if (!wb) continue;
                     (*wb->w_parentvisfn)(y, glist, elemtemplatecanvas, sc,
                         (t_word *)(elem + elemsize * i),
-                            elemtemplate, usexloc, useyloc, tovis);
+                            elemtemplate, usexloc, useyloc, array, tovis);
                 }
             }
         }
@@ -6417,7 +6416,7 @@ static void plot_vis(t_gobj *z, t_glist *glist, t_glist *parentglist,
                     if (!wb) continue;
                     (*wb->w_parentvisfn)(y, glist, elemtemplatecanvas, sc,
                         (t_word *)(elem + elemsize * i), elemtemplate,
-                            0, 0, 0);
+                            0, 0, parentarray, 0);
                 }
             }
         }
@@ -6726,7 +6725,8 @@ static void drawarray_activate(t_gobj *z, t_glist *glist,
 
 static void drawarray_groupvis(t_scalar *x, t_glist *owner, t_word *data,
     t_template *template,
-    t_glist *groupcanvas, t_glist *parent, t_float basex, t_float basey)
+    t_glist *groupcanvas, t_glist *parent, t_float basex, t_float basey,
+    t_array *parentarray)
 {
     t_gobj *y;
     char tagbuf[MAXPDSTRING], parent_tagbuf[MAXPDSTRING];
@@ -6747,12 +6747,12 @@ static void drawarray_groupvis(t_scalar *x, t_glist *owner, t_word *data,
             ((t_glist *)y)->gl_svg)
         {
             drawarray_groupvis(x, owner, data, template, (t_glist *)y,
-                groupcanvas, basex, basey);
+                groupcanvas, basex, basey, parentarray);
         }
         t_parentwidgetbehavior *wb = pd_getparentwidget(&y->g_pd);
         if (!wb) continue;
         (*wb->w_parentvisfn)(y, owner, groupcanvas, x, data, template,
-            basex, basey, 1);
+            basex, basey, parentarray, 1);
     }
 }
 
@@ -6773,7 +6773,7 @@ int drawarray_has_drawcommand(t_canvas *elemtemplatecanvas)
 
 static void drawarray_vis(t_gobj *z, t_glist *glist, t_glist *parentglist,
     t_scalar *sc, t_word *data, t_template *template,
-    t_float basex, t_float basey, int tovis)
+    t_float basex, t_float basey, t_array *parentarray, int tovis)
 {
     t_drawarray *x = (t_drawarray *)z;
     int elemsize, yonset, wonset, xonset, i;
@@ -6884,13 +6884,13 @@ static void drawarray_vis(t_gobj *z, t_glist *glist, t_glist *parentglist,
                         drawarray_groupvis(sc, glist,
                             (t_word *)(elem + elemsize * i),
                         template, (t_glist *)y, 
-                            elemtemplatecanvas, usexloc, useyloc);
+                            elemtemplatecanvas, usexloc, useyloc, parentarray);
                     }
                     t_parentwidgetbehavior *wb = pd_getparentwidget(&y->g_pd);
                     if (!wb) continue;
                     (*wb->w_parentvisfn)(y, glist, elemtemplatecanvas, sc,
                         (t_word *)(elem + elemsize * i),
-                            elemtemplate, usexloc, useyloc, tovis);
+                            elemtemplate, usexloc, useyloc, parentarray, tovis);
                 }
             }
         }
@@ -6918,7 +6918,7 @@ static void drawarray_vis(t_gobj *z, t_glist *glist, t_glist *parentglist,
                 if (!wb) continue;
                 (*wb->w_parentvisfn)(y, glist, elemtemplatecanvas, sc,
                     (t_word *)(elem + elemsize * i), elemtemplate,
-                        0, 0, 0);
+                        0, 0, parentarray, 0);
             }
         }
         /* Now remove our drawarray svg container */
@@ -7240,7 +7240,7 @@ static void drawnumber_activate(t_gobj *z, t_glist *glist,
 
 static void drawnumber_vis(t_gobj *z, t_glist *glist, t_glist *parentglist,
     t_scalar *sc, t_word *data, t_template *template,
-    t_float basex, t_float basey, int vis)
+    t_float basex, t_float basey, t_array *parentarray, int vis)
 {
     //fprintf(stderr,"drawnumber_vis %d\n", vis);
     t_drawnumber *x = (t_drawnumber *)z;
@@ -7726,7 +7726,7 @@ static void drawsymbol_activate(t_gobj *z, t_glist *glist,
 
 static void drawsymbol_vis(t_gobj *z, t_glist *glist, t_glist *parentglist,
     t_scalar *sc, t_word *data, t_template *template,
-    t_float basex, t_float basey, int vis)
+    t_float basex, t_float basey, t_array *parentarray, int vis)
 {
     t_drawsymbol *x = (t_drawsymbol *)z;
 
@@ -8233,7 +8233,7 @@ static void drawimage_activate(t_gobj *z, t_glist *glist,
 
 static void drawimage_vis(t_gobj *z, t_glist *glist, t_glist *parentglist,
     t_scalar *sc, t_word *data, t_template *template,
-    t_float basex, t_float basey, int vis)
+    t_float basex, t_float basey, t_array *parentarray, int vis)
 {
     t_drawimage *x = (t_drawimage *)z;
     t_svg *svg = (t_svg *)x->x_attr;
@@ -8607,12 +8607,12 @@ void svg_parentwidgettogui(t_gobj *z, t_scalar *sc, t_glist *owner,
            changing attributes instead of creating a new one.
            Not sure what to do with arrays yet-- we'll probably
            need a parentglist below instead of a "0" */
-        curve_vis(z, owner, 0, sc, data, template, 0, 0, -1);
+        curve_vis(z, owner, 0, sc, data, template, 0, 0, 0, -1);
     }
     else if (pd_class(&z->g_pd) == drawnumber_class)
-        drawnumber_vis(z, owner, 0, sc, data, template, 0, 0, -1);
+        drawnumber_vis(z, owner, 0, sc, data, template, 0, 0, 0, -1);
     else if (pd_class(&z->g_pd) == drawsymbol_class)
-        drawsymbol_vis(z, owner, 0, sc, data, template, 0, 0, -1);
+        drawsymbol_vis(z, owner, 0, sc, data, template, 0, 0, 0, -1);
 }
 
 /* ---------------------- setup function ---------------------------- */
-- 
GitLab