hi all, hi Miller,
how about adding to the core the following, minimal interface, and letting people define state-saving externals, like Guenter's state, cyclone's preset, or anything else:
--- m_pd.h~ 2003-10-01 06:05:28.000000000 +0200 +++ m_pd.h 2003-12-02 09:42:37.000000000 +0100 @@ -428,4 +428,8 @@ EXTERN void class_setpropertiesfn(t_class *c, t_propertiesfn f); EXTERN t_propertiesfn class_getpropertiesfn(t_class *c); + /* prototype for functions to store Pd's state to a binbuf */ +typedef int (*t_statefn)(t_gobj *x, t_binbuf *b, int flags); +EXTERN void class_setstatefn(t_class *c, t_statefn f); +EXTERN t_statefn class_getstatefn(t_class *c);
#ifndef PD_CLASS_DEF
--- m_imp.h~ 2003-08-27 18:30:15.000000000 +0200 +++ m_imp.h 2003-12-02 09:33:23.000000000 +0100 @@ -47,4 +47,5 @@ t_savefn c_savefn; /* function to call when saving */ t_propertiesfn c_propertiesfn; /* function to start prop dialog */ + t_statefn c_statefn; /* function to store a state */ int c_floatsignalin; /* onset to float for signal input */ char c_gobj; /* true if is a gobj */
--- m_class.c~ 2003-09-16 06:39:26.000000000 +0200 +++ m_class.c 2003-12-02 09:36:59.000000000 +0100 @@ -209,4 +209,5 @@ c->c_externdir = class_extern_dir; c->c_savefn = (typeflag == CLASS_PATCHABLE ? text_save : class_nosavefn); + c->c_statefn = 0; #if 0 post("class: %s", c->c_name->s_name); @@ -446,4 +447,14 @@ }
+void class_setstatefn(t_class *c, t_statefn f) +{ + c->c_statefn = f; +} + +t_statefn class_getstatefn(t_class *c) +{ + return (c->c_statefn); +} +
That is all, really. Any class with a state, would then define something like the gatom below:
--- g_text.c~ 2003-10-27 22:09:10.000000000 +0100 +++ g_text.c 2003-12-02 09:43:10.000000000 +0100 @@ -862,4 +862,14 @@ }
+static int gatom_state(t_gobj *z, t_binbuf *bb, int flags) +{ + t_gatom *x = (t_gatom *)z; + t_atom at; + SETSYMBOL(&at, gensym("set")); + binbuf_add(bb, 1, &at); + binbuf_add(bb, 1, &x->a_atom); + binbuf_addsemi(bb); + return (0); +}
/* -------------------- widget behavior for text objects ------------ */ @@ -1308,4 +1318,5 @@ class_setwidget(gatom_class, &gatom_widgetbehavior); class_setpropertiesfn(gatom_class, gatom_properties); + class_setstatefn(gatom_class, gatom_state); }
Storing a glist's state into a preset/state/whatever requires only this:
t_gobj *g; t_binbuf *bb = binbuf_new(); int id; for (g = x->x_glist->gl_list, id = 0; g; g = g->g_next, id++) { t_object *ob; t_statefn statefn; if ((ob = pd_checkobject((t_pd *)g)) && (statefn = class_getstatefn(*(t_pd *)g))) { binbuf_addv(bb, "isii", id, gensym(class_getname(*(t_pd *)g)), (int)ob->te_xpix, (int)ob->te_ypix); (*statefn)(g, bb, 0); } } /* do what you like with the binbuf here */ binbuf_free(bb);
Validation could be based on checking an id against a class name, and, optionally, a position.
Krzysztof