]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/grace-engraver.cc
Run `make grand-replace'.
[lilypond.git] / lily / grace-engraver.cc
index ee998dda5d64d8577562cd1672830245510d9cd9..7fd5466895aa994da6750bd7ebf6f7561a80cf7d 100644 (file)
@@ -1,10 +1,9 @@
-/* 
-  grace-engraver.cc --  implement Grace_engraver
-  
+/*
+  grace-engraver.cc -- implement Grace_engraver
+
   source file of the GNU LilyPond music typesetter
-  
-  (c) 2004 Han-Wen Nienhuys <hanwen@xs4all.nl>
-  
+
+  (c) 2004--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "engraver.hh"
 
 class Grace_engraver : public Engraver
 {
+  void consider_change_grace_settings ();
 protected:
-  virtual void start_translation_timestep ();
-  virtual void derived_mark ();
-  
+  void start_translation_timestep ();
+  virtual void derived_mark () const;
+  virtual void initialize ();
+
   TRANSLATOR_DECLARATIONS (Grace_engraver);
   Moment last_moment_;
   SCM grace_settings_;
 public:
 };
 
-
-Grace_engraver::Grace_engraver()
+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_)
@@ -68,35 +69,52 @@ Grace_engraver::start_translation_timestep ()
          SCM val = scm_cadr (scm_cddr (entry));
 
          Context *c = context ();
-         while (c  
-                && c->context_name_symbol () != context_name)
-           {
-             c = c->get_parent_context ();           
-           }
+         while (c && !c->is_alias (context_name))
+           c = c->get_parent_context ();
 
-         if (c) 
+         if (c)
            {
              execute_pushpop_property (c,
                                        grob, sym, val);
              grace_settings_
-               = scm_cons (scm_cons (c->self_scm(), entry),  grace_settings_);
+               = scm_cons (scm_cons (c->self_scm (), entry), grace_settings_);
            }
          else
            {
-             programming_error ("Cannot find context");
-             scm_display (context_name, scm_current_error_port());
+             programming_error ("cannot 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,
+               /* doc */
+               "Set font size and other properties for grace notes.",
+
+               /* create */
+               "",
+
+               /* read */
+               "graceSettings ",
 
-ENTER_DESCRIPTION (Grace_engraver,
-                  /* descr */       "Set font size and other properties for grace notes.",
-                  /* creats*/       "",
-                  /* accepts */     "",
-                  /* acks  */      "",
-                  /* reads */       "graceSettings",
-                  /* write */       "");
+               /* write */
+               ""
+               );