Update of /cvsroot/pure-data/externals/miXed/toxy In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv10414
Modified Files: Makefile.objects build_counter notes.txt widget.c widgettype.c Added Files: widget.h widgethandlers.c Removed Files: widgettype.h Log Message: toxy alpha17 and pddp alpha1 (see notes.txt for toxy, pddp and shared)
Index: notes.txt =================================================================== RCS file: /cvsroot/pure-data/externals/miXed/toxy/notes.txt,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** notes.txt 12 Mar 2005 00:19:13 -0000 1.2 --- notes.txt 10 May 2005 17:59:59 -0000 1.3 *************** *** 1,12 **** TODO for toxy * widget ! . cached handlers . better megawidgets . editor: handle semicolons (need to revisit resolution rules) ! . editor: differentiate argument keys from casual #strings (color-names) * tow: canvas-wide and type-on-canvas-wide broadcasting
DONE for toxy
alpha16 * widget: --- 1,34 ---- TODO for toxy * widget ! . push long message handlers if defined, instead of short ! . widgetcontainer: woc and wiw-list . better megawidgets . editor: handle semicolons (need to revisit resolution rules) ! . editor: break editorhook into separate properties, add them in single mode ! . find a way for "package require" to work out-of-the-box on windows * tow: canvas-wide and type-on-canvas-wide broadcasting
DONE for toxy
+ alpha17 + * widget: + . first sketch of an editor widget (bpf), introducing a basic set of rules: + - instance data kept in its own namespace + - gui sends '_data' (replaces '_value') requests to pd, specifying one + of the standard submessages: add, delete, set, get + - pd uses the new special handler for replying: @data + (for the time being, there is only an idle loop between the two sides) + . maintaining a scriptlet collection, which mirrors type and instance + handler properties (including specials: @vis, @new, @free and @data) + . lookup in the mirror for faster and more robust handling of messages + . '@ini' section and 'ini' message removed, after being unified as the + @vis special handler (use 'set @vis' message form for passing options) + . all special handlers support short definitions (inside #. comments) + and long definitions (tagged with #@ comments), however only short + ones may be overriden by instance definitions + . long message handlers are stored, but not used yet + . .wid file header may include requirements (base widget definitions) + . fixed: patch's directory handling in 'redefine' + alpha16 * widget:
Index: widgettype.c =================================================================== RCS file: /cvsroot/pure-data/externals/miXed/toxy/widgettype.c,v retrieving revision 1.12 retrieving revision 1.13 diff -C2 -d -r1.12 -r1.13 *** widgettype.c 12 Mar 2005 00:19:13 -0000 1.12 --- widgettype.c 10 May 2005 18:00:00 -0000 1.13 *************** *** 7,14 **** #include "m_pd.h" #include "common/loud.h" #include "common/dict.h" #include "common/props.h" #include "toxy/scriptlet.h" ! #include "widgettype.h"
static char masterwidget_builtin[] = --- 7,15 ---- #include "m_pd.h" #include "common/loud.h" + #include "common/grow.h" #include "common/dict.h" #include "common/props.h" #include "toxy/scriptlet.h" ! #include "widget.h"
static char masterwidget_builtin[] = *************** *** 17,34 ****
#define WIDGETTYPE_VERBOSE
struct _widgettype { t_pd wt_pd; t_symbol *wt_typekey; /* this is a typemap symbol */ t_symbol *wt_tkclass; /* also 'undefined' flag (gensym symbol) */ ! t_symbol *wt_tkpackage; /* gensym symbol */ int wt_isinternal; /* true if built-in or defined in setup.wid */ ! t_props *wt_options; ! t_props *wt_handlers; ! t_props *wt_arguments; ! t_scriptlet *wt_iniscript; ! t_scriptlet *wt_newscript; ! t_scriptlet *wt_freescript; };
--- 18,38 ----
#define WIDGETTYPE_VERBOSE + #ifdef KRZYSZCZ + //#define WIDGETTYPE_DEBUG + #endif
struct _widgettype { t_pd wt_pd; + t_glist *wt_glist; /* set by the loading widget */ t_symbol *wt_typekey; /* this is a typemap symbol */ t_symbol *wt_tkclass; /* also 'undefined' flag (gensym symbol) */ ! char *wt_requirements; int wt_isinternal; /* true if built-in or defined in setup.wid */ ! t_props *wt_options; ! t_props *wt_handlers; /* defined inside of #. comments */ ! t_props *wt_arguments; ! t_scriptlet *wt_auxscript; ! t_widgethandlers *wt_scripts; /* multiliners tagged with #@ comments */ };
*************** *** 53,60 **** }
! static void widgettype_map(t_widgettype *wt, char *cls, char *pkg) { wt->wt_tkclass = (cls ? gensym(cls) : 0); ! wt->wt_tkpackage = (pkg ? gensym(pkg) : 0); }
--- 57,113 ---- }
! static void widgettype_map(t_widgettype *wt, char *cls, char *req) { wt->wt_tkclass = (cls ? gensym(cls) : 0); ! if (wt->wt_requirements) ! freebytes(wt->wt_requirements, strlen(wt->wt_requirements) + 1); ! if (req && *req) ! { ! char *opt = 0; ! wt->wt_requirements = getbytes(strlen(req) + 1); ! strcpy(wt->wt_requirements, req); ! while (req) ! { ! char *w1 = scriptlet_nextword(req); ! opt = (*req == '-' ? req : (w1 && *w1 == '-' ? w1 : 0)); ! if (opt) ! { ! if (strcmp(opt + 1, "exact")) ! { ! loud_error ! (0, "unknown option "%s" in widget type header", opt); ! opt = 0; ! } ! if (*req == '-') ! { ! req = w1; ! continue; ! } ! else w1 = scriptlet_nextword(w1); ! } ! if (*req >= '0' && *req <= '9') ! { ! loud_error ! (0, "invalid base widget name "%s" in widget type header", ! req); ! req = w1; ! } ! else ! { ! t_widgettype *base; ! char *ver = (w1 && *w1 >= '0' && *w1 <= '9' ? w1 : 0); ! char *w2 = (ver ? scriptlet_nextword(ver) : w1); ! #if 1 ! loudbug_post("require %s (version %s %s)", ! req, (opt ? opt : ">="), (ver ? ver : "any")); ! #endif ! base = widgettype_get(gensym(req), ver, opt, wt->wt_glist); ! if (!base->wt_tkclass) ! loud_error(0, "missing base widget file "%s.wid"", req); ! req = w2; ! } ! } ! } ! else wt->wt_requirements = 0; }
*************** *** 62,68 **** { props_clearall(wt->wt_options); ! scriptlet_reset(wt->wt_iniscript); ! scriptlet_reset(wt->wt_newscript); ! scriptlet_reset(wt->wt_freescript); }
--- 115,119 ---- { props_clearall(wt->wt_options); ! widgethandlers_reset(wt->wt_scripts); }
*************** *** 72,80 **** { loudbug_startpost("widgettype free... "); dict_unbind(mw->mw_typemap, (t_pd *)wt, wt->wt_typekey); props_freeall(wt->wt_options); ! scriptlet_free(wt->wt_iniscript); ! scriptlet_free(wt->wt_newscript); ! scriptlet_free(wt->wt_freescript); pd_free((t_pd *)wt); loudbug_post("done"); --- 123,132 ---- { loudbug_startpost("widgettype free... "); + if (wt->wt_requirements) + freebytes(wt->wt_requirements, strlen(wt->wt_requirements) + 1); dict_unbind(mw->mw_typemap, (t_pd *)wt, wt->wt_typekey); props_freeall(wt->wt_options); ! scriptlet_free(wt->wt_auxscript); ! widgethandlers_free(wt->wt_scripts); pd_free((t_pd *)wt); loudbug_post("done"); *************** *** 82,101 **** #endif
! static t_widgettype *widgettype_new(t_masterwidget *mw, ! char *typ, char *cls, char *pkg) { t_widgettype *wt = (t_widgettype *)pd_new(widgettype_class); wt->wt_typekey = dict_key(mw->mw_typemap, typ); ! widgettype_map(wt, cls, pkg); wt->wt_isinternal = 0; wt->wt_options = props_new(0, "option", "-", 0, 0); wt->wt_handlers = props_new(0, "handler", "@", wt->wt_options, 0); wt->wt_arguments = props_new(0, "argument", "#", wt->wt_options, 0); ! wt->wt_iniscript = scriptlet_new((t_pd *)wt, mw->mw_target, mw->mw_target, ! 0, 0, widgettype_cvhook); ! wt->wt_newscript = scriptlet_new((t_pd *)wt, mw->mw_target, mw->mw_target, 0, 0, widgettype_cvhook); ! wt->wt_freescript = scriptlet_new((t_pd *)wt, mw->mw_target, mw->mw_target, ! 0, 0, widgettype_cvhook); dict_bind(mw->mw_typemap, (t_pd *)wt, wt->wt_typekey); return (wt); --- 134,151 ---- #endif
! static t_widgettype *widgettype_new(t_masterwidget *mw, char *typ, char *cls, ! char *req, t_glist *glist) { t_widgettype *wt = (t_widgettype *)pd_new(widgettype_class); + wt->wt_glist = glist; wt->wt_typekey = dict_key(mw->mw_typemap, typ); ! widgettype_map(wt, cls, req); wt->wt_isinternal = 0; wt->wt_options = props_new(0, "option", "-", 0, 0); wt->wt_handlers = props_new(0, "handler", "@", wt->wt_options, 0); wt->wt_arguments = props_new(0, "argument", "#", wt->wt_options, 0); ! wt->wt_auxscript = scriptlet_new((t_pd *)wt, mw->mw_target, mw->mw_target, 0, 0, widgettype_cvhook); ! wt->wt_scripts = widgethandlers_new(wt->wt_auxscript); dict_bind(mw->mw_typemap, (t_pd *)wt, wt->wt_typekey); return (wt); *************** *** 118,122 **** t_widgettype *typeval; char *cls = scriptlet_nextword(buf); ! char *pkg = (cls ? scriptlet_nextword(cls) : 0); mw->mw_parsedtype = 0; if (!cls) --- 168,172 ---- t_widgettype *typeval; char *cls = scriptlet_nextword(buf); ! char *req = (cls ? scriptlet_nextword(cls) : 0); mw->mw_parsedtype = 0; if (!cls) *************** *** 144,155 **** } } - if (pkg) - /* carve out a single word as pkg, LATER rethink */ - scriptlet_nextword(pkg); if (typeval) ! widgettype_map(typeval, cls, pkg); else { ! typeval = widgettype_new(mw, buf, cls, pkg); typeval->wt_isinternal = (caller == (t_pd *)mw); } --- 194,202 ---- } } if (typeval) ! widgettype_map(typeval, cls, req); else { ! typeval = widgettype_new(mw, buf, cls, req, 0); typeval->wt_isinternal = (caller == (t_pd *)mw); } *************** *** 158,163 **** loudbug_post("adding widget type '%s'", typeval->wt_typekey->s_name); #endif ! scriptlet_reset(typeval->wt_iniscript); ! return (typeval->wt_iniscript); } else if (sel == '.') --- 205,218 ---- loudbug_post("adding widget type '%s'", typeval->wt_typekey->s_name); #endif ! widgethandlers_reset(typeval->wt_scripts); ! ! /* What should follow after the header? In a cleaner layout, perhaps, ! the header would be placed at the top, followed by setup. Any ! handler would require an explicit #@ tag, and the next statement ! would return SCRIPTLET_UNLOCK. LATER revisit -- the change breaks ! old .wid files, so better wait for a more robust parsing, which ! notices dot-sequences in the setup part and warns about them. ! Setup before header will be valid after the change, anyway. */ ! return (widgethandlers_getvis(typeval->wt_scripts)); } else if (sel == '.') *************** *** 193,216 **** scriptlet_nextword(buf); if (mw->mw_parsedtype) ! { ! if (!strcmp(buf, "vis") || !strcmp(buf, "ini")) ! /* already reset */ ! return (mw->mw_parsedtype->wt_iniscript); ! else if (!strcmp(buf, "new")) ! { ! scriptlet_reset(mw->mw_parsedtype->wt_newscript); ! return (mw->mw_parsedtype->wt_newscript); ! } ! else if (!strcmp(buf, "free")) ! { ! scriptlet_reset(mw->mw_parsedtype->wt_freescript); ! return (mw->mw_parsedtype->wt_freescript); ! } ! else ! { ! /* LATER start parsing any method handler: search for it, ! create if not found, return */ ! } ! } } return (SCRIPTLET_UNLOCK); --- 248,253 ---- scriptlet_nextword(buf); if (mw->mw_parsedtype) ! return (widgethandlers_takeany(mw->mw_parsedtype->wt_scripts, ! gensym(buf))); } return (SCRIPTLET_UNLOCK); *************** *** 224,228 **** t_scriptlet *mwsp = scriptlet_new((t_pd *)masterwidget, masterwidget->mw_target, ! masterwidget->mw_target, 0, canvas_getcurrent(), 0); masterwidget->mw_parsedtype = wt;
--- 261,265 ---- t_scriptlet *mwsp = scriptlet_new((t_pd *)masterwidget, masterwidget->mw_target, ! masterwidget->mw_target, 0, wt->wt_glist, 0); masterwidget->mw_parsedtype = wt;
*************** *** 260,264 **** }
! t_widgettype *widgettype_get(t_symbol *s) { t_widgettype *wt = widgettype_find(s); --- 297,301 ---- }
! t_widgettype *widgettype_get(t_symbol *s, char *ver, char *opt, t_glist *glist) { t_widgettype *wt = widgettype_find(s); *************** *** 269,273 **** { /* first instance of a type not defined in setup.wid */ ! wt = widgettype_new(masterwidget, s->s_name, 0, 0); widgettype_doload(wt, s); } --- 306,311 ---- { /* first instance of a type not defined in setup.wid */ ! wt = widgettype_new(masterwidget, s->s_name, 0, 0, glist); ! /* LATER use version and option */ widgettype_doload(wt, s); } *************** *** 275,287 **** }
! t_widgettype *widgettype_reload(t_symbol *s) { t_widgettype *wt = widgettype_find(s); if (!wt) /* first instance of a type not defined in setup.wid */ ! wt = widgettype_new(masterwidget, s->s_name, 0, 0); if (wt && !wt->wt_isinternal) { /* LATER consider safe-loading through a temporary type */ widgettype_clear(wt); if (widgettype_doload(wt, s)) return (wt); --- 313,326 ---- }
! t_widgettype *widgettype_reload(t_symbol *s, t_glist *glist) { t_widgettype *wt = widgettype_find(s); if (!wt) /* first instance of a type not defined in setup.wid */ ! wt = widgettype_new(masterwidget, s->s_name, 0, 0, glist); if (wt && !wt->wt_isinternal) { /* LATER consider safe-loading through a temporary type */ widgettype_clear(wt); + wt->wt_glist = glist; if (widgettype_doload(wt, s)) return (wt); *************** *** 315,352 **** }
! char *widgettype_getinitializer(t_widgettype *wt, int *szp) ! { ! return (scriptlet_getcontents(wt->wt_iniscript, szp)); ! } ! ! char *widgettype_getconstructor(t_widgettype *wt, int *szp) ! { ! return (scriptlet_getcontents(wt->wt_newscript, szp)); ! } ! ! char *widgettype_getdestructor(t_widgettype *wt, int *szp) ! { ! return (scriptlet_getcontents(wt->wt_freescript, szp)); ! } ! ! int widgettype_ievaluate(t_widgettype *wt, t_scriptlet *outsp, ! int visedonly, int ac, t_atom *av, t_props *argprops) ! { ! return (scriptlet_evaluate(wt->wt_iniscript, outsp, ! visedonly, ac, av, argprops)); ! } ! ! int widgettype_cevaluate(t_widgettype *wt, t_scriptlet *outsp, ! int visedonly, int ac, t_atom *av, t_props *argprops) ! { ! return (scriptlet_evaluate(wt->wt_newscript, outsp, ! visedonly, ac, av, argprops)); ! } ! ! int widgettype_devaluate(t_widgettype *wt, t_scriptlet *outsp, ! int visedonly, int ac, t_atom *av, t_props *argprops) { ! return (scriptlet_evaluate(wt->wt_freescript, outsp, ! visedonly, ac, av, argprops)); }
--- 354,360 ---- }
! t_widgethandlers *widgettype_getscripts(t_widgettype *wt) { ! return (wt->wt_scripts); }
*************** *** 435,441 **** if (rcresult == SCRIPTLET_OK) { ! t_scriptlet *sp = ! scriptlet_new((t_pd *)masterwidget, masterwidget->mw_target, ! masterwidget->mw_target, 0, 0, 0); if (scriptlet_evaluate(masterwidget->mw_setupscript, sp, 0, 0, 0, 0)) scriptlet_push(sp); --- 443,447 ---- if (rcresult == SCRIPTLET_OK) { ! t_scriptlet *sp = scriptlet_newalike(masterwidget->mw_setupscript); if (scriptlet_evaluate(masterwidget->mw_setupscript, sp, 0, 0, 0, 0)) scriptlet_push(sp);
Index: build_counter =================================================================== RCS file: /cvsroot/pure-data/externals/miXed/toxy/build_counter,v retrieving revision 1.14 retrieving revision 1.15 diff -C2 -d -r1.14 -r1.15 *** build_counter 12 Mar 2005 00:19:13 -0000 1.14 --- build_counter 10 May 2005 17:59:58 -0000 1.15 *************** *** 1,7 **** #define TOXY_VERSION "0.1" #define TOXY_RELEASE "alpha" ! #define TOXY_BUILD 16
#if 0 ! TOXY_SNAPSHOT = 0.1-alpha16 #endif --- 1,7 ---- #define TOXY_VERSION "0.1" #define TOXY_RELEASE "alpha" ! #define TOXY_BUILD 17
#if 0 ! TOXY_SNAPSHOT = 0.1-alpha17 #endif
--- NEW FILE: widgethandlers.c --- /* Copyright (c) 2005 krzYszcz and others. * For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. */
#include <stdio.h> #include "m_pd.h" #include "common/loud.h" #include "common/props.h" #include "toxy/scriptlet.h" #include "widget.h"
#ifdef KRZYSZCZ //#define WIDGETHANDLERS_DEBUG #endif
typedef struct _widgetscript { t_symbol *ws_selector; t_scriptlet *ws_script; struct _widgetscript *ws_next; } t_widgetscript;
struct _widgethandlers { t_scriptlet *wh_vis; t_scriptlet *wh_new; t_scriptlet *wh_free; t_scriptlet *wh_data; t_scriptlet *wh_bang; t_scriptlet *wh_float; t_scriptlet *wh_symbol; t_widgetscript *wh_others; };
static t_symbol *widgetps_vis = 0; static t_symbol *widgetps_new; static t_symbol *widgetps_free; static t_symbol *widgetps_data;
t_widgethandlers *widgethandlers_new(t_scriptlet *generator) { t_widgethandlers *wh = getbytes(sizeof(*wh)); if (!widgetps_vis) { widgetps_vis = gensym("vis"); widgetps_new = gensym("new"); widgetps_free = gensym("free"); widgetps_data = gensym("data"); } wh->wh_vis = scriptlet_newalike(generator); wh->wh_new = scriptlet_newalike(generator); wh->wh_free = scriptlet_newalike(generator); wh->wh_data = scriptlet_newalike(generator); wh->wh_bang = scriptlet_newalike(generator); wh->wh_float = scriptlet_newalike(generator); wh->wh_symbol = scriptlet_newalike(generator); wh->wh_others = 0; return (wh); }
void widgethandlers_free(t_widgethandlers *wh) { t_widgetscript *ws, *wsnext = wh->wh_others; scriptlet_free(wh->wh_vis); scriptlet_free(wh->wh_new); scriptlet_free(wh->wh_free); scriptlet_free(wh->wh_data); scriptlet_free(wh->wh_bang); scriptlet_free(wh->wh_float); scriptlet_free(wh->wh_symbol); while (ws = wsnext) { wsnext = ws->ws_next; scriptlet_free(ws->ws_script); freebytes(ws, sizeof(*ws)); } freebytes(wh, sizeof(*wh)); }
void widgethandlers_reset(t_widgethandlers *wh) { t_widgetscript *ws = wh->wh_others; scriptlet_reset(wh->wh_vis); scriptlet_reset(wh->wh_new); scriptlet_reset(wh->wh_free); scriptlet_reset(wh->wh_data); scriptlet_reset(wh->wh_bang); scriptlet_reset(wh->wh_float); scriptlet_reset(wh->wh_symbol); for (ws = wh->wh_others; ws; ws = ws->ws_next) scriptlet_reset(ws->ws_script); }
static t_widgetscript *widgethandlers_takeotherscript(t_widgethandlers *wh, t_symbol *selector) { t_widgetscript *ws; for (ws = wh->wh_others; ws; ws = ws->ws_next) if (ws->ws_selector == selector) break; if (!ws) { ws = getbytes(sizeof(*ws)); ws->ws_selector = selector; ws->ws_script = scriptlet_newalike(wh->wh_vis); ws->ws_next = wh->wh_others; wh->wh_others = ws; } return (ws); }
t_scriptlet *widgethandlers_takeany(t_widgethandlers *wh, t_symbol *selector) { t_scriptlet *sp; if (selector == widgetps_vis) sp = wh->wh_vis; else if (selector == widgetps_new) sp = wh->wh_new; else if (selector == widgetps_free) sp = wh->wh_free; else if (selector == widgetps_data) sp = wh->wh_data; else if (selector == &s_bang) sp = wh->wh_bang; else if (selector == &s_float) sp = wh->wh_float; else if (selector == &s_symbol) sp = wh->wh_symbol; else { t_widgetscript *ws; if (ws = widgethandlers_takeotherscript(wh, selector)) sp = ws->ws_script; else { loudbug_bug("widgethandlers_takeany"); sp = 0; } } return (sp); }
void widgethandlers_fill(t_widgethandlers *wh, t_props *pp) { int ac; t_atom *ap; if (ap = props_getfirst(pp, &ac)) { do { if (ac > 1 && ap->a_type == A_SYMBOL && ap->a_w.w_symbol->s_name[0] == '@' && ap->a_w.w_symbol->s_name[1] != 0) { t_symbol *sel = gensym(ap->a_w.w_symbol->s_name + 1); t_scriptlet *sp; if (sp = widgethandlers_takeany(wh, sel)) { scriptlet_reset(sp); scriptlet_add(sp, 0, 0, ac - 1, ap + 1); } } else loudbug_bug("widgethandlers_fill"); } while (ap = props_getnext(pp, &ac)); } }
t_scriptlet *widgethandlers_getvis(t_widgethandlers *wh) { return (wh->wh_vis); }
t_scriptlet *widgethandlers_getnew(t_widgethandlers *wh) { return (wh->wh_new); }
t_scriptlet *widgethandlers_getfree(t_widgethandlers *wh) { return (wh->wh_free); }
t_scriptlet *widgethandlers_getdata(t_widgethandlers *wh) { return (wh->wh_data); }
t_scriptlet *widgethandlers_getbang(t_widgethandlers *wh) { return (wh->wh_bang); }
t_scriptlet *widgethandlers_getfloat(t_widgethandlers *wh) { return (wh->wh_float); }
t_scriptlet *widgethandlers_getsymbol(t_widgethandlers *wh) { return (wh->wh_symbol); }
t_scriptlet *widgethandlers_getother(t_widgethandlers *wh, t_symbol *selector) { t_widgetscript *ws; for (ws = wh->wh_others; ws; ws = ws->ws_next) if (ws->ws_selector == selector) return (ws->ws_script); return (0); }
--- NEW FILE: widget.h --- /* Copyright (c) 2003-2005 krzYszcz and others. * For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. */
#ifndef __WIDGET_H__ #define __WIDGET_H__
EXTERN_STRUCT _widgettype; #define t_widgettype struct _widgettype
EXTERN_STRUCT _masterwidget; #define t_masterwidget struct _masterwidget
EXTERN_STRUCT _widgethandlers; #define t_widgethandlers struct _widgethandlers
t_widgettype *widgettype_find(t_symbol *s); t_widgettype *widgettype_get(t_symbol *s, char *ver, char *opt, t_glist *glist); t_widgettype *widgettype_reload(t_symbol *s, t_glist *glist); int widgettype_isdefined(t_widgettype *wt); t_symbol *widgettype_tkclass(t_widgettype *wt); t_props *widgettype_getoptions(t_widgettype *wt); t_props *widgettype_gethandlers(t_widgettype *wt); t_props *widgettype_getarguments(t_widgettype *wt); t_widgethandlers *widgettype_getscripts(t_widgettype *wt); char *widgettype_propname(t_symbol *s); void widgettype_setup(void);
char *masterwidget_getcontents(int *szp); void masterwidget_validate(void);
t_widgethandlers *widgethandlers_new(t_scriptlet *generator); void widgethandlers_free(t_widgethandlers *wh); void widgethandlers_reset(t_widgethandlers *wh); void widgethandlers_fill(t_widgethandlers *wh, t_props *pp); t_scriptlet *widgethandlers_getvis(t_widgethandlers *wh); t_scriptlet *widgethandlers_getnew(t_widgethandlers *wh); t_scriptlet *widgethandlers_getfree(t_widgethandlers *wh); t_scriptlet *widgethandlers_getdata(t_widgethandlers *wh); t_scriptlet *widgethandlers_getbang(t_widgethandlers *wh); t_scriptlet *widgethandlers_getfloat(t_widgethandlers *wh); t_scriptlet *widgethandlers_getsymbol(t_widgethandlers *wh); t_scriptlet *widgethandlers_getother(t_widgethandlers *wh, t_symbol *selector); t_scriptlet *widgethandlers_takeany(t_widgethandlers *wh, t_symbol *selector);
#endif
Index: Makefile.objects =================================================================== RCS file: /cvsroot/pure-data/externals/miXed/toxy/Makefile.objects,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** Makefile.objects 27 Jan 2005 14:42:54 -0000 1.4 --- Makefile.objects 10 May 2005 17:59:58 -0000 1.5 *************** *** 44,46 **** toxy/scriptlet.o
! WIDGET_PRIVATEOBJECTS = widgettype.o --- 44,46 ---- toxy/scriptlet.o
! WIDGET_PRIVATEOBJECTS = widgettype.o widgethandlers.o
--- widgettype.h DELETED ---
Index: widget.c =================================================================== RCS file: /cvsroot/pure-data/externals/miXed/toxy/widget.c,v retrieving revision 1.16 retrieving revision 1.17 diff -C2 -d -r1.16 -r1.17 *** widget.c 12 Mar 2005 00:19:13 -0000 1.16 --- widget.c 10 May 2005 17:59:59 -0000 1.17 *************** *** 15,19 **** #include "common/props.h" #include "toxy/scriptlet.h" ! #include "widgettype.h" #include "build_counter"
--- 15,19 ---- #include "common/props.h" #include "toxy/scriptlet.h" ! #include "widget.h" #include "build_counter"
*************** *** 22,26 ****
#ifdef KRZYSZCZ ! //#define WIDGET_DEBUG //#define TOW_DEBUG //#define WIDGET_PROFILE --- 22,26 ----
#ifdef KRZYSZCZ ! #define WIDGET_DEBUG //#define TOW_DEBUG //#define WIDGET_PROFILE *************** *** 41,56 **** } t_widgetentry;
- /* move to widgettype.c&h */ - typedef struct _widgethandlers - { - t_scriptlet *wh_initializer; - t_scriptlet *wh_new; - t_scriptlet *wh_free; - t_scriptlet *wh_bang; - t_scriptlet *wh_float; - t_scriptlet *wh_symbol; - /* ... (varsized vector) */ - } t_widgethandlers; - typedef struct _widget { --- 41,44 ---- *************** *** 73,78 **** t_props *x_diffhandlers; /* same for handlers */ t_props *x_diffarguments; /* same for arguments */ ! t_widgethandlers x_cache; /* actual handlers */ ! t_scriptlet *x_iniscript; /* instance initializer */ t_scriptlet *x_optscript; /* option scriptlet */ t_scriptlet *x_auxscript; /* auxiliary scriptlet */ --- 61,65 ---- t_props *x_diffhandlers; /* same for handlers */ t_props *x_diffarguments; /* same for arguments */ ! t_widgethandlers *x_hooks; /* actual handlers (short definitions) */ t_scriptlet *x_optscript; /* option scriptlet */ t_scriptlet *x_auxscript; /* auxiliary scriptlet */ *************** *** 87,90 **** --- 74,78 ---- int x_update; /* see widget_update() */ int x_vised; + int x_constructed; t_clock *x_transclock; t_towentry *x_towlist; *************** *** 113,121 **** static t_symbol *widgetps_mouse; static t_symbol *widgetps_motion; ! static t_symbol *widgetps_atbang; ! static t_symbol *widgetps_atfloat; ! static t_symbol *widgetps_atsymbol; ! static t_symbol *widgetps_atstore; ! static t_symbol *widgetps_atrestore;
#ifdef WIDGET_PROFILE --- 101,112 ---- static t_symbol *widgetps_mouse; static t_symbol *widgetps_motion; ! static t_symbol *widgetps_vis; ! static t_symbol *widgetps_new; ! static t_symbol *widgetps_free; ! static t_symbol *widgetps_data; ! static t_symbol *widgetps_add; ! static t_symbol *widgetps_delete; ! static t_symbol *widgetps_set; ! static t_symbol *widgetps_get;
#ifdef WIDGET_PROFILE *************** *** 362,408 **** }
! static void widget_pushinits(t_widget *x) { if (widgettype_isdefined(x->x_typedef)) { ! int sz; ! if (widgettype_ievaluate(x->x_typedef, x->x_transient, 0, ! 0, 0, x->x_xargs)) ! scriptlet_vpush(x->x_transient, "typeinit"); ! else if (*widgettype_getinitializer(x->x_typedef, &sz) && sz > 0) ! loudbug_bug("widget_pushinits (type)"); } ! if (scriptlet_evaluate(x->x_iniscript, x->x_transient, 0, 0, 0, x->x_xargs)) ! scriptlet_vpush(x->x_transient, "iteminit"); ! else if (!scriptlet_isempty(x->x_iniscript)) ! loudbug_bug("widget_pushinits (instance)"); }
! static void widget_pushconstructors(t_widget *x) { /* LATER master constructor */ if (widgettype_isdefined(x->x_typedef)) { ! int sz; ! if (widgettype_cevaluate(x->x_typedef, x->x_transient, 0, ! 0, 0, x->x_xargs)) ! scriptlet_push(x->x_transient); ! else if (*widgettype_getconstructor(x->x_typedef, &sz) && sz > 0) ! loudbug_bug("widget_pushconstructors (type)"); } }
! static void widget_pushdestructors(t_widget *x) { /* LATER master destructor */ if (widgettype_isdefined(x->x_typedef)) { ! int sz; ! if (widgettype_devaluate(x->x_typedef, x->x_transient, 0, ! 0, 0, x->x_xargs)) scriptlet_push(x->x_transient); ! else if (*widgettype_getdestructor(x->x_typedef, &sz) && sz > 0) ! loudbug_bug("widget_pushdestructors (type)"); } }
--- 353,418 ---- }
! static void widget_pushonehook(t_widget *x, t_scriptlet *sp, char *vname) ! { ! if (scriptlet_evaluate(sp, x->x_transient, 0, 0, 0, x->x_xargs)) ! scriptlet_vpush(x->x_transient, vname); ! else if (!scriptlet_isempty(sp)) ! loudbug_bug("widget_pushonehook (%s)", vname); ! } ! ! static void widget_pushvishooks(t_widget *x) { if (widgettype_isdefined(x->x_typedef)) { ! t_widgethandlers *wh = widgettype_getscripts(x->x_typedef); ! widget_pushonehook(x, widgethandlers_getvis(wh), "longvishook"); } ! widget_pushonehook(x, widgethandlers_getvis(x->x_hooks), "shortvishook"); }
! static void widget_pushnewhooks(t_widget *x) { /* LATER master constructor */ if (widgettype_isdefined(x->x_typedef)) { ! t_widgethandlers *wh = widgettype_getscripts(x->x_typedef); ! widget_pushonehook(x, widgethandlers_getnew(wh), "longnewhook"); } + widget_pushonehook(x, widgethandlers_getnew(x->x_hooks), "shortnewhook"); }
! static void widget_pushfreehooks(t_widget *x) { /* LATER master destructor */ if (widgettype_isdefined(x->x_typedef)) { ! t_widgethandlers *wh = widgettype_getscripts(x->x_typedef); ! widget_pushonehook(x, widgethandlers_getfree(wh), "longfreehook"); ! } ! widget_pushonehook(x, widgethandlers_getfree(x->x_hooks), "shortfreehook"); ! } ! ! static void widget_pushdatahooks(t_widget *x, int ac, t_atom *av) ! { ! t_scriptlet *sp; ! WIDGETPROFILE_HANDLER_ENTER; ! if (!widgettype_isdefined(x->x_typedef) ! || !(sp = widgethandlers_getdata(widgettype_getscripts(x->x_typedef))) ! || scriptlet_isempty(sp)) ! sp = widgethandlers_getdata(x->x_hooks); ! if (sp) ! { ! WIDGETPROFILE_HANDLER_EVAL; ! if (scriptlet_evaluate(sp, x->x_transient, 0, ac, av, x->x_xargs)) ! { ! WIDGETPROFILE_HANDLER_PUSH; scriptlet_push(x->x_transient); ! } ! else if (!scriptlet_isempty(sp)) ! loudbug_bug("widget_pushdatahooks (%s)", ! (sp == widgethandlers_getdata(x->x_hooks) ? ! "short" : "long")); } + WIDGETPROFILE_HANDLER_QUIT; }
*************** *** 429,433 **** #endif widget_pushoptions(x, 0); ! widget_pushinits(x); sys_vgui("::toxy::item_vis %s %s %s %s %s %s %g %g\n", x->x_tkclass->s_name, mypathname, --- 439,448 ---- #endif widget_pushoptions(x, 0); ! widget_pushvishooks(x); ! if (!x->x_constructed) ! { ! widget_pushnewhooks(x); ! x->x_constructed = 1; ! } sys_vgui("::toxy::item_vis %s %s %s %s %s %s %g %g\n", x->x_tkclass->s_name, mypathname, *************** *** 567,573 **** props_diff(x->x_diffhandlers, widgettype_gethandlers(x->x_typedef), x->x_handlers); ! /* LATER cache handlers. We get here both during construction, and after any change ! in our handlers -- the cache never stales. */ } else if (op == x->x_arguments) --- 582,591 ---- props_diff(x->x_diffhandlers, widgettype_gethandlers(x->x_typedef), x->x_handlers); ! /* This is the only point where mirroring of handlers is performed. We get here both during construction, and after any change ! in our handlers -- the mirror never stales. */ ! widgethandlers_reset(x->x_hooks); ! widgethandlers_fill(x->x_hooks, x->x_diffhandlers); ! widgethandlers_fill(x->x_hooks, x->x_handlers); } else if (op == x->x_arguments) *************** *** 647,675 **** else { ! /* LATER cache this */ ! int hlen; ! t_atom *hp; ! t_symbol *sel; ! char buf[MAXPDSTRING]; WIDGETPROFILE_HANDLER_ENTER; ! buf[0] = '@'; ! strcpy(buf + 1, s->s_name); ! sel = gensym(buf); ! if (((hp = props_getone(x->x_handlers, sel, &hlen)) || ! (hp = props_getone(widgettype_gethandlers(x->x_typedef), ! sel, &hlen))) ! && hlen > 1) { WIDGETPROFILE_HANDLER_EVAL; ! scriptlet_reset(x->x_auxscript); ! scriptlet_add(x->x_auxscript, 0, 0, hlen - 1, hp + 1); ! if (scriptlet_evaluate(x->x_auxscript, x->x_transient, 1, ! ac, av, x->x_xargs)) { WIDGETPROFILE_HANDLER_PUSH; scriptlet_push(x->x_transient); } } ! else loud_nomethod((t_pd *)x, s); WIDGETPROFILE_HANDLER_QUIT; } --- 665,690 ---- else { ! /* FIXME use long defs too, cf widget_pushdatahooks() */ ! t_scriptlet *sp; WIDGETPROFILE_HANDLER_ENTER; ! if (sp = widgethandlers_getother(x->x_hooks, s)) { WIDGETPROFILE_HANDLER_EVAL; ! if (scriptlet_evaluate(sp, x->x_transient, ! 1, ac, av, x->x_xargs)) { WIDGETPROFILE_HANDLER_PUSH; scriptlet_push(x->x_transient); } + else if (!scriptlet_isempty(sp)) + loudbug_bug("widget_anything"); } ! else if (s == widgetps_vis || s == widgetps_new || ! s == widgetps_free || s == widgetps_data) ! loud_error((t_pd *)x, ! "explicit call of the special handler "%s"", ! s->s_name); ! else ! loud_nomethod((t_pd *)x, s); WIDGETPROFILE_HANDLER_QUIT; } *************** *** 677,772 **** }
! /* LATER cache this */ static void widget_bang(t_widget *x) { ! int ac; ! t_atom *av; WIDGETPROFILE_HANDLER_ENTER; ! if ((av = props_getone(x->x_handlers, widgetps_atbang, &ac)) || ! (av = props_getone(widgettype_gethandlers(x->x_typedef), ! widgetps_atbang, &ac))) { ! if (ac > 1) ! { ! WIDGETPROFILE_HANDLER_EVAL; ! scriptlet_reset(x->x_transient); ! scriptlet_add(x->x_transient, 1, 1, ac - 1, av + 1); ! WIDGETPROFILE_HANDLER_PUSH; ! scriptlet_push(x->x_transient); ! } } WIDGETPROFILE_HANDLER_QUIT; }
! /* LATER cache this */ static void widget_float(t_widget *x, t_float f) { ! int ac; ! t_atom *av; WIDGETPROFILE_HANDLER_ENTER; ! if ((av = props_getone(x->x_handlers, widgetps_atfloat, &ac)) || ! (av = props_getone(widgettype_gethandlers(x->x_typedef), ! widgetps_atfloat, &ac))) { ! if (ac > 1) ! { ! t_atom at; ! WIDGETPROFILE_HANDLER_EVAL; ! SETFLOAT(&at, f); ! scriptlet_reset(x->x_auxscript); ! scriptlet_add(x->x_auxscript, 0, 0, ac - 1, av + 1); ! if (scriptlet_evaluate(x->x_auxscript, x->x_transient, 1, ! 1, &at, x->x_xargs)) ! { ! WIDGETPROFILE_HANDLER_PUSH; ! scriptlet_push(x->x_transient); ! } ! } } WIDGETPROFILE_HANDLER_QUIT; }
! /* LATER cache this */ static void widget_symbol(t_widget *x, t_symbol *s) { ! int ac; ! t_atom *av; WIDGETPROFILE_HANDLER_ENTER; ! if ((av = props_getone(x->x_handlers, widgetps_atsymbol, &ac)) || ! (av = props_getone(widgettype_gethandlers(x->x_typedef), ! widgetps_atsymbol, &ac))) { ! if (ac > 1) ! { ! t_atom at; ! WIDGETPROFILE_HANDLER_EVAL; ! SETSYMBOL(&at, s); ! scriptlet_reset(x->x_auxscript); ! scriptlet_add(x->x_auxscript, 0, 0, ac - 1, av + 1); ! if (scriptlet_evaluate(x->x_auxscript, x->x_transient, 1, ! 1, &at, x->x_xargs)) ! { ! WIDGETPROFILE_HANDLER_PUSH; ! scriptlet_push(x->x_transient); ! } ! } } WIDGETPROFILE_HANDLER_QUIT; }
- static void widget_store(t_widget *x, t_symbol *s) - { - if (s == &s_) - s = x->x_varname; - /* FIXME */ - } - - static void widget_restore(t_widget *x, t_symbol *s) - { - if (s == &s_) - s = x->x_varname; - /* FIXME */ - } - static void widget_set(t_widget *x, t_symbol *s, int ac, t_atom *av) { --- 692,750 ---- }
! /* FIXME use long defs too, cf widget_pushdatahooks() */ static void widget_bang(t_widget *x) { ! t_scriptlet *sp; WIDGETPROFILE_HANDLER_ENTER; ! sp = widgethandlers_getbang(x->x_hooks); ! WIDGETPROFILE_HANDLER_EVAL; ! if (scriptlet_evaluate(sp, x->x_transient, 1, 0, 0, x->x_xargs)) { ! WIDGETPROFILE_HANDLER_PUSH; ! scriptlet_push(x->x_transient); } + else if (!scriptlet_isempty(sp)) + loudbug_bug("widget_bang"); WIDGETPROFILE_HANDLER_QUIT; }
! /* FIXME use long defs too, cf widget_pushdatahooks() */ static void widget_float(t_widget *x, t_float f) { ! t_scriptlet *sp; ! t_atom at; WIDGETPROFILE_HANDLER_ENTER; ! sp = widgethandlers_getfloat(x->x_hooks); ! WIDGETPROFILE_HANDLER_EVAL; ! SETFLOAT(&at, f); ! if (scriptlet_evaluate(sp, x->x_transient, 1, 1, &at, x->x_xargs)) { ! WIDGETPROFILE_HANDLER_PUSH; ! scriptlet_push(x->x_transient); } + else if (!scriptlet_isempty(sp)) + loudbug_bug("widget_float"); WIDGETPROFILE_HANDLER_QUIT; }
! /* FIXME use long defs too, cf widget_pushdatahooks() */ static void widget_symbol(t_widget *x, t_symbol *s) { ! t_scriptlet *sp; ! t_atom at; WIDGETPROFILE_HANDLER_ENTER; ! sp = widgethandlers_getsymbol(x->x_hooks); ! WIDGETPROFILE_HANDLER_EVAL; ! SETSYMBOL(&at, s); ! if (scriptlet_evaluate(sp, x->x_transient, 1, 1, &at, x->x_xargs)) { ! WIDGETPROFILE_HANDLER_PUSH; ! scriptlet_push(x->x_transient); } + else if (!scriptlet_isempty(sp)) + loudbug_bug("widget_symbol"); WIDGETPROFILE_HANDLER_QUIT; }
static void widget_set(t_widget *x, t_symbol *s, int ac, t_atom *av) { *************** *** 817,828 **** }
- static void widget_ini(t_widget *x, t_symbol *s, int ac, t_atom *av) - { - if (ac) - { - scriptlet_reset(x->x_iniscript); - scriptlet_add(x->x_iniscript, 0, 0, ac, av); - } - } static void widget_tot(t_widget *x, t_symbol *s, int ac, t_atom *av) { --- 795,798 ---- *************** *** 850,858 **** wt == x->x_typedef) { if (!(x->x_tkclass = widgettype_tkclass(x->x_typedef))) x->x_tkclass = x->x_type; x->x_update = WIDGET_REVIS; widget_update(x, x->x_arguments); ! widget_pushconstructors(x); widget_update(x, x->x_handlers); widget_update(x, x->x_options); --- 820,829 ---- wt == x->x_typedef) { + widget_pushfreehooks(x); if (!(x->x_tkclass = widgettype_tkclass(x->x_typedef))) x->x_tkclass = x->x_type; x->x_update = WIDGET_REVIS; widget_update(x, x->x_arguments); ! widget_pushnewhooks(x); widget_update(x, x->x_handlers); widget_update(x, x->x_options); *************** *** 868,872 **** static void widget_redefine(t_widget *x) { ! widget_resettype(x, widgettype_reload(x->x_type)); }
--- 839,843 ---- static void widget_redefine(t_widget *x) { ! widget_resettype(x, widgettype_reload(x->x_type, x->x_glist)); }
*************** *** 904,915 **** }
! static void widget__value(t_widget *x, t_symbol *s, int ac, t_atom *av) { #ifdef WIDGET_DEBUG ! loudbug_startpost("value:"); loudbug_postatom(ac, av); loudbug_endpost(); #endif ! /* FIXME */ }
--- 875,909 ---- }
! /* FIXME this is only a template */ ! static void widget__data(t_widget *x, t_symbol *s, int ac, t_atom *av) { #ifdef WIDGET_DEBUG ! loudbug_startpost("_data:"); loudbug_postatom(ac, av); loudbug_endpost(); #endif ! if (ac && av->a_type == A_SYMBOL) ! { ! s = av->a_w.w_symbol; ! if (s == widgetps_add) ! { ! widget_pushdatahooks(x, ac, av); ! } ! else if (s == widgetps_delete) ! { ! widget_pushdatahooks(x, ac, av); ! } ! else if (s == widgetps_set) ! { ! widget_pushdatahooks(x, ac, av); ! } ! else if (s == widgetps_get) ! { ! widget_pushdatahooks(x, ac, av); ! } ! else loud_error((t_pd *)x, ! "invalid "_data" subcommand "%s"", s->s_name); ! } ! else loud_error((t_pd *)x, "missing "_data" subcommand"); }
*************** *** 1027,1030 **** --- 1021,1025 ---- static void widget_debug(t_widget *x) { + t_widgethandlers *wh = widgettype_getscripts(x->x_typedef); t_symbol *pn = widget_getcvpathname(x, 0); t_symbol *mn = widget_getmypathname(x, 0); *************** *** 1061,1073 **** bp = scriptlet_getcontents(x->x_optscript, &sz); loudbug_post("option buffer (size %d):\n"%s"", sz, (bp ? bp : bempty)); ! bp = widgettype_getconstructor(x->x_typedef, &sz); ! loudbug_post("type constructor (size %d):\n"%s"", sz, (bp ? bp : bempty)); ! bp = widgettype_getdestructor(x->x_typedef, &sz); ! loudbug_post("type destructor (size %d):\n"%s"", sz, (bp ? bp : bempty)); ! bp = widgettype_getinitializer(x->x_typedef, &sz); ! loudbug_post("type initializer (size %d):\n"%s"", sz, (bp ? bp : bempty)); ! bp = scriptlet_getcontents(x->x_iniscript, &sz); ! loudbug_post("instance initializer (size %d):\n"%s"", sz, (bp ? bp : bempty)); bp = masterwidget_getcontents(&sz); loudbug_post("setup definitions (size %d):\n"%s"", --- 1056,1073 ---- bp = scriptlet_getcontents(x->x_optscript, &sz); loudbug_post("option buffer (size %d):\n"%s"", sz, (bp ? bp : bempty)); ! ! bp = scriptlet_getcontents(widgethandlers_getnew(wh), &sz); ! loudbug_post("long newhook (size %d):\n"%s"", sz, (bp ? bp : bempty)); ! bp = scriptlet_getcontents(widgethandlers_getfree(wh), &sz); ! loudbug_post("long freehook (size %d):\n"%s"", sz, (bp ? bp : bempty)); ! bp = scriptlet_getcontents(widgethandlers_getdata(wh), &sz); ! loudbug_post("long datahook (size %d):\n"%s"", sz, (bp ? bp : bempty)); ! ! bp = scriptlet_getcontents(widgethandlers_getvis(wh), &sz); ! loudbug_post("long vishook (size %d):\n"%s"", sz, (bp ? bp : bempty)); ! bp = scriptlet_getcontents(widgethandlers_getvis(x->x_hooks), &sz); ! loudbug_post("short vishook (size %d):\n"%s"", sz, (bp ? bp : bempty)); + bp = masterwidget_getcontents(&sz); loudbug_post("setup definitions (size %d):\n"%s"", *************** *** 1090,1100 **** { widget_novis(x); ! widget_pushdestructors(x); gui_unbind((t_pd *)x, x->x_cbtarget); gui_unbind((t_pd *)x, x->x_rptarget); props_freeall(x->x_options); props_freeall(x->x_xargs); props_freeall(x->x_diffoptions); - scriptlet_free(x->x_iniscript); scriptlet_free(x->x_optscript); scriptlet_free(x->x_auxscript); --- 1090,1100 ---- { widget_novis(x); ! widget_pushfreehooks(x); gui_unbind((t_pd *)x, x->x_cbtarget); gui_unbind((t_pd *)x, x->x_rptarget); + widgethandlers_free(x->x_hooks); props_freeall(x->x_options); props_freeall(x->x_xargs); props_freeall(x->x_diffoptions); scriptlet_free(x->x_optscript); scriptlet_free(x->x_auxscript); *************** *** 1141,1145 ****
x->x_glist = canvas_getcurrent(); ! x->x_typedef = widgettype_get(x->x_type); if (!(x->x_tkclass = widgettype_tkclass(x->x_typedef))) x->x_tkclass = x->x_type; --- 1141,1145 ----
x->x_glist = canvas_getcurrent(); ! x->x_typedef = widgettype_get(x->x_type, 0, 0, x->x_glist); if (!(x->x_tkclass = widgettype_tkclass(x->x_typedef))) x->x_tkclass = x->x_type; *************** *** 1152,1163 **** x->x_varname = gensym(buf);
- x->x_iniscript = scriptlet_new((t_pd *)x, x->x_rptarget, x->x_cbtarget, - x->x_name, x->x_glist, widget_cvhook); - x->x_optscript = scriptlet_new((t_pd *)x, x->x_rptarget, x->x_cbtarget, - x->x_name, x->x_glist, widget_cvhook); x->x_auxscript = scriptlet_new((t_pd *)x, x->x_rptarget, x->x_cbtarget, x->x_name, x->x_glist, widget_cvhook); ! x->x_transient = scriptlet_new((t_pd *)x, x->x_rptarget, x->x_cbtarget, ! x->x_name, x->x_glist, widget_cvhook);
x->x_options = props_new((t_pd *)x, "option", "-", 0, 0); --- 1152,1159 ---- x->x_varname = gensym(buf);
x->x_auxscript = scriptlet_new((t_pd *)x, x->x_rptarget, x->x_cbtarget, x->x_name, x->x_glist, widget_cvhook); ! x->x_transient = scriptlet_newalike(x->x_auxscript); ! x->x_optscript = scriptlet_newalike(x->x_auxscript);
x->x_options = props_new((t_pd *)x, "option", "-", 0, 0); *************** *** 1171,1174 **** --- 1167,1172 ---- x->x_diffoptions, 0);
+ x->x_hooks = widgethandlers_new(x->x_auxscript); + outlet_new((t_object *)x, &s_anything); /* LATER consider estimating these, based on widget class and options. *************** *** 1187,1191 **** widget_attach(x); widget_addmessage(x, 0, 0, ac, av); ! widget_pushconstructors(x); return (x); } --- 1185,1189 ---- widget_attach(x); widget_addmessage(x, 0, 0, ac, av); ! x->x_constructed = 0; return (x); } *************** *** 1350,1354 **** static void tow_redefine(t_tow *x) { ! t_widgettype *wt = widgettype_reload(x->x_type); t_widgetentry *we; for (we = x->x_widgetlist; we; we = we->we_next) --- 1348,1352 ---- static void tow_redefine(t_tow *x) { ! t_widgettype *wt = widgettype_reload(x->x_type, x->x_glist); t_widgetentry *we; for (we = x->x_widgetlist; we; we = we->we_next) *************** *** 1496,1504 **** widgetps_mouse = gensym("mouse"); widgetps_motion = gensym("motion"); ! widgetps_atbang = gensym("@bang"); ! widgetps_atfloat = gensym("@float"); ! widgetps_atsymbol = gensym("@symbol"); ! widgetps_atstore = gensym("@store"); ! widgetps_atrestore = gensym("@restore"); widgettype_setup(); widget_class = class_new(gensym("widget"), --- 1494,1505 ---- widgetps_mouse = gensym("mouse"); widgetps_motion = gensym("motion"); ! widgetps_vis = gensym("vis"); ! widgetps_new = gensym("new"); ! widgetps_free = gensym("free"); ! widgetps_data = gensym("data"); ! widgetps_add = gensym("add"); ! widgetps_delete = gensym("delete"); ! widgetps_set = gensym("set"); ! widgetps_get = gensym("get"); widgettype_setup(); widget_class = class_new(gensym("widget"), *************** *** 1513,1526 **** class_addsymbol(widget_class, widget_symbol); class_addanything(widget_class, widget_anything); - class_addmethod(widget_class, (t_method)widget_store, - gensym("store"), A_DEFSYMBOL, 0); - class_addmethod(widget_class, (t_method)widget_restore, - gensym("restore"), A_DEFSYMBOL, 0); class_addmethod(widget_class, (t_method)widget_set, gensym("set"), A_GIMME, 0); class_addmethod(widget_class, (t_method)widget_remove, gensym("remove"), A_SYMBOL, 0); - class_addmethod(widget_class, (t_method)widget_ini, - gensym("ini"), A_GIMME, 0); class_addmethod(widget_class, (t_method)widget_tot, gensym("tot"), A_GIMME, 0); --- 1514,1521 ---- *************** *** 1534,1539 **** gensym("_config"), A_SYMBOL, A_SYMBOL, A_FLOAT, A_FLOAT, A_FLOAT, 0); ! class_addmethod(widget_class, (t_method)widget__value, ! gensym("_value"), A_GIMME, 0); class_addmethod(widget_class, (t_method)widget__callback, gensym("_cb"), A_GIMME, 0); --- 1529,1534 ---- gensym("_config"), A_SYMBOL, A_SYMBOL, A_FLOAT, A_FLOAT, A_FLOAT, 0); ! class_addmethod(widget_class, (t_method)widget__data, ! gensym("_data"), A_GIMME, 0); class_addmethod(widget_class, (t_method)widget__callback, gensym("_cb"), A_GIMME, 0);