X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Ftranslator.cc;h=b7a46d29b65b20c67aa724b351012b0c18817da3;hb=3920b02188c3c6b0190626a936c586fe687a4a2d;hp=c9c8d874fb309721ce291938935872b839648a40;hpb=abbdb46061be5c0a0682059d1f86bf3e44ca5cf3;p=lilypond.git diff --git a/lily/translator.cc b/lily/translator.cc index c9c8d874fb..b7a46d29b6 100644 --- a/lily/translator.cc +++ b/lily/translator.cc @@ -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.", "", "", "");