diff --git a/pd/src/g_canvas.c b/pd/src/g_canvas.c index 95b8b5a7026f4e12dbfe750c784ead48ae884e9b..198f9cc44171086a55b5bda484eeb563dc03a270 100644 --- a/pd/src/g_canvas.c +++ b/pd/src/g_canvas.c @@ -1960,24 +1960,32 @@ static t_canvas *canvas_getrootfor_ab(t_canvas *x) } /* check if the dependency graph has a cycle, assuming an new edge between parent and current nodes */ -static int ab_check_cycle(t_ab_definition *current, t_ab_definition *parent) +static int ab_check_cycle(t_ab_definition *current, t_ab_definition *parent, int pathlen, char *path, char *res) { if(current == parent) + { + sprintf(path+pathlen, "[ab %s]", current->ad_name->s_name); + strcpy(res, path); return (1); + } else { + int len = strlen(current->ad_name->s_name); + sprintf(path+pathlen, "[ab %s]<-", current->ad_name->s_name); + pathlen += (len+7); int i, cycle = 0; for(i = 0; !cycle && i < current->ad_numdep; i++) { - cycle = ab_check_cycle(current->ad_dep[i], parent); + cycle = ab_check_cycle(current->ad_dep[i], parent, pathlen, path, res); } + pathlen -= (len+7); return (cycle); } } /* try to register a new dependency into the dependency graph, returns 0 if a dependency issue is found */ -static int canvas_register_ab(t_canvas *x, t_ab_definition *a) +static int canvas_register_ab(t_canvas *x, t_ab_definition *a, char *res) { t_canvas *r = canvas_getrootfor_ab(x), *c = x; @@ -1993,7 +2001,9 @@ static int canvas_register_ab(t_canvas *x, t_ab_definition *a) if(!found) { - if(!ab_check_cycle(f, a)) + char path[MAXPDSTRING]; + sprintf(path, "[ab %s]<-", a->ad_name->s_name); + if(!ab_check_cycle(f, a, strlen(path), path, res)) { a->ad_dep = (t_ab_definition **)resizebytes(a->ad_dep, sizeof(t_ab_definition *)*a->ad_numdep, @@ -2231,11 +2241,15 @@ static void canvas_abframe(t_canvas *x, t_float val) abframe = val; } +extern t_class *text_class; + /* creator for "ab" objects */ static void *ab_new(t_symbol *s, int argc, t_atom *argv) { if(abframe) - return (0); + /* return dummy text object so that creator + does not throw an error */ + return pd_new(text_class); t_canvas *c = canvas_getcurrent(); @@ -2256,14 +2270,15 @@ static void *ab_new(t_symbol *s, int argc, t_atom *argv) source = canvas_add_ab(c, name, b); } - if(canvas_register_ab(c, source)) + char res[MAXPDSTRING]; + if(canvas_register_ab(c, source, res)) { newest = do_create_ab(source, (argc ? argc-1 : 0), (argc ? argv+1 : 0)); source->ad_numinstances++; } else { - error("ab_new: can't insantiate ab within itself"); + error("ab_new: can't insantiate ab within itself\n cycle: %s", res); newest = 0; } } diff --git a/pd/src/g_editor.c b/pd/src/g_editor.c index e526e1fb66307377e48ae204a0307c5c2ee91a7b..53117ec8836be735efe38cfb2689019eeb164113 100644 --- a/pd/src/g_editor.c +++ b/pd/src/g_editor.c @@ -1425,10 +1425,10 @@ void canvas_reload_ab_rec(t_canvas *x, t_ab_definition *a, t_gobj *e) { canvas_create_editor(x); - if (!x->gl_havewindow) //necessary? - { - canvas_vis(glist_getcanvas(x), 1); - } + //if (!x->gl_havewindow) //necessary? + //{ + // canvas_vis(glist_getcanvas(x), 1); + //} if (!found) { glist_noselect(x); @@ -1465,8 +1465,8 @@ void canvas_reload_ab_rec(t_canvas *x, t_ab_definition *a, t_gobj *e) g = g->g_next; } - if (!hadwindow && x->gl_havewindow) - canvas_vis(glist_getcanvas(x), 0); + //if (!hadwindow && x->gl_havewindow) + // canvas_vis(glist_getcanvas(x), 0); } /* --------- 6. apply ----------- */