/*
This file is part of LilyPond, the GNU music typesetter.
- Copyright (C) 2005--2011 Erik Sandberg <mandolaerik@gmail.com>
+ Copyright (C) 2005--2012 Erik Sandberg <mandolaerik@gmail.com>
LilyPond is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
{
Dispatcher *me = (Dispatcher *) SCM_CELL_WORD_1 (s);
scm_puts ("#<Dispatcher ", p);
- scm_write (scm_vector_to_list (me->listeners_), p);
+ scm_write (scm_call_1 (ly_lily_module_constant ("hash-table->alist"),
+ me->listeners_), p);
scm_puts (">", p);
return 1;
}
Dispatcher::dispatch (SCM sev)
{
Stream_event *ev = unsmob_stream_event (sev);
- SCM class_symbol = ev->get_property ("class");
- if (!scm_symbol_p (class_symbol))
- {
- warning (_ ("Event class should be a symbol"));
- return;
- }
-
- SCM class_list = scm_call_1 (ly_lily_module_constant ("ly:make-event-class"), class_symbol);
+ SCM class_list = ev->get_property ("class");
if (!scm_is_pair (class_list))
{
- ev->origin ()->warning (_f ("Unknown event class %s", ly_symbol2string (class_symbol).c_str ()));
+ ev->origin ()->warning (_ ("Event class should be a list"));
return;
}
+
+#if 0
bool sent = false;
+#endif
int num_classes = scm_ilength (class_list);
/*
Listener *l = unsmob_listener (scm_cdar (lists[0].list));
l->listen (ev->self_scm ());
+#if 0
sent = true;
+#endif
}
// go to the next listener; bubble-sort the class list.
SCM next = scm_cdr (lists[0].list);
lists[i].list = next;
}
- /* TODO: Uncomment.
- if (!sent)
- warning (_f ("Junking event: %s", ly_symbol2string (class_symbol).c_str ()));
- */
+#if 0
+ /* TODO: Uncomment. */
+ if (!sent)
+ warning (_f ("Junking event: %s", ly_symbol2string (class_symbol).c_str ()));
+#endif
+}
+
+bool
+Dispatcher::is_listened_class (SCM cl)
+{
+ for (; scm_is_pair (cl); cl = scm_cdr (cl))
+ {
+ SCM list = scm_hashq_ref (listeners_, scm_car (cl), SCM_EOL);
+ if (scm_is_pair (list))
+ return true;
+ }
+ return false;
+}
+
+static SCM
+accumulate_types (void * /* closure */,
+ SCM key,
+ SCM val,
+ SCM result)
+{
+ if (scm_is_pair (val))
+ return scm_cons (key, result);
+ return result;
+}
+
+SCM
+Dispatcher::listened_types ()
+{
+ return scm_internal_hash_fold ((scm_t_hash_fold_fn) &accumulate_types,
+ NULL, SCM_EOL, listeners_);
}
void