From b0a1f0bbf67fe8a198caff539132f2c62cf6098c Mon Sep 17 00:00:00 2001 From: Ivica Ico Bukvic <ico@vt.edu> Date: Tue, 2 Sep 2014 17:43:06 -0400 Subject: [PATCH] *fixed stderr errors where subpatch canvases were still trying to delete themselves --- pd/src/g_canvas.c | 7 ++++--- pd/src/g_graph.c | 41 +++++++++++++++++++++++++---------------- pd/src/g_text.c | 5 +++-- 3 files changed, 32 insertions(+), 21 deletions(-) diff --git a/pd/src/g_canvas.c b/pd/src/g_canvas.c index 1df4f1a8e..92949c1d8 100644 --- a/pd/src/g_canvas.c +++ b/pd/src/g_canvas.c @@ -849,7 +849,7 @@ void glist_menu_open(t_glist *x) int glist_isvisible(t_glist *x) { - return ((!x->gl_loading) && glist_getcanvas(x)->gl_mapped); + return ((!x->gl_loading) && ((x->gl_isgraph && glist_getcanvas(x)->gl_mapped) || (!x->gl_isgraph && x->gl_mapped))); } int glist_istoplevel(t_glist *x) @@ -872,6 +872,7 @@ extern void canvas_group_free(t_pd *x); void canvas_free(t_canvas *x) { + //fprintf(stderr,"canvas_free %lx\n", (t_int)x); t_gobj *y; int dspstate = canvas_suspend_dsp(); @@ -888,8 +889,8 @@ void canvas_free(t_canvas *x) glist_delete(x, y); if (x == glist_getcanvas(x)) canvas_vis(x, 0); - if (x->gl_editor) - canvas_destroy_editor(x); /* bug workaround; should already be gone*/ + if (x->gl_editor) + canvas_destroy_editor(x); /* bug workaround; should already be gone*/ if (x-> x_handle) scalehandle_free( x->x_handle); if (x->x_mhandle) scalehandle_free(x->x_mhandle); diff --git a/pd/src/g_graph.c b/pd/src/g_graph.c index bb8b98d1b..73c837ae7 100644 --- a/pd/src/g_graph.c +++ b/pd/src/g_graph.c @@ -143,7 +143,7 @@ extern t_rtext *glist_tryfindrtext(t_glist *gl, t_text *who); /* delete an object from a glist and free it */ void glist_delete(t_glist *x, t_gobj *y) { - //fprintf(stderr,"glist_delete?\n"); + //fprintf(stderr,"glist_delete y=%lx x=%lx glist_getcanvas=%lx\n", y, x, glist_getcanvas(x)); if (x->gl_list) { //fprintf(stderr,"glist_delete YES\n"); @@ -184,22 +184,25 @@ void glist_delete(t_glist *x, t_gobj *y) zap the inlets and outlets here... */ if (pd_class(&y->g_pd) == canvas_class) { - t_glist *gl = (t_glist *)y; - if (gl->gl_isgraph) + if (glist_isvisible(x)) { - char tag[80]; - //sprintf(tag, "graph%lx", (t_int)gl); - //t_glist *yy = (t_glist *)y; - sprintf(tag, "%s", - rtext_gettag(glist_findrtext(x, &gl->gl_obj))); - glist_eraseiofor(x, &gl->gl_obj, tag); - text_eraseborder(&gl->gl_obj, x, - rtext_gettag(glist_findrtext(x, &gl->gl_obj))); - } - else - { - text_eraseborder(&gl->gl_obj, x, - rtext_gettag(glist_findrtext(x, &gl->gl_obj))); + t_glist *gl = (t_glist *)y; + if (gl->gl_isgraph) + { + char tag[80]; + //sprintf(tag, "graph%lx", (t_int)gl); + //t_glist *yy = (t_glist *)y; + sprintf(tag, "%s", + rtext_gettag(glist_findrtext(x, &gl->gl_obj))); + glist_eraseiofor(x, &gl->gl_obj, tag); + text_eraseborder(&gl->gl_obj, x, + rtext_gettag(glist_findrtext(x, &gl->gl_obj))); + } + else + { + text_eraseborder(&gl->gl_obj, x, + rtext_gettag(glist_findrtext(x, &gl->gl_obj))); + } } } } @@ -215,7 +218,10 @@ void glist_delete(t_glist *x, t_gobj *y) } } if (glist_isvisible(canvas)) + { + //fprintf(stderr,"...deleting %lx %lx\n", x, glist_getcanvas(x)); gobj_vis(y, x, 0); + } if (x->gl_editor && (ob = pd_checkobject(&y->g_pd))) { //rtext_new(x, ob); @@ -314,6 +320,9 @@ t_canvas *glist_getcanvas(t_glist *x) while (x->gl_owner && !x->gl_havewindow && x->gl_isgraph && gobj_shouldvis(&x->gl_gobj, x->gl_owner)) { + //fprintf(stderr,"x=%lx x->gl_owner=%d x->gl_havewindow=%d x->gl_isgraph=%d gobj_shouldvis=%d\n", + // x, (x->gl_owner ? 1:0), x->gl_havewindow, x->gl_isgraph, + // gobj_shouldvis(&x->gl_gobj, x->gl_owner)); x = x->gl_owner; //fprintf(stderr,"+\n"); } diff --git a/pd/src/g_text.c b/pd/src/g_text.c index 28b4fd2d7..55bba4a74 100644 --- a/pd/src/g_text.c +++ b/pd/src/g_text.c @@ -1618,7 +1618,7 @@ static void text_vis(t_gobj *z, t_glist *glist, int vis) t_rtext *y = glist_findrtext(glist, x); if (gobj_shouldvis(&x->te_g, glist)) { - //fprintf(stderr," erase it\n"); + //fprintf(stderr," erase it %lx %lx\n", x, glist); text_eraseborder(x, glist, rtext_gettag(y)); rtext_erase(y); } @@ -2194,7 +2194,8 @@ void glist_eraseiofor(t_glist *glist, t_object *ob, char *tag) void text_eraseborder(t_text *x, t_glist *glist, char *tag) { - //if (x->te_type == T_TEXT) return; + if (x->te_type == T_TEXT && !glist->gl_edit) return; + //if (!glist_isvisible(glist)) return; sys_vgui(".x%lx.c delete %sR\n", glist_getcanvas(glist), tag); glist_eraseiofor(glist, x, tag); -- GitLab