diff --git a/pd/src/g_canvas.h b/pd/src/g_canvas.h index c161a7af8261f89cdedc8b66da6bc4fa7e0b32dc..b4be1fa4b370344edad666011a8ae3537dbbd386 100644 --- a/pd/src/g_canvas.h +++ b/pd/src/g_canvas.h @@ -262,6 +262,8 @@ struct _glist #define gl_gobj gl_obj.te_g #define gl_pd gl_gobj.g_pd +typedef void (*t_canvas_iterator)(t_canvas *x, void *data); + /*-------------------universal preset stuff---------------------*/ // for the universal preset_node ability (see g_editor.c doconnect/disconnect functions) // this is where all the classes capable of being controlled via preset should be defined diff --git a/pd/src/g_clone.c b/pd/src/g_clone.c index c58c33f3dbca45775e1279a10c30ad1d8335ec20..21963c81a7f4a5489ca11904c0a4124caeec02ef 100644 --- a/pd/src/g_clone.c +++ b/pd/src/g_clone.c @@ -75,6 +75,14 @@ int clone_match(t_pd *z, t_symbol *name, t_symbol *dir) canvas_getdir(x->x_vec[0].c_gl) == dir); } +void clone_iterate(t_pd *z, t_canvas_iterator it, void* data) +{ + t_clone *x = (t_clone *)z; + int i; + for(i = 0; i < x->x_n; i++) + it(x->x_vec[i].c_gl, data); +} + int clone_isab(t_pd *z) { t_clone *x = (t_clone *)z; @@ -89,22 +97,6 @@ int clone_matchab(t_pd *z, t_ab_definition *source) return (clone_isab(z) && x->x_vec[0].c_gl->gl_absource == source); } -int clone_getncopies(t_pd *z) -{ - t_clone *x = (t_clone *)z; - return (x->x_n); -} - -t_glist **clone_getglists(t_pd *z) -{ - t_clone *x = (t_clone *)z; - t_glist **glists = (t_glist *)getbytes(sizeof(t_glist *)*x->x_n); - int i; - for(i = 0; i < x->x_n; i++) - glists[i] = x->x_vec[i].c_gl; - return glists; -} - void obj_sendinlet(t_object *x, int n, t_symbol *s, int argc, t_atom *argv); static void clone_in_list(t_in *x, t_symbol *s, int argc, t_atom *argv) diff --git a/pd/src/g_editor.c b/pd/src/g_editor.c index bd1da84ddfe14d139262d52ce5781648132ff823..6a89835f42defc507a7bba43d809ca2cc76f789f 100644 --- a/pd/src/g_editor.c +++ b/pd/src/g_editor.c @@ -1313,6 +1313,15 @@ static void glist_doreload(t_glist *gl, t_symbol *name, t_symbol *dir, canvas_isabstraction((t_canvas *)g) && ((t_canvas *)g)->gl_name == name && canvas_getdir((t_canvas *)g) == dir); + + if(remakeit && ((t_canvas *)g)->gl_dirty) + /* set dirty to 0 to remove the dirty markings*/ + { + glist_amreloadingabstractions = 0; + canvas_dirty((t_canvas *)g, 0); + glist_amreloadingabstractions = 1; + } + /* also remake it if it's a "clone" with that name */ if (pd_class(&g->g_pd) == clone_class && clone_match(&g->g_pd, name, dir)) @@ -1348,13 +1357,6 @@ static void glist_doreload(t_glist *gl, t_symbol *name, t_symbol *dir, found = 1; } glist_select(gl, g); - if(((t_canvas *)g)->gl_dirty) - /* set dirty to 0 to remove the dirty markings*/ - { - glist_amreloadingabstractions = 0; - canvas_dirty((t_canvas *)g, 0); - glist_amreloadingabstractions = 1; - } //canvas_setundo(gl, canvas_undo_cut, // canvas_undo_set_cut(gl, UCUT_CLEAR), "clear"); //canvas_undo_add(gl, 3, "clear", @@ -1408,11 +1410,16 @@ void canvas_reload(t_symbol *name, t_symbol *dir, t_gobj *except) canvas_resume_dsp(dspwas); } +typedef struct _reload_ab_data +{ + t_ab_definition *a; + t_gobj *e; +} t_reload_ab_data; +static void glist_doreload_ab_packed(t_canvas *x, t_reload_ab_data *data); +void clone_iterate(t_pd *z, t_canvas_iterator it, void* data); int clone_isab(t_pd *z); int clone_matchab(t_pd *z, t_ab_definition *source); -int clone_getncopies(t_pd *z); -t_glist **clone_getglists(t_pd *z); /* recursive ab reload method */ static void glist_doreload_ab(t_canvas *x, t_ab_definition *a, t_gobj *e) @@ -1426,6 +1433,14 @@ static void glist_doreload_ab(t_canvas *x, t_ab_definition *a, t_gobj *e) remakeit = (g != e && pd_class(&g->g_pd) == canvas_class && canvas_isabstraction((t_canvas *)g) && ((t_canvas *)g)->gl_isab && ((t_canvas *)g)->gl_absource == a); + if(remakeit && ((t_canvas *)g)->gl_dirty) + /* set dirty to 0 to remove the dirty markings*/ + { + glist_amreloadingabstractions = 0; + canvas_dirty((t_canvas *)g, 0); + glist_amreloadingabstractions = 1; + } + remakeit = remakeit || (pd_class(&g->g_pd) == clone_class && clone_matchab(&g->g_pd, a)); if(remakeit) @@ -1437,13 +1452,6 @@ static void glist_doreload_ab(t_canvas *x, t_ab_definition *a, t_gobj *e) found = 1; } glist_select(x, g); - if(((t_canvas *)g)->gl_dirty) - /* set dirty to 0 to remove the dirty markings*/ - { - glist_amreloadingabstractions = 0; - canvas_dirty((t_canvas *)g, 0); - glist_amreloadingabstractions = 1; - } } else if(g == e) canvas_initbang((t_canvas *)g); @@ -1465,17 +1473,20 @@ static void glist_doreload_ab(t_canvas *x, t_ab_definition *a, t_gobj *e) if(pd_class(&g->g_pd) == clone_class && clone_isab(&g->g_pd) && !clone_matchab(&g->g_pd, a)) { - int numglists = clone_getncopies(&g->g_pd), j; - t_glist **glists = clone_getglists(&g->g_pd); - for(j = 0; j < numglists; j++) - glist_doreload_ab((t_canvas *)glists[j], a, e); - freebytes(glists, sizeof(t_glist *)*numglists); + t_reload_ab_data d; + d.a = a; d.e = e; + clone_iterate(&g->g_pd, glist_doreload_ab_packed, &d); } g = g->g_next; } } +static void glist_doreload_ab_packed(t_canvas *x, t_reload_ab_data *data) +{ + glist_doreload_ab(x, data->a, data->e); +} + t_canvas *canvas_getrootfor_ab(t_canvas *x); /* reload ab instances */