Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
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);
    }
}
Ejemplo n.º 3
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);
    }
}
Ejemplo n.º 4
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));
            }
        }
    }
}