示例#1
0
t_patchvalue *patchvalue_resolve(t_symbol *category, t_glist *glist,
				 t_class *cls, t_symbol *name)
{
    t_patchboard *pb;
    if (pb = patchboard_find(category))
    {
	t_patchstorage *ps;
	t_patchvalue *pv;
	while (glist)
	{
	    if ((ps = patchboard_findstorage(pb, glist)) &&
		(pv = patchstorage_findvalue(ps, name)))
	    {
		if (*(t_pd *)pv == cls)
		    return (pv);
		else
		    loudbug_bug("patchvalue_resolve");
	    }
	    else if (canvas_isabstraction(glist))
		break;
	    else
		glist = glist->gl_owner;
	}
    }
    return (0);
}
示例#2
0
文件: g_undo.c 项目: porres/pure-data
void canvas_undo_cleardirty(t_canvas *x)
{
        /* clear dirty flags of this canvas
         * and all sub-canvases (but not abstractions/
         */
    t_gobj*y;
    canvas_undo_docleardirty(x);
    for(y=x->gl_list; y; y=y->g_next)
        if (pd_class(&y->g_pd) == canvas_class && !canvas_isabstraction((t_canvas*)y))
            canvas_undo_cleardirty((t_canvas*)y);
}
示例#3
0
文件: g_undo.c 项目: porres/pure-data
static int canvas_undo_doisdirty(t_canvas*x)
{
    t_undo *udo = x?canvas_undo_get(x):0;
    t_gobj*y;
    if (!udo) return 0;
    if (udo->u_last != udo->u_cleanstate) return 1;

    for(y=x->gl_list; y; y=y->g_next)
        if (pd_class(&y->g_pd) == canvas_class && !canvas_isabstraction((t_canvas*)y))
            if (canvas_undo_doisdirty((t_canvas*)y))
                return 1;
    return 0;
}
示例#4
0
文件: g_undo.c 项目: porres/pure-data
t_undo_action *canvas_undo_init(t_canvas *x)
{
    t_undo_action *a = 0;
    t_undo *udo = canvas_undo_get(x);
    if (!udo) return 0;
    a = (t_undo_action *)getbytes(sizeof(*a));
    a->type = 0;
    a->x = x;
    a->next = NULL;

    if (!udo->u_queue)
    {
        DEBUG_UNDO(post("%s: first init", __FUNCTION__));
        //this is the first init
        udo->u_queue = a;
        udo->u_last = a;

        canvas_undo_cleardirty(x);
            /* invalidate clean-state for re-created subpatches
             * since we do not know whether the re-created subpatch
             * is clean or unclean (it's undo-queue got lost when
             * it was deleted), we assume the worst */
        if (!canvas_isabstraction(x))
            udo->u_cleanstate = (void*)1;

        a->prev = NULL;
        a->name = "no";
        if (glist_isvisible(x) && glist_istoplevel(x))
            sys_vgui("pdtk_undomenu .x%lx no no\n", x);
    }
    else
    {
        DEBUG_UNDO(post("%s: re-init %p", __FUNCTION__, udo->u_last->next));
        if (udo->u_last->next)
        {
            //we need to rebranch first then add the new action
            canvas_undo_rebranch(x);
        }
        udo->u_last->next = a;
        a->prev = udo->u_last;
        udo->u_last = a;
    }
    return(a);
}
示例#5
0
t_osc_bndl_u *ocontext_processCanvas(t_canvas *canvas)
{
	t_osc_bndl_u *canvas_bndl = osc_bundle_u_alloc();
	if(canvas == NULL){
		// return empty bundle---this is intentional
		return canvas_bndl;
	}

    t_osc_msg_u *msg = NULL;

    msg = osc_message_u_allocWithAddress("/name");
    osc_message_u_appendString(msg, canvas->gl_name->s_name);
    osc_bundle_u_addMsg(canvas_bndl, msg);

    t_canvasenvironment *c_env = canvas_getenv(canvas);
    
    msg = osc_message_u_allocWithAddress("/path");
    osc_message_u_appendString(msg, c_env->ce_dir->s_name);
    osc_bundle_u_addMsg(canvas_bndl, msg);
    
    msg = osc_message_u_allocWithAddress("/$0");
    osc_message_u_appendInt32(msg, c_env->ce_dollarzero);
    osc_bundle_u_addMsg(canvas_bndl, msg);
    
    msg = osc_message_u_allocWithAddress("/isabstraction");
    osc_message_u_appendBool(msg, !canvas_isabstraction(canvas));
    osc_bundle_u_addMsg(canvas_bndl, msg);
    
    msg = osc_message_u_allocWithAddress("/editmode");
    osc_message_u_appendBool(msg, canvas->gl_edit);
    osc_bundle_u_addMsg(canvas_bndl, msg);

    msg = osc_message_u_allocWithAddress("/font");
    osc_message_u_appendString(msg, sys_font);
    osc_bundle_u_addMsg(canvas_bndl, msg);
    
    msg = osc_message_u_allocWithAddress("/fontsize");
    osc_message_u_appendInt32(msg, canvas->gl_font);
    osc_bundle_u_addMsg(canvas_bndl, msg);
    
    msg = osc_message_u_allocWithAddress("/dirty");
    osc_message_u_appendBool(msg, canvas->gl_dirty);
    osc_bundle_u_addMsg(canvas_bndl, msg);

    if(!canvas_isabstraction(canvas))
    {
        msg = osc_message_u_allocWithAddress("/abstraction/position/x1");
        osc_message_u_appendInt32(msg, canvas->gl_obj.te_xpix);
        osc_bundle_u_addMsg(canvas_bndl, msg);
        
        msg = osc_message_u_allocWithAddress("/abstraction/position/y1");
        osc_message_u_appendInt32(msg, canvas->gl_obj.te_ypix);
        osc_bundle_u_addMsg(canvas_bndl, msg);
    }
    
    msg = osc_message_u_allocWithAddress("/pixwidth");
    osc_message_u_appendInt32(msg, canvas->gl_pixwidth);
    osc_bundle_u_addMsg(canvas_bndl, msg);
    
    msg = osc_message_u_allocWithAddress("/pixheight");
    osc_message_u_appendInt32(msg, canvas->gl_pixheight);
    osc_bundle_u_addMsg(canvas_bndl, msg);
    
    msg = osc_message_u_allocWithAddress("/screen/x1");
    osc_message_u_appendInt32(msg, canvas->gl_screenx1);
    osc_bundle_u_addMsg(canvas_bndl, msg);
    
    msg = osc_message_u_allocWithAddress("/screen/y1");
    osc_message_u_appendInt32(msg, canvas->gl_screeny1);
    osc_bundle_u_addMsg(canvas_bndl, msg);
    
    msg = osc_message_u_allocWithAddress("/screen/x2");
    osc_message_u_appendInt32(msg, canvas->gl_screenx2);
    osc_bundle_u_addMsg(canvas_bndl, msg);
    
    msg = osc_message_u_allocWithAddress("/screen/y2");
    osc_message_u_appendInt32(msg, canvas->gl_screeny2);
    osc_bundle_u_addMsg(canvas_bndl, msg);

    msg = osc_message_u_allocWithAddress("/xmargin");
    osc_message_u_appendInt32(msg, canvas->gl_xmargin);
    osc_bundle_u_addMsg(canvas_bndl, msg);

    msg = osc_message_u_allocWithAddress("/ymargin");
    osc_message_u_appendInt32(msg, canvas->gl_ymargin);
    osc_bundle_u_addMsg(canvas_bndl, msg);
    
    if(canvas->gl_goprect && canvas->gl_owner)
    {
        int x1,y1,x2,y2;
        gobj_getrect(&canvas->gl_obj.te_g, canvas->gl_owner, &x1, &y1, &x2, &y2);

        msg = osc_message_u_allocWithAddress("/graphrect");
        osc_message_u_appendInt32(msg, x1);
        osc_message_u_appendInt32(msg, y1);
        osc_message_u_appendInt32(msg, x2);
        osc_message_u_appendInt32(msg, y2);
        osc_bundle_u_addMsg(canvas_bndl, msg);
    }
    
    t_binbuf *b = NULL;
    b = canvas->gl_obj.te_binbuf;
    
    if(b)
    {
        int argc = binbuf_getnatom(b);
        t_atom *argv = binbuf_getvec(b);

        if(argc)
        {
            t_osc_msg_u *msg_u = NULL;
            int abstr = !canvas_isabstraction(canvas);
            t_osc_err e = omax_util_maxAtomsToOSCMsg_u(&msg_u, gensym("/arguments"), argc-1-abstr, argv+1+abstr);
            if(e)
            {
                if(e){
                    object_error((t_object *)x, "%s", osc_error_string(e));
                    goto exit;
                }
            }
            osc_bundle_u_addMsg(canvas_bndl, msg_u);
        }
        else
        {
            msg = osc_message_u_allocWithAddress("/arguments");
            osc_message_u_appendString(msg, "");
            osc_bundle_u_addMsg(canvas_bndl, msg);
        }
    }
    else
    {
        msg = osc_message_u_allocWithAddress("/arguments");
        osc_message_u_appendString(msg, "");
        osc_bundle_u_addMsg(canvas_bndl, msg);
    }
    
exit:
    if(canvas->gl_owner)
    {
        t_osc_bndl_u *parent_bndl = ocontext_processCanvas(canvas->gl_owner);
		t_osc_msg_u *pmsg = osc_message_u_allocWithAddress("/parent");
		osc_message_u_appendBndl_u(pmsg, parent_bndl);
		osc_bundle_u_addMsg(canvas_bndl, pmsg);
    }
    
	return canvas_bndl;
}