X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fgrob-property.cc;h=f174f7ee01f6128bd79c6c6d405c80998e862659;hb=a8d54f44df1fe4f89823f6b78364870ce51174dc;hp=d7f29aed3db1e29b7d9ade31f27ed6178dad5f64;hpb=6f623a2bbe5b66af3d171abde579789343a1302f;p=lilypond.git diff --git a/lily/grob-property.cc b/lily/grob-property.cc index d7f29aed3d..f174f7ee01 100644 --- a/lily/grob-property.cc +++ b/lily/grob-property.cc @@ -23,9 +23,9 @@ Protected_scm grob_property_callback_stack = SCM_EOL; -#ifndef NDEBUG extern bool debug_property_callbacks; +#ifndef NDEBUG static void print_property_callback_stack () { @@ -33,44 +33,46 @@ 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; + +/* + +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.") { - LY_ASSERT_TYPE (ly_is_procedure, cb, 1); - - modification_callback = cb; + modification_callback = (ly_is_procedure (cb)) ? cb : SCM_BOOL_F; return SCM_UNSPECIFIED; } 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.") { - LY_ASSERT_TYPE (ly_is_procedure, cb, 1); - - cache_callback = cb; + cache_callback = (ly_is_procedure (cb)) ? cb : SCM_BOOL_F; return SCM_UNSPECIFIED; } -#endif + void Grob::instrumented_set_property (SCM sym, SCM v, @@ -86,6 +88,10 @@ Grob::instrumented_set_property (SCM sym, SCM v, scm_from_int (line), scm_from_locale_string (fun), sym, v, SCM_UNDEFINED)); +#else + (void) file; + (void) line; + (void) fun; #endif internal_set_property (sym, v); @@ -185,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) {