diff --git a/pd/src/g_canvas.c b/pd/src/g_canvas.c index 17fd068a17bd35fd2b1a11a4d780660004aa10bc..e6902685b8f33f8851742042f8c3562a7e4fe1e1 100644 --- a/pd/src/g_canvas.c +++ b/pd/src/g_canvas.c @@ -420,6 +420,7 @@ t_canvas *canvas_new(void *dummy, t_symbol *sel, int argc, t_atom *argv) (canvas_newfilename ? canvas_newfilename : gensym("Pd"))); canvas_bind(x); x->gl_loading = 1; + x->gl_unloading = 0; //fprintf(stderr,"loading = 1 .x%lx owner=.x%lx\n", (t_int)x, (t_int)x->gl_owner); x->gl_goprect = 0; /* no GOP rectangle unless it's turned on later */ /* cancel "vis" flag if we're a subpatch of an @@ -882,6 +883,7 @@ void canvas_free(t_canvas *x) if (canvas_whichfind == x) canvas_whichfind = 0; glist_noselect(x); + x->gl_unloading = 1; while (y = x->gl_list) glist_delete(x, y); if (x == glist_getcanvas(x)) diff --git a/pd/src/g_canvas.h b/pd/src/g_canvas.h index 5e575187b1c39199dfbc4999278ea413f01746ec..27b4dc7abdebfbf8e0c190fffeebbe0b610f0096 100644 --- a/pd/src/g_canvas.h +++ b/pd/src/g_canvas.h @@ -206,6 +206,7 @@ struct _glist unsigned int gl_willvis:1; /* make me visible after loading */ unsigned int gl_edit:1; /* edit mode */ unsigned int gl_isdeleting:1; /* we're inside glist_delete -- hack! */ + unsigned int gl_unloading:1; /* we're inside canvas_free */ unsigned int gl_goprect:1; /* draw rectangle for graph-on-parent */ unsigned int gl_isgraph:1; /* show as graph on parent */ unsigned int gl_hidetext:1; /* hide object-name + args when doing graph on parent */ diff --git a/pd/src/g_graph.c b/pd/src/g_graph.c index a70e0a6323334ce95ab230a97f96df7e4552c979..356fc38c8e833800fc8a3d656e7cc55a59fe3a41 100644 --- a/pd/src/g_graph.c +++ b/pd/src/g_graph.c @@ -161,6 +161,13 @@ void glist_delete(t_glist *x, t_gobj *y) { /* JMZ: send a closebang to the canvas */ canvas_closebang((t_canvas *)y); + /* and this little hack so drawing commands can tell + if a [group] is deleting them (and thus suppress + their own redraws) */ + ((t_canvas *)y)->gl_unloading = 1; + /* if we are a group, let's call ourselves a drawcommand */ + if (((t_canvas *)y)->gl_svg) + drawcommand = 1; } wasdeleting = canvas_setdeleting(canvas, 1); @@ -202,7 +209,7 @@ void glist_delete(t_glist *x, t_gobj *y) if (drawcommand) { tmpl = template_findbydrawcommand(y); - if (!(canvas_isgroup(canvas) && canvas->gl_isdeleting)) + if (!(canvas_isgroup(canvas) && canvas->gl_unloading)) { canvas_redrawallfortemplate(tmpl, 2); } @@ -238,8 +245,10 @@ void glist_delete(t_glist *x, t_gobj *y) if (chkdsp) canvas_update_dsp(); if (drawcommand) { - if (!(canvas_isgroup(canvas) && canvas->gl_isdeleting)) + if (!(canvas_isgroup(canvas) && canvas->gl_unloading)) + { canvas_redrawallfortemplate(tmpl, 1); + } } canvas_setdeleting(canvas, wasdeleting); x->gl_valid = ++glist_valid; diff --git a/pd/src/g_template.c b/pd/src/g_template.c index 1b053d817c130538fe19f997aacb7ace3b9ee043..d049e20dbe1d7592a1821d702f1b2fa6634023e0 100644 --- a/pd/src/g_template.c +++ b/pd/src/g_template.c @@ -7442,6 +7442,8 @@ t_template *template_findbydrawcommand(t_gobj *g) c = ((t_drawimage *)g)->x_canvas; else if (g->g_pd == plot_class) c = ((t_plot *)g)->x_canvas; + else if (g->g_pd == canvas_class) + c = (t_canvas *)g; else return (0); c = canvas_templatecanvas_forgroup(c); t_symbol *s1 = gensym("struct");