]> git.donarmstrong.com Git - lilypond.git/commitdiff
* lily/paper-book.cc (get_system_specs):
authorJoe Neeman <joeneeman@gmail.com>
Sun, 24 Sep 2006 06:21:56 +0000 (06:21 +0000)
committerJoe Neeman <joeneeman@gmail.com>
Sun, 24 Sep 2006 06:21:56 +0000 (06:21 +0000)
(set_system_penalty): fix breakbefore.
We used to set a penalty on the system after the break, now we
set a permission on the system before the break

ChangeLog
lily/paper-book.cc

index 1b710a699f7e275a4760927b2fb28883a1b3a815..f8beb8bc6ce3e6c75229e1ba131d68e2348e73fa 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,10 @@
 2006-09-24  Joe Neeman  <joeneeman@gmail.com>
+
+       * lily/paper-book.cc (get_system_specs):
+       (set_system_penalty): fix breakbefore.
+       We used to set a penalty on the system after the break, now we
+       set a permission on the system before the break
+
        * lily/grob-property.cc: add scm debugging hooks into
        property modification
 
index c16870f30db900c3bfed889cb8ef1b9c9cfdc6d8..168d19b92e899eb85faacb2caf997be69948712d 100644 (file)
@@ -8,6 +8,7 @@
 
 #include "paper-book.hh"
 
+#include "grob.hh"
 #include "main.hh"
 #include "output-def.hh"
 #include "paper-score.hh"
@@ -215,8 +216,12 @@ Paper_book::score_title (SCM header)
   return title;
 }
 
+/* read the breakbefore property of a score block and set up the preceding
+   system-spec to honour it. That is, SYM should be the system spec that
+   immediately precedes the score (from which HEADER is taken)
+   in the get_system_specs() list */
 void
-set_system_penalty (Prob *ps, SCM header)
+set_system_penalty (SCM sys, SCM header)
 {
   if (ly_is_module (header))
     {
@@ -224,10 +229,17 @@ set_system_penalty (Prob *ps, SCM header)
       if (SCM_VARIABLEP (force)
          && scm_is_bool (SCM_VARIABLE_REF (force)))
        {
-         ps->set_property ("penalty",
-                           scm_from_int(to_boolean (SCM_VARIABLE_REF (force))
-                                        ? -10000
-                                        : 10000));
+         bool b = to_boolean (SCM_VARIABLE_REF (force));
+         SCM sym = b ? ly_symbol2scm ("force") : SCM_EOL;
+
+         if (Paper_score *ps = dynamic_cast<Paper_score*> (unsmob_music_output (sys)))
+           {
+             vector<Grob*> cols = ps->get_columns ();
+             if (cols.size ())
+               cols.back ()->set_property ("page-break-permission", sym);
+           }
+         else if (Prob *pb = unsmob_prob (sys))
+           pb->set_property ("page-break-permission", sym);
        }
     }
 }
@@ -248,7 +260,6 @@ Paper_book::get_score_title (SCM header)
       SCM props = paper_->lookup_variable (ly_symbol2scm ("score-title-properties"));
       Prob *ps = make_paper_system (props);
       paper_system_set_stencil (ps, title);
-      set_system_penalty (ps, header);
 
       return ps->self_scm();
     }
@@ -268,7 +279,6 @@ Paper_book::get_system_specs ()
       SCM props = paper_->lookup_variable (ly_symbol2scm ("book-title-properties"));
       Prob *ps = make_paper_system (props);
       paper_system_set_stencil (ps, title);
-      set_system_penalty (ps, header_);
 
       system_specs = scm_cons (ps->self_scm (), system_specs);
       ps->unprotect ();
@@ -292,6 +302,10 @@ Paper_book::get_system_specs ()
          if (Paper_score *pscore = dynamic_cast<Paper_score *> (mop))
            {
              SCM title = get_score_title (header);
+
+             if (scm_is_pair (system_specs))
+               set_system_penalty (scm_car (system_specs), header);
+
              if (unsmob_prob (title))
                {
                  system_specs = scm_cons (title, system_specs);