/*
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_is_symbol (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
#if 0
/* TODO: Uncomment. */
- if (!sent)
- warning (_f ("Junking event: %s", ly_symbol2string (class_symbol).c_str ()));
+ 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
Dispatcher::broadcast (Stream_event *ev)
{
scm_hashq_set_x (listeners_, ev_class, list);
if (first)
- warning ("Attempting to remove nonexisting listener.");
+ warning (_ ("Attempting to remove nonexisting listener."));
else if (!scm_is_pair (list))
{
/* Unregister with all dispatchers. */
// Don't register twice to the same dispatcher.
if (scm_assq (disp->self_scm (), dispatchers_) != SCM_BOOL_F)
{
- warning ("Already listening to dispatcher, ignoring request");
+ warning (_ ("Already listening to dispatcher, ignoring request"));
return;
}