]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/grace-engraver.cc
* lily/context.cc (where_defined): also assign value in
[lilypond.git] / lily / grace-engraver.cc
index be09cb4fe5d3784a3ba2abc0e28e7ed378b3be12..57bf0c476d8acf128f86e1644965c502aa1e5e57 100644 (file)
 
 class Grace_engraver : public Engraver
 {
+  void consider_change_grace_settings ();
 protected:
-  virtual void start_translation_timestep ();
-  virtual void derived_mark ();
+  PRECOMPUTED_VIRTUAL void start_translation_timestep ();
+  virtual void derived_mark () const;
+  virtual void initialize (); 
 
   TRANSLATOR_DECLARATIONS (Grace_engraver);
   Moment last_moment_;
@@ -25,16 +27,17 @@ public:
 Grace_engraver::Grace_engraver ()
 {
   grace_settings_ = SCM_EOL;
+  last_moment_ = Moment (Rational (-1,1));
 }
 
 void
-Grace_engraver::derived_mark ()
+Grace_engraver::initialize ()
 {
-  scm_gc_mark (grace_settings_);
+  consider_change_grace_settings ();
 }
 
 void
-Grace_engraver::start_translation_timestep ()
+Grace_engraver::consider_change_grace_settings ()
 {
   Moment now = now_mom ();
   if (last_moment_.grace_part_ && !now.grace_part_)
@@ -66,8 +69,7 @@ Grace_engraver::start_translation_timestep ()
          SCM val = scm_cadr (scm_cddr (entry));
 
          Context *c = context ();
-         while (c
-                && c->context_name_symbol () != context_name)
+         while (c && !c->is_alias (context_name))
            {
              c = c->get_parent_context ();
            }
@@ -81,19 +83,33 @@ Grace_engraver::start_translation_timestep ()
            }
          else
            {
-             programming_error ("Cannot find context");
+             programming_error ("can't find context");
              scm_display (context_name, scm_current_error_port ());
            }
        }
     }
 
-  last_moment_ = now;
+  last_moment_ = now_mom();
+}
+
+void
+Grace_engraver::derived_mark () const
+{
+  scm_gc_mark (grace_settings_);
+  Engraver::derived_mark ();
 }
 
+void
+Grace_engraver::start_translation_timestep ()
+{
+  consider_change_grace_settings ();
+}
+
+#include "translator.icc"
+
 ADD_TRANSLATOR (Grace_engraver,
                /* descr */ "Set font size and other properties for grace notes.",
                /* creats*/ "",
                /* accepts */ "",
-               /* acks  */ "",
                /* reads */ "graceSettings",
                /* write */ "");