DYN_EXPORT int dyn_NewConnection(int sched,dyn_id *cid,dyn_callback cb,dyn_id soid,int outlet,dyn_id doid,int inlet) { ASSERT(cid); ASSERT(soid && inlet >= 0); ASSERT(doid && outlet >= 0); dyn_patchable *sobj = soid->Patchable(); dyn_patchable *dobj = doid->Patchable(); int ret = DYN_ERROR_NONE; dyn_id conn = DYN_ID_NONE; if(!sobj || !dobj) { ret = DYN_ERROR_TYPEMISMATCH; goto error; } if(sobj->owner != dobj->owner) { ret = DYN_ERROR_CONN_PATCHER; goto error; } { dyn_patcher *patcher = sobj->owner; ASSERT(patcher); // sys_lock(); canvas_setcurrent(patcher->glist()); bool ok = !canvas_isconnected(patcher->glist(),(t_text *)sobj->pdobj,outlet,(t_text *)dobj->pdobj,inlet) && obj_connect((t_object *)sobj->pdobj, outlet,(t_object *)dobj->pdobj,inlet); canvas_unsetcurrent(patcher->glist()); // sys_unlock(); if(!ok) { ret = DYN_ERROR_CONN_GENERAL; goto error; } } conn = new dyn_ident(DYN_TYPE_CONN,cb); conn->Set(new dyn_conn(conn,soid,outlet,doid,inlet)); // add connection to object lists sobj->AddOutlet(conn->Conn()); dobj->AddInlet(conn->Conn()); *cid = conn; return ret; error: if(conn != DYN_ID_NONE) delete conn; return ret; }
void magicGlass_bind(t_magicGlass *x, t_object *obj, int outno) { if (x->x_connectedObj != obj) { if (x->x_connectedObj) { obj_disconnect(x->x_connectedObj, x->x_connectedOutno, &x->x_obj, 0); } x->x_connectedObj = obj; x->x_connectedOutno = outno; x->x_maxSize = 1; magicGlass_clearText(x); obj_connect(obj, outno, &x->x_obj, 0); } }
void magicGlass_bind(t_magicGlass *x, t_object *obj, int outno) { //fprintf(stderr,"magicglass_bind %lx\n", (t_int)x); if (x->x_connectedObj != obj) { if (x->x_connectedObj) { obj_disconnect(x->x_connectedObj, x->x_connectedOutno, &x->x_obj, 0); } x->x_connectedObj = obj; x->x_connectedOutno = outno; x->x_maxSize = 1; magicGlass_clearText(x); obj_connect(obj, outno, &x->x_obj, 0); } }
static void dereconnect(t_glist*cnv, t_object*org, t_object*replace) { t_gobj*gobj; int replace_i = canvas_getindex(cnv, o2g(replace)); for(gobj=cnv->gl_list; gobj; gobj=gobj->g_next) { t_object*obj=g2o(gobj); int obj_i = canvas_getindex(cnv, gobj); int obj_nout=0; int nout; if(!obj)continue; obj_nout=obj_noutlets(obj); for(nout=0; nout<obj_nout; nout++) { t_outlet*out=0; t_outconnect*conn=obj_starttraverseoutlet(obj, &out, nout); while(conn) { int which; t_object*dest=0; t_inlet *in =0; int dest_i; conn=obj_nexttraverseoutlet(conn, &dest, &in, &which); if(dest!=org) continue; dest_i = canvas_getindex(cnv, o2g(dest)); obj_disconnect(obj, nout, dest, which); canvas_undo_add(cnv, UNDO_DISCONNECT, "disconnect", canvas_undo_set_disconnect(cnv, obj_i, nout, dest_i, which)); obj_connect(obj, nout, replace, which); canvas_undo_add(cnv, UNDO_CONNECT, "connect", canvas_undo_set_connect(cnv, obj_i, nout, replace_i, which)); } } } }