]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/partial-iterator.cc
lilypond-manuals.css: edit color scheme and some spacing
[lilypond.git] / lily / partial-iterator.cc
index 723391020913a08dab5785a36ca4acde7759d83e..80048d827c87bcec64bdefc0615e041d93409533 100644 (file)
@@ -1,7 +1,7 @@
 /*
   This file is part of LilyPond, the GNU music typesetter.
 
-  Copyright (C) 2010--2014 Neil Puttock <n.puttock@gmail.com>
+  Copyright (C) 2010--2015 Neil Puttock <n.puttock@gmail.com>
 
   LilyPond is free software: you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
@@ -24,6 +24,7 @@
 #include "moment.hh"
 #include "music.hh"
 #include "simple-music-iterator.hh"
+#include "lily-imports.hh"
 
 class Partial_iterator : public Simple_music_iterator
 {
@@ -38,11 +39,29 @@ void
 Partial_iterator::process (Moment m)
 {
   if (Duration * dur
-      = Duration::unsmob (get_music ()->get_property ("duration")))
+      = unsmob<Duration> (get_music ()->get_property ("duration")))
     {
       Moment length = Moment (dur->get_length ());
-      if (get_outlet ()->now_mom () > 0)
+
+      // Partial_iterator is an iterator rather than an engraver,
+      // so the active context it is getting called in does not
+      // depend on which context definition the engraver might be
+      // defined.
+      //
+      // Using where_defined to find the context where
+      // measurePosition should be overwritten does not actually
+      // work since the Timing_translator does not set
+      // measurePosition when initializing.
+
+      Context *timing = unsmob<Context>
+        (Lily::ly_context_find (get_outlet ()->self_scm (),
+                                ly_symbol2scm ("Timing")));
+
+      if (!timing)
+        programming_error ("missing Timing in \\partial");
+      else if (get_outlet ()->now_mom () > 0)
         {
+          timing->set_property ("partialBusy", ly_bool2scm (true));
           Global_context *tg = get_outlet ()->get_global_context ();
           tg->add_finalization (scm_list_3 (finalization_proc,
                                             get_outlet ()->self_scm (),
@@ -50,31 +69,12 @@ Partial_iterator::process (Moment m)
         }
       else
         {
-          // Partial_iterator is an iterator rather than an engraver,
-          // so the active context it is getting called in does not
-          // depend on which context definition the engraver might be
-          // defined.
-          //
-          // Using where_defined to find the context where
-          // measurePosition should be overwritten does not actually
-          // work since the Timing_translator does not set
-          // measurePosition when initializing.
-
-          Context *timing = Context::unsmob
-            (scm_call_2 (ly_lily_module_constant ("ly:context-find"),
-                         get_outlet ()->self_scm (),
-                         ly_symbol2scm ("Timing")));
-          if (!timing)
-            programming_error ("missing Timing in \\partial");
-          else
-            {
-              Moment mp = robust_scm2moment
-                (timing->get_property ("measurePosition"),
-                 Rational (0));
-              mp.main_part_ = 0;
-              timing->set_property
-                ("measurePosition", (mp - length).smobbed_copy ());
-            }
+          Moment mp = robust_scm2moment
+                      (timing->get_property ("measurePosition"),
+                       Rational (0));
+          mp.main_part_ = 0;
+          timing->set_property
+          ("measurePosition", (mp - length).smobbed_copy ());
         }
     }
   else
@@ -91,10 +91,8 @@ Partial_iterator::finalization (SCM ctx, SCM length)
 {
   LY_ASSERT_SMOB (Context, ctx, 1);
   LY_ASSERT_SMOB (Moment, length, 2);
-  Context *timing = Context::unsmob
-    (scm_call_2 (ly_lily_module_constant ("ly:context-find"),
-                 ctx,
-                 ly_symbol2scm ("Timing")));
+  Context *timing = unsmob<Context>
+    (Lily::ly_context_find (ctx, ly_symbol2scm ("Timing")));
   if (!timing) {
     programming_error ("missing Timing in \\partial");
     return SCM_UNSPECIFIED;
@@ -103,6 +101,8 @@ Partial_iterator::finalization (SCM ctx, SCM length)
                                  Rational (0));
   mp.main_part_ = measure_length (timing);
   timing->set_property ("measurePosition",
-                        (mp - *Moment::unsmob (length)).smobbed_copy ());
+                        (mp - *unsmob<Moment> (length)).smobbed_copy ());
+  timing->unset_property (ly_symbol2scm ("partialBusy"));
+
   return SCM_UNSPECIFIED;
 }