]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/translator.cc
Merge branch 'master' of git+ssh://repo.or.cz/srv/git/lilypond
[lilypond.git] / lily / translator.cc
index c9c8d874fb309721ce291938935872b839648a40..b7a46d29b65b20c67aa724b351012b0c18817da3 100644 (file)
@@ -150,7 +150,6 @@ void
 add_listened_event_class (SCM sym)
 {
   ensure_listened_hash ();
-
   scm_hashq_set_x (listened_event_class_table, sym, SCM_BOOL_T);
 }
 
@@ -177,12 +176,46 @@ Translator::add_translator_listener (translator_listener_record **listener_list,
   SCM class_sym = scm_str2symbol (name.c_str ());
   
   add_listened_event_class (class_sym);
+
   r->event_class_ = class_sym;
   r->get_listener_ = get_listener;
   r->next_ = *listener_list;
   *listener_list = r;
 }
 
+/*
+ Helps the individual static_translator_description methods of translators.
+*/
+SCM
+Translator::static_translator_description (const char *grobs,
+                                          const char *desc,
+                                          translator_listener_record *listener_list,
+                                          const char *read, 
+                                          const char *write) const
+{
+  SCM static_properties = SCM_EOL;                                     
+
+  static_properties = scm_acons (ly_symbol2scm ("grobs-created"),      
+                                parse_symbol_list (grobs), static_properties);
+  
+  static_properties = scm_acons (ly_symbol2scm ("description"),        
+                                scm_makfrom0str (desc), static_properties); 
+  
+  SCM list = SCM_EOL;
+  for (; listener_list; listener_list = listener_list->next_)
+    list = scm_cons (listener_list->event_class_, list);
+  static_properties = scm_acons (ly_symbol2scm ("events-accepted"),
+                                list, static_properties);
+  
+  static_properties = scm_acons (ly_symbol2scm ("properties-read"),    
+                                parse_symbol_list (read), static_properties); 
+  
+  static_properties = scm_acons (ly_symbol2scm ("properties-written"), 
+                                parse_symbol_list (write), static_properties); 
+  
+  return static_properties;                                            
+}
+  
 /*
   SMOBS
 */
@@ -280,13 +313,16 @@ get_event_length (Stream_event *e)
 bool
 internal_event_assignment (Stream_event **old_ev, Stream_event *new_ev, const char *function)
 {
-  if (*old_ev)
+  if (*old_ev &&
+      !to_boolean (scm_equal_p ((*old_ev)->self_scm (), 
+                              new_ev->self_scm ())))
     {
       /* extract event class from function name */
-      const char *prefix = "listen_";
       string ev_class = function;
+
       /* This assertion fails if EVENT_ASSIGNMENT was called outside a
         translator listener. Don't do that. */
+      const char *prefix = "listen_";
       assert (0 == ev_class.find (prefix));
 
       /* "listen_foo_bar" -> "foo-bar" */
@@ -305,8 +341,7 @@ internal_event_assignment (Stream_event **old_ev, Stream_event *new_ev, const ch
 }
 
 ADD_TRANSLATOR (Translator,
-               "Base class. Unused",
-               "",
+               "Base class. Not instantiated.",
                "",
                "",
                "");