event_ = 0;
}
-IMPLEMENT_TRANSLATOR_LISTENER (Lyric_engraver, lyric);
void
Lyric_engraver::listen_lyric (Stream_event *ev)
{
{
SCM text = event_->get_property ("text");
- if (ly_is_equal (text, scm_from_locale_string (" ")))
+ if (ly_is_equal (text, scm_from_ascii_string (" ")))
{
if (last_text_)
last_text_->set_property ("self-alignment-X",
bool searchForVoice = to_boolean (lyrics->get_property ("searchForVoice"));
SCM avc = lyrics->get_property ("associatedVoiceContext");
- if (Context *c = Context::unsmob (avc))
- return c;
+ if (Context *c = unsmob<Context> (avc))
+ {
+ if (!c->is_removable ())
+ return c;
+ }
SCM voice_name = lyrics->get_property ("associatedVoice");
string nm = lyrics->id_string ();
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 *
for (SCM s = voice->get_property ("busyGrobs");
scm_is_pair (s); s = scm_cdr (s))
{
- Grob *g = Grob::unsmob (scm_cdar (s));;
- Moment *end_mom = Moment::unsmob (scm_caar (s));
+ Grob *g = unsmob<Grob> (scm_cdar (s));;
+ Moment *end_mom = unsmob<Moment> (scm_caar (s));
if (!end_mom || !g)
{
programming_error ("busyGrobs invalid");
// It's a bit irritating that we just have the length and
// duration of the Grob.
Moment end_from_now =
- get_event_length (Stream_event::unsmob (g->get_property ("cause")), now)
+ get_event_length (unsmob<Stream_event> (g->get_property ("cause")), now)
+ now;
// We cannot actually include more than a single grace note
// using busyGrobs on ungraced lyrics since a grob ending on
// here. Not with this mechanism.
if ((*end_mom == end_from_now)
&& dynamic_cast<Item *> (g)
- && Note_head::has_interface (g))
+ && has_interface<Note_head> (g))
{
return g;
}
event_ = 0;
}
+void
+Lyric_engraver::boot ()
+{
+ ADD_LISTENER (Lyric_engraver, lyric);
+}
+
ADD_TRANSLATOR (Lyric_engraver,
/* doc */
"Engrave text for lyrics.",