#endif
}
+bool
+Dispatcher::is_listened (Stream_event *ev)
+{
+ SCM class_symbol = ev->get_property ("class");
+ if (!scm_is_symbol (class_symbol))
+ {
+ warning (_ ("Event class should be a symbol"));
+ return false;
+ }
+
+ for (SCM cl = scm_call_1 (ly_lily_module_constant ("ly:make-event-class"), class_symbol);
+ 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;
+}
+
+
void
Dispatcher::broadcast (Stream_event *ev)
{
public:
Dispatcher ();
void broadcast (Stream_event *ev);
+ bool is_listened (Stream_event *ev);
void add_listener (Listener, SCM event_class);
void remove_listener (Listener, SCM event_class);
void register_as_listener (Dispatcher *dist);
SCM unlistened = SCM_EOL;
for (; scm_is_pair (arts); arts = scm_cdr (arts))
{
- if (scm_is_true
- (scm_call_2
- (ly_lily_module_constant ("any"),
- ly_lily_module_constant ("ly:is-listened-event-class"),
- scm_call_1
- (ly_lily_module_constant ("ly:make-event-class"),
- unsmob_stream_event (scm_car (arts))
- ->get_property ("class")))))
- listened = scm_cons (scm_car (arts), listened);
+ SCM art = scm_car (arts);
+
+ if (c->event_source ()->is_listened (unsmob_stream_event (art)))
+ listened = scm_cons (art, listened);
else
- unlistened = scm_cons (scm_car (arts), unlistened);
+ unlistened = scm_cons (art, unlistened);
}
ev->set_property ("articulations", scm_reverse_x (unlistened, SCM_EOL));
c->event_source ()->broadcast (ev);