X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fcontext-property.cc;h=b578321a9370c79ea79b6bd8256e687140ab55a0;hb=d935a5a0fac63dc0dcd8197d4d2286d235fe617c;hp=fa77969e1c886f1a3c6a10593655f1d9563cd127;hpb=c39d188d28fdc84cef8cbaea7b8d6e2fb718c30f;p=lilypond.git diff --git a/lily/context-property.cc b/lily/context-property.cc index fa77969e1c..b578321a93 100644 --- a/lily/context-property.cc +++ b/lily/context-property.cc @@ -19,6 +19,7 @@ #include "context.hh" #include "engraver.hh" +#include "global-context.hh" #include "international.hh" #include "item.hh" #include "main.hh" @@ -49,6 +50,17 @@ general_pushpop_property (Context *context, grob_property_path, new_value); } +bool +typecheck_grob (SCM symbol, SCM value) +{ + if (is_unpure_pure_container (value)) + return typecheck_grob (symbol, unpure_pure_container_unpure_part (value)) + && typecheck_grob (symbol, unpure_pure_container_pure_part (value)); + return ly_is_procedure (value) + || is_simple_closure (value) + || type_check_assignment (symbol, value, ly_symbol2scm ("backend-type?")); +} + /* Grob descriptions (ie. alists with layout properties) are represented as a (ALIST . BASED-ON) pair, where BASED-ON is the @@ -67,18 +79,23 @@ execute_override_property (Context *context, { SCM current_context_val = SCM_EOL; - Context *where = context->where_defined (context_property, - ¤t_context_val); + if (!context->here_defined (context_property, ¤t_context_val)) + { + Context *g = context->get_global_context (); + if (!g) + return; // Context is probably dead - /* - Don't mess with MIDI. - */ - if (!where) - return; + /* + Don't mess with MIDI. + */ + if (g == context + || !g->here_defined (context_property, ¤t_context_val)) + return; - if (where != context) - { - SCM base = updated_grob_properties (context, context_property); + /* where != context */ + + SCM base = updated_grob_properties (context->get_parent_context (), + context_property); current_context_val = scm_cons (base, base); context->set_property (context_property, current_context_val); } @@ -106,24 +123,13 @@ execute_override_property (Context *context, */ target_alist = scm_acons (symbol, new_value, target_alist); - bool ok = true; - bool pc = is_unpure_pure_container (new_value); - SCM vals[] = {pc ? unpure_pure_container_unpure_part (new_value) : new_value, - pc ? unpure_pure_container_pure_part (new_value) : SCM_BOOL_F - }; - - for (int i = 0; i < 2; i++) - if (!ly_is_procedure (vals[i]) - && !is_simple_closure (vals[i])) - ok = ok && type_check_assignment (symbol, vals[i], - ly_symbol2scm ("backend-type?")); /* tack onto alist. We can use set_car, since updated_grob_properties () in child contexts will check for changes in the car. */ - if (ok) + if (typecheck_grob (symbol, new_value)) { scm_set_car_x (current_context_val, target_alist); } @@ -156,8 +162,7 @@ execute_revert_property (Context *context, SCM grob_property_path) { SCM current_context_val = SCM_EOL; - if (context->where_defined (context_property, ¤t_context_val) - == context) + if (context->here_defined (context_property, ¤t_context_val)) { SCM current_alist = scm_car (current_context_val); SCM daddy = scm_cdr (current_context_val);