void gobj_recreate(t_glist *gl, t_gobj *ob, t_binbuf *bb) { /* LATER revisit all gobj calls, and sort out the gop case */ t_text *newt; int xpix = ((t_text *)ob)->te_xpix, ypix = ((t_text *)ob)->te_ypix; t_binbuf *bb1 = binbuf_new(); int ac = binbuf_getnatom(bb); t_atom *av = binbuf_getvec(bb); canvas_setcurrent(gl); gobj_totail(gl, ob); gobj_stowconnections(gl, ob, bb1); glist_delete(gl, ob); if (newt = (t_text *)forky_newobject(av->a_w.w_symbol, ac - 1, av + 1)) { newt->te_binbuf = bb; newt->te_xpix = xpix; newt->te_ypix = ypix; newt->te_width = 0; newt->te_type = T_OBJECT; glist_add(gl, (t_gobj *)newt); gobj_restoreconnections(gl, bb1); } else bug("gobj_recreate"); binbuf_free(bb1); canvas_unsetcurrent(gl); }
static void obj_delete_undo(t_glist*x, t_object *obj) { /* delete an object with undo */ t_gobj*gobj=o2g(obj); canvas_undo_add(x, UNDO_RECREATE, "recreate", (void *)canvas_undo_set_recreate(x, gobj,canvas_getindex(x, gobj))); glist_delete(x, gobj); }
/* remove every object from a glist. Experimental. */ void glist_clear(t_glist *x) { t_gobj *y, *y2; int dspstate = 0, suspended = 0; t_symbol *dspsym = gensym("dsp"); while (y = x->gl_list) { /* to avoid unnecessary DSP resorting, we suspend DSP only if we hit a patchable object. */ if (!suspended && pd_checkobject(&y->g_pd) && zgetfn(&y->g_pd, dspsym)) { dspstate = canvas_suspend_dsp(); suspended = 1; } /* here's the real deletion. */ glist_delete(x, y); } if (suspended) canvas_resume_dsp(dspstate); }