From: David Kastrup Date: Thu, 2 Oct 2014 14:13:51 +0000 (+0200) Subject: Issue 630/3: Let Grace_iterator produce a GraceChange event X-Git-Tag: release/2.19.16-1~16 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=6a023cc84879573668eaf9120bb13b93cfdf12cb;p=lilypond.git Issue 630/3: Let Grace_iterator produce a GraceChange event --- diff --git a/lily/grace-iterator.cc b/lily/grace-iterator.cc index c0c6c6ec2c..97920b06e6 100644 --- a/lily/grace-iterator.cc +++ b/lily/grace-iterator.cc @@ -19,13 +19,22 @@ #include "grace-iterator.hh" #include "global-context.hh" -#include "warn.hh" +#include "music.hh" void Grace_iterator::process (Moment m) { Moment main; main.main_part_ = -start_mom_.grace_part_ + m.grace_part_; + + // GraceChange is announced in order to make the Grace_engraver able + // to distinguish \stemNeutral \grace { ... and \grace { \stemNeutral ... + if (in_grace_ != bool (m.grace_part_) && child_iter_ && child_iter_->get_outlet ()) + { + send_stream_event (child_iter_->get_outlet (), "GraceChange", get_music ()->origin (), 0); + } + in_grace_ = m.grace_part_; + Music_wrapper_iterator::process (main); /* We can safely do this, since \grace should always be inside diff --git a/lily/include/grace-iterator.hh b/lily/include/grace-iterator.hh index 4da3511c0b..4718adf0be 100644 --- a/lily/include/grace-iterator.hh +++ b/lily/include/grace-iterator.hh @@ -24,7 +24,9 @@ class Grace_iterator : public Music_wrapper_iterator { + bool in_grace_; public: + Grace_iterator() : in_grace_ (false) { } virtual void process (Moment); DECLARE_SCHEME_CALLBACK (constructor, ()); DECLARE_CLASSNAME (Grace_iterator); diff --git a/scm/define-event-classes.scm b/scm/define-event-classes.scm index b568945081..9e1f4e5936 100644 --- a/scm/define-event-classes.scm +++ b/scm/define-event-classes.scm @@ -25,7 +25,7 @@ (RemoveContext ChangeParent Override Revert UnsetProperty SetProperty music-event OldMusicEvent CreateContext Prepare - OneTimeStep Finish)) + OneTimeStep Finish GraceChange)) (music-event . (annotate-output-event footnote-event arpeggio-event breathing-event extender-event span-event rhythmic-event dynamic-event