- SCM pen = command_column_->get_property ("penalty");
- Real total_penalty = scm_is_number (pen) ? scm_to_double (pen) : 0.0;
-
- SCM mpen = break_event_->get_property ("penalty");
- if (scm_is_number (mpen))
- total_penalty += scm_to_double (mpen);
-
- command_column_->set_property ("penalty", scm_from_double (total_penalty));
-
- /* ugh. arbitrary, hardcoded */
- if (total_penalty > 10000.0)
- forbid_breaks ();
+ string prefix;
+ SCM name_sym = break_events_[i]->get_property ("class");
+ string name = ly_symbol2string (name_sym);
+ size_t end = name.rfind ("-event");
+ if (end)
+ prefix = name.substr (0, end);
+ else
+ {
+ programming_error ("Paper_column_engraver doesn't know about this break-event");
+ return;
+ }
+
+ string perm_str = prefix + "-permission";
+ string pen_str = prefix + "-penalty";
+
+ SCM cur_pen = command_column_->get_property (pen_str.c_str ());
+ SCM pen = break_events_[i]->get_property ("break-penalty");
+ SCM perm = break_events_[i]->get_property ("break-permission");
+
+ if (!only_do_permissions && scm_is_number (pen))
+ {
+ Real new_pen = robust_scm2double (cur_pen, 0.0) + scm_to_double (pen);
+ command_column_->set_property (pen_str.c_str (), scm_from_double (new_pen));
+ command_column_->set_property (perm_str.c_str (), ly_symbol2scm ("allow"));
+ }
+ else
+ command_column_->set_property (perm_str.c_str (), perm);
+ }
+}