aboutsummaryrefslogtreecommitdiff
path: root/toxy/widgethandlers.c
diff options
context:
space:
mode:
Diffstat (limited to 'toxy/widgethandlers.c')
-rw-r--r--toxy/widgethandlers.c211
1 files changed, 211 insertions, 0 deletions
diff --git a/toxy/widgethandlers.c b/toxy/widgethandlers.c
new file mode 100644
index 0000000..f95ffba
--- /dev/null
+++ b/toxy/widgethandlers.c
@@ -0,0 +1,211 @@
+/* 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);
+}