]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/dispatcher.cc
* lily/ various: Introduce stream events of types Prepare,
[lilypond.git] / lily / dispatcher.cc
index e66f0952cb69456cbf2e61b328cc8e474cf6fcb3..ce6f2b71018c00fd05000365ccca3efd8adab187 100644 (file)
@@ -7,6 +7,7 @@
 */
 
 #include "dispatcher.hh"
+#include "input.hh"
 #include "international.hh"
 #include "ly-smobs.icc"
 #include "stream-event.hh"
@@ -72,11 +73,16 @@ Dispatcher::dispatch (SCM sev)
   SCM class_symbol = ev->get_property ("class");
   if (!scm_symbol_p (class_symbol))
     {
-      warning (_f ("Unknown event class %s", ly_symbol2string (class_symbol).c_str ()));
+      warning (_f ("Event class should be a symbol"));
       return;
     }
 
   SCM class_list = scm_call_1 (ly_lily_module_constant ("ly:make-event-class"), class_symbol);
+  if (!scm_is_pair (class_list))
+    {
+      ev->origin ()->warning (_f ("Unknown event class %s", ly_symbol2string (class_symbol).c_str ()));
+      return;
+    }
   bool sent = false;
   int num_classes = scm_ilength (class_list);
 
@@ -171,9 +177,10 @@ inline void
 Dispatcher::internal_add_listener (Listener l, SCM ev_class, int priority)
 {
   SCM list = scm_hashq_ref (listeners_, ev_class, SCM_EOL);
-  if (list == SCM_EOL)
+  if (!scm_is_pair (list))
     {
-      /* Register with all dispatchers. */
+      /* Tell all dispatchers that we listen to, that we want to hear ev_class 
+         events */
       for (SCM disp = dispatchers_; scm_is_pair(disp); disp = scm_cdr (disp))
        {
          int priority = scm_to_int (scm_cdar (disp));
@@ -183,7 +190,7 @@ Dispatcher::internal_add_listener (Listener l, SCM ev_class, int priority)
       listen_classes_ = scm_cons (ev_class, listen_classes_);
     }
   SCM entry = scm_cons (scm_int2num (priority), l.smobbed_copy ());
-  list = scm_merge_x (list, scm_list_1 (entry), ly_lily_module_constant ("car<"));
+  list = scm_merge (list, scm_list_1 (entry), ly_lily_module_constant ("car<"));
   scm_hashq_set_x (listeners_, ev_class, list);
 }
 
@@ -213,10 +220,11 @@ Dispatcher::remove_listener (Listener l, SCM ev_class)
     else
       e = scm_cdr (e);
   list = scm_cdr (dummy);
+  scm_hashq_set_x (listeners_, ev_class, list);
 
   if (first)
     warning ("Attempting to remove nonexisting listener.");
-  else if (list == SCM_EOL)
+  else if (!scm_is_pair (list))
     {
       /* Unregister with all dispatchers. */
       for (SCM disp = dispatchers_; disp != SCM_EOL; disp = scm_cdr (disp))
@@ -256,9 +264,9 @@ Dispatcher::unregister_as_listener (Dispatcher *disp)
 {
   dispatchers_ = scm_assq_remove_x (dispatchers_, disp->self_scm ());
 
-  Listener list = GET_LISTENER (dispatch);
-  for (SCM cl = listen_classes_; cl != SCM_EOL; cl = scm_cdr (cl))
+  Listener listener = GET_LISTENER (dispatch);
+  for (SCM cl = listen_classes_; scm_is_pair (cl); cl = scm_cdr (cl))
     {
-      disp->remove_listener (list, scm_car (cl));
+      disp->remove_listener (listener, scm_car (cl));
     }
 }