X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;ds=sidebyside;f=lily%2Fcontext-property.cc;h=fa77969e1c886f1a3c6a10593655f1d9563cd127;hb=058370efc7e9710f149d0f444328bb1fcd7bdec1;hp=7ee4b904d9a7edaf34aa4f0247cd704208ddf097;hpb=4a401ca1c60f428daa242dbdd102fdb3f327ebfb;p=lilypond.git diff --git a/lily/context-property.cc b/lily/context-property.cc index 7ee4b904d9..fa77969e1c 100644 --- a/lily/context-property.cc +++ b/lily/context-property.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2004--2011 Han-Wen Nienhuys + Copyright (C) 2004--2014 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -24,6 +24,7 @@ #include "main.hh" #include "simple-closure.hh" #include "spanner.hh" +#include "unpure-pure-container.hh" #include "warn.hh" /* @@ -90,13 +91,6 @@ execute_override_property (Context *context, SCM target_alist = scm_car (current_context_val); - /* - If the car is a list, the property path comes from a nested override - using list syntax inside a \context block - */ - if (scm_is_pair (scm_car (grob_property_path))) - grob_property_path = scm_car (grob_property_path); - SCM symbol = scm_car (grob_property_path); if (scm_is_pair (scm_cdr (grob_property_path))) { @@ -113,10 +107,16 @@ execute_override_property (Context *context, target_alist = scm_acons (symbol, new_value, target_alist); bool ok = true; - if (!ly_is_procedure (new_value) - && !is_simple_closure (new_value)) - ok = type_check_assignment (symbol, new_value, - ly_symbol2scm ("backend-type?")); + 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 @@ -218,8 +218,7 @@ execute_pushpop_property (Context *context, void apply_property_operations (Context *tg, SCM pre_init_ops) { - SCM correct_order = scm_reverse (pre_init_ops); - for (SCM s = correct_order; scm_is_pair (s); s = scm_cdr (s)) + for (SCM s = pre_init_ops; scm_is_pair (s); s = scm_cdr (s)) { SCM entry = scm_car (s); SCM type = scm_car (entry); @@ -241,6 +240,10 @@ apply_property_operations (Context *tg, SCM pre_init_ops) } else if (type == ly_symbol2scm ("assign")) tg->set_property (scm_car (entry), scm_cadr (entry)); + else if (type == ly_symbol2scm ("apply")) + scm_apply_1 (scm_car (entry), tg->self_scm (), scm_cdr (entry)); + else if (type == ly_symbol2scm ("unset")) + tg->unset_property (scm_car (entry)); } }