diff --git a/pd/src/g_editor.c b/pd/src/g_editor.c index 7a3b69f951dfceff0eb2f29b9770a8a252dcef84..ed77afb9e36dfd9e5a95a49a39db6438cfec3fbc 100644 --- a/pd/src/g_editor.c +++ b/pd/src/g_editor.c @@ -231,75 +231,79 @@ int canvas_restore_original_position(t_glist *x, t_gobj *y, const char* objtag, { // we do this instead to save us costly redraw of the canvas //fprintf(stderr,"canvas_restore_original_position %lx %lx %s %d\n", (t_int)x, (t_int)y, objtag, dir); - t_object *ob = NULL; - t_rtext *yrnxt = NULL, *yr = NULL; int ret = 0; - - if (y->g_next) { - ob = pd_checkobject(&y->g_next->g_pd); - } - if (ob) { - yrnxt = glist_findrtext(x, (t_text *)&ob->ob_g); - } - if (y) { - ob = pd_checkobject(&y->g_pd); - } else { - ret = 1; - } - if (ob) { - yr = glist_findrtext(x, (t_text *)&ob->ob_g); - } - if (ret != 1) { - if (dir == -1) { - if (x->gl_list == y) { - // we get here if we are supposed to go all the way to the bottom - if (objtag) - sys_vgui(".x%lx.c addtag arrange withtag %s\n", x, objtag); - else - sys_vgui(".x%lx.c addtag arrange withtag selected\n", x); - sys_vgui(".x%lx.c lower arrange\n", x); - if (objtag) - sys_vgui(".x%lx.c dtag %s arrange\n", x, objtag); - else - sys_vgui(".x%lx.c dtag selected arrange\n", x); - } else if (yrnxt) { - // lower into middle - if (objtag) - sys_vgui("pdtk_find_lowest_widget_withtag_and_arrange .x%lx.c %s %s %s\n", x, rtext_gettag(yrnxt), rtext_gettag(yr), objtag); - else { - sys_vgui(".x%lx.c addtag arrange withtag selected\n", x); - sys_vgui("pdtk_find_lowest_widget_withtag_and_arrange .x%lx.c %s %s 0\n", x, rtext_gettag(yrnxt), rtext_gettag(yr)); - } - } else { - // fall back to legacy redraw for objects that are not patchable - canvas_redraw(x); - ret = -1; - } + // we only do this if we are not embedded inside gop, otherwise when gop is done redrawing we + // will get properly repositioned by gop's call to restore original position + if (pd_class(&y->g_pd) != canvas_class || ((t_glist *)y)->gl_owner == x) { + t_object *ob = NULL; + t_rtext *yrnxt = NULL, *yr = NULL; + + if (y->g_next) { + ob = pd_checkobject(&y->g_next->g_pd); + } + if (ob) { + yrnxt = glist_findrtext(x, (t_text *)&ob->ob_g); + } + if (y) { + ob = pd_checkobject(&y->g_pd); } else { - if (yrnxt) { - // raise into middle - if (objtag) - sys_vgui("pdtk_find_lowest_widget_withtag_and_arrange .x%lx.c %s %s %s\n", x, rtext_gettag(yrnxt), rtext_gettag(yr), objtag); - else { - sys_vgui(".x%lx.c addtag arrange withtag selected\n", x); - sys_vgui("pdtk_find_lowest_widget_withtag_and_arrange .x%lx.c %s %s 0\n", x, rtext_gettag(yrnxt), rtext_gettag(yr)); + ret = 1; + } + if (ob) { + yr = glist_findrtext(x, (t_text *)&ob->ob_g); + } + if (ret != 1) { + if (dir == -1) { + if (x->gl_list == y) { + // we get here if we are supposed to go all the way to the bottom + if (objtag) + sys_vgui(".x%lx.c addtag arrange withtag %s\n", x, objtag); + else + sys_vgui(".x%lx.c addtag arrange withtag selected\n", x); + sys_vgui(".x%lx.c lower arrange\n", x); + if (objtag) + sys_vgui(".x%lx.c dtag %s arrange\n", x, objtag); + else + sys_vgui(".x%lx.c dtag selected arrange\n", x); + } else if (yrnxt) { + // lower into middle + if (objtag) + sys_vgui("pdtk_find_lowest_widget_withtag_and_arrange .x%lx.c %s %s %s\n", x, rtext_gettag(yrnxt), rtext_gettag(yr), objtag); + else { + sys_vgui(".x%lx.c addtag arrange withtag selected\n", x); + sys_vgui("pdtk_find_lowest_widget_withtag_and_arrange .x%lx.c %s %s 0\n", x, rtext_gettag(yrnxt), rtext_gettag(yr)); + } + } else { + // fall back to legacy redraw for objects that are not patchable + canvas_redraw(x); + ret = -1; } - } else if (y->g_next == NULL) { - // we get here if we are supposed to go all the way to the top - if (objtag) - sys_vgui(".x%lx.c addtag arrange withtag %s\n", x, objtag); - else - sys_vgui(".x%lx.c addtag arrange withtag selected\n", x); - sys_vgui(".x%lx.c raise arrange\n", x); - if (objtag) - sys_vgui(".x%lx.c dtag %s arrange\n", x, objtag); - else - sys_vgui(".x%lx.c dtag selected arrange\n", x); - sys_vgui(".x%lx.c raise all_cords\n", x); } else { - // fall back to legacy redraw for objects that are not patchable - canvas_redraw(x); - ret = -1; + if (yrnxt) { + // raise into middle + if (objtag) + sys_vgui("pdtk_find_lowest_widget_withtag_and_arrange .x%lx.c %s %s %s\n", x, rtext_gettag(yrnxt), rtext_gettag(yr), objtag); + else { + sys_vgui(".x%lx.c addtag arrange withtag selected\n", x); + sys_vgui("pdtk_find_lowest_widget_withtag_and_arrange .x%lx.c %s %s 0\n", x, rtext_gettag(yrnxt), rtext_gettag(yr)); + } + } else if (y->g_next == NULL) { + // we get here if we are supposed to go all the way to the top + if (objtag) + sys_vgui(".x%lx.c addtag arrange withtag %s\n", x, objtag); + else + sys_vgui(".x%lx.c addtag arrange withtag selected\n", x); + sys_vgui(".x%lx.c raise arrange\n", x); + if (objtag) + sys_vgui(".x%lx.c dtag %s arrange\n", x, objtag); + else + sys_vgui(".x%lx.c dtag selected arrange\n", x); + sys_vgui(".x%lx.c raise all_cords\n", x); + } else { + // fall back to legacy redraw for objects that are not patchable + canvas_redraw(x); + ret = -1; + } } } }