X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Flyric-engraver.cc;h=bad1203266f75b43842e6bdea358b6a734dc339f;hb=90e4d7057f3857da049dfda3d130017d4719bd6b;hp=58b8f6cdd294e7a6a17907d75c8e4e9418d3c542;hpb=958e95822083954cad00e0a598eb9f12ceba67b9;p=lilypond.git diff --git a/lily/lyric-engraver.cc b/lily/lyric-engraver.cc index 58b8f6cdd2..bad1203266 100644 --- a/lily/lyric-engraver.cc +++ b/lily/lyric-engraver.cc @@ -36,7 +36,7 @@ class Lyric_engraver : public Engraver protected: void stop_translation_timestep (); void process_music (); - DECLARE_TRANSLATOR_LISTENER (lyric); + void listen_lyric (Stream_event *); public: TRANSLATOR_DECLARATIONS (Lyric_engraver); @@ -49,14 +49,14 @@ private: Context *get_voice_context (); }; -Lyric_engraver::Lyric_engraver () +Lyric_engraver::Lyric_engraver (Context *c) + : Engraver (c) { text_ = 0; last_text_ = 0; event_ = 0; } -IMPLEMENT_TRANSLATOR_LISTENER (Lyric_engraver, lyric); void Lyric_engraver::listen_lyric (Stream_event *ev) { @@ -96,7 +96,10 @@ get_voice_to_lyrics (Context *lyrics) SCM avc = lyrics->get_property ("associatedVoiceContext"); if (Context *c = unsmob (avc)) - return c; + { + if (!c->is_removable ()) + return c; + } SCM voice_name = lyrics->get_property ("associatedVoice"); string nm = lyrics->id_string (); @@ -116,26 +119,11 @@ get_voice_to_lyrics (Context *lyrics) if (!scm_is_symbol (voice_type)) return 0; - Context *parent = lyrics; - Context *voice = 0; - while (parent && !voice) - { - voice = find_context_below (parent, voice_type, nm); - parent = parent->get_parent_context (); - } - + Context *voice = find_context_near (lyrics, voice_type, nm); if (voice) return voice; - parent = lyrics; - voice = 0; - while (parent && !voice) - { - voice = find_context_below (parent, voice_type, ""); - parent = parent->get_parent_context (); - } - - return voice; + return find_context_near (lyrics, voice_type, ""); } Grob * @@ -170,7 +158,7 @@ get_current_note_head (Context *voice) // here. Not with this mechanism. if ((*end_mom == end_from_now) && dynamic_cast (g) - && Note_head::has_interface (g)) + && has_interface (g)) { return g; } @@ -206,6 +194,12 @@ Lyric_engraver::stop_translation_timestep () event_ = 0; } +void +Lyric_engraver::boot () +{ + ADD_LISTENER (Lyric_engraver, lyric); +} + ADD_TRANSLATOR (Lyric_engraver, /* doc */ "Engrave text for lyrics.",