diff --git a/pd/src/g_canvas.c b/pd/src/g_canvas.c index 1f7f8c361a28d43cb98b72ad2559dcefcb947c2b..939d06cc4e5713df7ab6b6fed09be2dbf0cd0d2f 100644 --- a/pd/src/g_canvas.c +++ b/pd/src/g_canvas.c @@ -218,12 +218,13 @@ t_symbol *canvas_realizedollar(t_canvas *x, t_symbol *s) t_symbol *canvas_getcurrentdir(void) { - t_canvasenvironment *e = canvas_getenv(canvas_getcurrent()); - return (e->ce_dir); + return (canvas_getdir(canvas_getcurrent())); } t_symbol *canvas_getdir(t_canvas *x) { + x = canvas_getrootfor(x); + if(x->gl_isab) x = x->gl_absource->ad_owner; t_canvasenvironment *e = canvas_getenv(x); return (e->ce_dir); } @@ -785,6 +786,8 @@ void canvas_reflecttitle(t_canvas *x) namebuf, canvas_getdir(x)->s_name, x->gl_dirty); } +void gobj_isdirty(t_glist *g, t_gobj *x, int on); + /* mark a glist dirty or clean */ void canvas_dirty(t_canvas *x, t_floatarg n) { @@ -798,14 +801,14 @@ void canvas_dirty(t_canvas *x, t_floatarg n) canvas_reflecttitle(x2); if (x2->gl_owner) { - gobj_isdirty(x2->gl_owner, x2, + gobj_isdirty(x2->gl_owner, &x2->gl_gobj, (x2->gl_dirty ? 1 : (x2->gl_subdirties ? 2 : 0))); x2 = x2->gl_owner; while(x2->gl_owner) { x2->gl_subdirties += (n ? 1 : -1); if(!x2->gl_dirty) - gobj_isdirty(x2->gl_owner, x2, (x2->gl_subdirties ? 2 : 0)); + gobj_isdirty(x2->gl_owner, &x2->gl_gobj, (x2->gl_subdirties ? 2 : 0)); x2 = x2->gl_owner; } } @@ -1929,10 +1932,7 @@ static t_pd *do_create_ab(t_ab_definition *abdef, int argc, t_atom *argv) { canvas_setargs(argc, argv); int dspstate = canvas_suspend_dsp(); - /* prepend [ab] to indicate that it is a private abstraction */ - char filename[MAXPDSTRING]; - sprintf(filename, "[ab] %s", abdef->ad_name->s_name); - glob_setfilename(0, gensym(filename), canvas_getdir(canvas_getcurrent())); + glob_setfilename(0, abdef->ad_name, gensym("[ab]")); /* set ab source, next canvas is going to be a private abstraction */ canvas_setabsource(abdef); @@ -2074,13 +2074,15 @@ static void canvas_deregister_ab(t_canvas *x, t_ab_definition *a) } } +void canvas_reload_ab_rec(t_canvas *x, t_ab_definition *a, t_gobj *e); + /* reload ab instances */ void canvas_reload_ab(t_canvas *x) { t_canvas *c = canvas_getrootfor_ab(x); int dspwas = canvas_suspend_dsp(); glist_amreloadingabstractions = 1; - canvas_reload_ab_rec(c, x->gl_absource, &x->gl_obj); + canvas_reload_ab_rec(c, x->gl_absource, &x->gl_gobj); glist_amreloadingabstractions = 0; canvas_resume_dsp(dspwas); canvas_dirty(c, 1); @@ -2238,7 +2240,7 @@ static void canvas_abpush(t_canvas *x, t_symbol *s, int argc, t_atom *argv) } } - pd_free(x); + pd_free(&x->gl_pd); } static int ab_is_local(t_canvas *x, t_symbol *s) @@ -2250,7 +2252,7 @@ static int ab_is_local(t_canvas *x, t_symbol *s) *end = '\0'; num = atoi(name); *end = '-'; - return (num == canvas_getdollarzero(x)); + return (num == canvas_getdollarzero(&x->gl_pd)); } return (0); }