X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fgrob-info.cc;h=5ad3d5701e36fa6525fd422d017dcdd19528662a;hb=ed1d216fea92ba4166562c29e9bd797e526276f0;hp=4ffbcf9c15da408c9c95f406e8b67c490a92781b;hpb=77d72a6b9e7e551dc4a3b365099f9fea339f9c72;p=lilypond.git diff --git a/lily/grob-info.cc b/lily/grob-info.cc index 4ffbcf9c15..5ad3d5701e 100644 --- a/lily/grob-info.cc +++ b/lily/grob-info.cc @@ -3,44 +3,65 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2005 Han-Wen Nienhuys + (c) 1997--2006 Han-Wen Nienhuys */ +#include "context.hh" #include "grob-info.hh" #include "grob.hh" +#include "item.hh" #include "music.hh" -#include "translator-group.hh" -#include "context.hh" #include "spanner.hh" -#include "item.hh" +#include "stream-event.hh" +#include "translator-group.hh" Grob_info::Grob_info (Translator *t, Grob *g) { origin_trans_ = t; grob_ = g; + start_end_ = START; } Grob_info::Grob_info () { grob_ = 0; + start_end_ = START; origin_trans_ = 0; } +/* ES TODO: Junk this when no more engravers use try_music */ Music * Grob_info::music_cause () const { SCM cause = grob_->get_property ("cause"); - return unsmob_music (cause); + + Music *ret = unsmob_music (cause); + if (ret) + return ret; + else + { + Stream_event *ev = unsmob_stream_event (cause); + if (!ev) + return 0; + return unsmob_music (ev->get_property ("music-cause")); + } +} + +Stream_event * +Grob_info::event_cause () const +{ + SCM cause = grob_->get_property ("cause"); + return unsmob_stream_event (cause); } -Link_array +vector Grob_info::origin_contexts (Translator *end) const { Context *t = origin_trans_->context (); - Link_array r; + vector r; do { - r.push (t); + r.push_back (t); t = t->get_parent_context (); } while (t && t != end->context ()); @@ -66,6 +87,20 @@ Grob_info::item () const return dynamic_cast (grob_); } +Stream_event * +Grob_info::ultimate_event_cause () const +{ + SCM cause = grob_->self_scm (); + while (unsmob_grob (cause)) + { + cause = unsmob_grob (cause)->get_property ("cause"); + } + return unsmob_stream_event (cause); +} + +/* +ES TODO: Junk this when no more engraver uses try_music +*/ Music * Grob_info::ultimate_music_cause () const { @@ -75,6 +110,12 @@ Grob_info::ultimate_music_cause () const cause = unsmob_grob (cause)->get_property ("cause"); } - return unsmob_music (cause); + Music *ret = unsmob_music (cause); + if (ret) + return ret; + else + { + Stream_event *ev = unsmob_stream_event (cause); + return unsmob_music (ev->get_property ("music-cause")); + } } -