diff --git a/pd/src/g_traversal.c b/pd/src/g_traversal.c index 1d6d283969a6e1241ba69557ff65aa0c097b6f30..369a16eb28632a534f17b58bcae980c289c2ad42 100644 --- a/pd/src/g_traversal.c +++ b/pd/src/g_traversal.c @@ -179,6 +179,46 @@ void gpointer_init(t_gpointer *gp) gp->gp_un.gp_gobj = 0; } +/********* random utility function to find a binbuf in a datum */ + +t_binbuf *pointertobinbuf(t_pd *x, t_gpointer *gp, t_symbol *s, + const char *fname) +{ + t_symbol *templatesym = gpointer_gettemplatesym(gp), *arraytype; + t_template *template; + int onset, type; + t_binbuf *b; + t_gstub *gs = gp->gp_stub; + t_word *vec; + if (!templatesym) + { + pd_error(x, "%s: bad pointer", fname); + return (0); + } + if (!(template = template_findbyname(templatesym))) + { + pd_error(x, "%s: couldn't find template %s", fname, + templatesym->s_name); + return (0); + } + if (!template_find_field(template, s, &onset, &type, &arraytype)) + { + pd_error(x, "%s: %s.%s: no such field", fname, + templatesym->s_name, s->s_name); + return (0); + } + if (type != DT_TEXT) + { + pd_error(x, "%s: %s.%s: not a list", fname, + templatesym->s_name, s->s_name); + return (0); + } + if (gs->gs_which == GP_ARRAY) + vec = gp->gp_un.gp_w; + else vec = ((t_scalar *)(gp->gp_un.gp_gobj))->sc_vec; + return (vec[onset].w_binbuf); +} + /* templates are named using the name-bashing by which canvases bind thenselves, with a leading "pd-". LATER see if we can have templates occupy their real names. Meanwhile, if a template has an empty name @@ -662,14 +702,14 @@ static void set_bang(t_set *x) else for (i = 0, vp = x->x_variables; i < nitems; i++, vp++) template_setfloat(template, vp->gv_sym, vec, vp->gv_w.w_float, 1); if (gs->gs_which == GP_GLIST) - scalar_configure((t_scalar *)(gp->gp_un.gp_gobj), gs->gs_un.gs_glist); + scalar_configure((t_scalar *)(gp->gp_un.gp_gobj), gs->gs_un.gs_glist); else { t_array *owner_array = gs->gs_un.gs_array; while (owner_array->a_gp.gp_stub->gs_which == GP_ARRAY) owner_array = owner_array->a_gp.gp_stub->gs_un.gs_array; scalar_redraw((t_scalar *)(owner_array->a_gp.gp_un.gp_gobj), - owner_array->a_gp.gp_stub->gs_un.gs_glist); + owner_array->a_gp.gp_stub->gs_un.gs_glist); } } @@ -1007,7 +1047,6 @@ static void setsize_float(t_setsize *x, t_float f) array we have to search back until we get to a scalar to erase. When graphics updates become queueable this may fall apart... */ - if (gs->gs_which == GP_GLIST) { if (glist_isvisible(gs->gs_un.gs_glist)) @@ -1049,7 +1088,7 @@ static void setsize_float(t_setsize *x, t_float f) if (gs->gs_which == GP_GLIST) { if (glist_isvisible(gs->gs_un.gs_glist)) - gobj_vis(gp->gp_un.gp_gobj, gs->gs_un.gs_glist, 1); + gobj_vis(gp->gp_un.gp_gobj, gs->gs_un.gs_glist, 1); } else { @@ -1058,7 +1097,7 @@ static void setsize_float(t_setsize *x, t_float f) owner_array = owner_array->a_gp.gp_stub->gs_un.gs_array; if (glist_isvisible(owner_array->a_gp.gp_stub->gs_un.gs_glist)) gobj_vis(owner_array->a_gp.gp_un.gp_gobj, - owner_array->a_gp.gp_stub->gs_un.gs_glist, 1); + owner_array->a_gp.gp_stub->gs_un.gs_glist, 1); } } @@ -1279,7 +1318,7 @@ static void sublist_pointer(t_sublist *x, t_gpointer *gp) pd_error(x, "sublist: couldn't find field %s", x->x_fieldsym->s_name); return; } - if (type != DT_LIST) + if (type != DT_TEXT) { pd_error(x, "sublist: field %s not of type list", x->x_fieldsym->s_name); return;