X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fgrob-property.cc;h=f174f7ee01f6128bd79c6c6d405c80998e862659;hb=717f02443c1b93426f4f5d3b18fc8c5045b89a03;hp=740b57dea1837eb7bb936503adc86c85fd74ed16;hpb=42b13886277971501914bf5bd5ad46a15792c40d;p=lilypond.git diff --git a/lily/grob-property.cc b/lily/grob-property.cc index 740b57dea1..f174f7ee01 100644 --- a/lily/grob-property.cc +++ b/lily/grob-property.cc @@ -25,6 +25,7 @@ Protected_scm grob_property_callback_stack = SCM_EOL; extern bool debug_property_callbacks; +#ifndef NDEBUG static void print_property_callback_stack () { @@ -32,7 +33,7 @@ print_property_callback_stack () for (SCM s = grob_property_callback_stack; scm_is_pair (s); s = scm_cdr (s)) message (_f ("%d: %s", frame++, ly_scm_write_string (scm_car (s)).c_str ())); } - +#endif static SCM modification_callback = SCM_EOL; static SCM cache_callback = SCM_EOL; @@ -46,14 +47,14 @@ FIXME: this should use ly:set-option interface instead. LY_DEFINE (ly_set_grob_modification_callback, "ly:set-grob-modification-callback", 1, 0, 0, (SCM cb), - "Specify a procedure that will be called every time lilypond modifies " - "a grob property. The callback will receive as arguments " - "the grob that is being modified, " - "the name of the C++ file in which the modification was requested, " - "the line number in the C++ file in which the modification was requested, " - "the name of the function in which the modification was requested, " - "the property to be changed and " - "the new value for the property.") + "Specify a procedure that will be called every time LilyPond" + " modifies a grob property. The callback will receive as" + " arguments the grob that is being modified, the name of the" + " C++ file in which the modification was requested, the line" + " number in the C++ file in which the modification was requested," + " the name of the function in which the modification was" + " requested, the property to be changed, and the new value for" + " the property.") { modification_callback = (ly_is_procedure (cb)) ? cb : SCM_BOOL_F; return SCM_UNSPECIFIED; @@ -61,13 +62,12 @@ LY_DEFINE (ly_set_grob_modification_callback, "ly:set-grob-modification-callback LY_DEFINE (ly_set_property_cache_callback, "ly:set-property-cache-callback", 1, 0, 0, (SCM cb), - "Specify a procedure that will be called whenever lilypond calculates " - "a callback function and caches the result. The callback will " - "receive as arguments " - "the grob whose property it is, " - "the name of the property, " - "the name of the callback that calculated the property and " - "the new (cached) value of the property.") + "Specify a procedure that will be called whenever lilypond" + " calculates a callback function and caches the result. The" + " callback will receive as arguments the grob whose property it" + " is, the name of the property, the name of the callback that" + " calculated the property, and the new (cached) value of the" + " property.") { cache_callback = (ly_is_procedure (cb)) ? cb : SCM_BOOL_F; return SCM_UNSPECIFIED; @@ -191,6 +191,26 @@ Grob::internal_get_property (SCM sym) const return val; } +/* Unlike internal_get_property, this function does no caching. Use it, therefore, with caution. */ +SCM +Grob::internal_get_pure_property (SCM sym, int start, int end) const +{ + SCM val = internal_get_property_data (sym); + if (ly_is_procedure (val)) + return call_pure_function (val, scm_list_1 (self_scm ()), start, end); + if (is_simple_closure (val)) + return evaluate_with_simple_closure (self_scm (), + simple_closure_expression (val), + true, start, end); + return val; +} + +SCM +Grob::internal_get_maybe_pure_property (SCM sym, bool pure, int start, int end) const +{ + return pure ? internal_get_pure_property (sym, start, end) : internal_get_property (sym); +} + SCM Grob::try_callback_on_alist (SCM *alist, SCM sym, SCM proc) {