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); }
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); }
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; }
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); }
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; }