]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/dispatcher.cc
Revert "Web-es: Really make Spanish Pondings work."
[lilypond.git] / lily / dispatcher.cc
index 6a11654e233465ea6a59de9947b8c28aba33f3f4..c2e777a131de776b42eda946f84d4ac7018da217 100644 (file)
@@ -1,7 +1,7 @@
 /*
   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
@@ -58,7 +58,8 @@ Dispatcher::print_smob (SCM s, SCM p, scm_print_state *)
 {
   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;
 }
@@ -76,19 +77,13 @@ void
 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
@@ -167,11 +162,41 @@ Dispatcher::dispatch (SCM sev)
 
 #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)
 {