Beispiel #1
0
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);
}
Beispiel #2
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));
            }
        }
    }
}
Beispiel #3
0
/* Note that adding new objects to the canvas has to wait until after
   the patch is finished loading.  Otherwise it will mess up the
   numbering of objects recorded in the .pd file. */
static void proc_pd_create_gui(struct proc_pd *x, float x_coord, float y_coord) {

    t_canvas *canvas = glist_getcanvas(x->x_canvas);


    /* Create slider on current canvas if there is no receiver. */
    const struct proc_class_control *p = x->proc_class->info_control;
    t_symbol *obj = gensym("obj");
    t_symbol *hsl = gensym("hsl");
    t_symbol *empty  = gensym("empty");
    t_symbol *msg = gensym("msg");
    t_symbol *control = gensym("control");
    t_symbol *dollar_one = gensym("$1");
    t_symbol *connect = gensym("connect");
    int synth_obj_no = canvas_getindex(canvas, (void*)x);
    for (int i = 0; p[i].desc; i++) {
        t_symbol *slider = gensym_n("slider", i);
        if (!slider->s_thing) {
            int obj_no = canvas_getindex(canvas, NULL);

            /* Examples of the format can be found in .pd files, e.g.:
               #X obj 55 54 hsl 128 15 0 127 0 0 empty empty empty -2 -8 0 10 -262144 -1 -1 0 1;
               see also hslider_new() */
            {
                t_atom args[] = {
                    /** create object at location **/
                    SYMBOL(obj),
                    FLOAT(x_coord),
                    FLOAT(y_coord + 30 * i),
                    SYMBOL(hsl),
                    /** arguments passed to hslider_new() */
                    /* w */    FLOAT(128),
                    /* h */    FLOAT(15),
                    /* min */  FLOAT(0),
                    /* max */  FLOAT(1),
                    /* lilo */ FLOAT(0),
                    /* isa */  FLOAT(1),
                    /* snd */  SYMBOL(empty),
                    /* rcv */  SYMBOL(slider),
                    /* lab */  SYMBOL(slider_label(&p[i])),
                    /* ldx */  FLOAT(-2),
                    /* ldy */  FLOAT(-8),
                    /* fsf */  FLOAT(0),
                    /* fs */   FLOAT(10),
                    /* bflcol[0] */ FLOAT(-262144),
                    /* bflcol[1] */ FLOAT(-1),
                    /* bflcol[2] */ FLOAT(-1),
                    /* val */       FLOAT(0),
                    /* steady */    FLOAT(1),
                };
                pd_forwardmess((t_pd*)canvas, nb_el(args), args);
            }
            {
                t_atom args[] = {
                    /** create message object.  it converts slider output to tagged message **/
                    SYMBOL(msg),
                    FLOAT(x_coord + 200),
                    FLOAT(y_coord + 30 * i + 15),
                    SYMBOL(control),
                    FLOAT(i),
                    SYMBOL(dollar_one),
                };
                pd_forwardmess((t_pd*)canvas, nb_el(args), args);
            }
            {
                t_atom args[] = {
                    /** connect slider to message object. **/
                    SYMBOL(connect),
                    FLOAT(obj_no), FLOAT(0),
                    FLOAT(obj_no+1), FLOAT(0)
                };
                pd_forwardmess((t_pd*)canvas, nb_el(args), args);
            }
            {
                t_atom args[] = {
                    /** connect message object to sp_host object. **/
                    SYMBOL(connect),
                    FLOAT(obj_no+1), FLOAT(0),
                    FLOAT(synth_obj_no), FLOAT(0)
                };
                pd_forwardmess((t_pd*)canvas, nb_el(args), args);
            }
        }
    }
    proc_pd_update_gui(x);
}