X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fcontext.cc;h=a6b1da6a3609787625c7546905cf61a2935d6bf2;hb=bf5e12cca7be0cf62014de7186dffaebbee13bfa;hp=ccbb455a01a2cec22bad189f4cd5953901b7b438;hpb=f127e14af04f474d20406ca0e0f76f05061ee103;p=lilypond.git diff --git a/lily/context.cc b/lily/context.cc index ccbb455a01..a6b1da6a36 100644 --- a/lily/context.cc +++ b/lily/context.cc @@ -32,9 +32,6 @@ #include "warn.hh" #include "lily-imports.hh" -using std::string; -using std::vector; - bool Context::is_removable () const { @@ -93,8 +90,7 @@ Context::Context () smobify_self (); - Scheme_hash_table *tab = new Scheme_hash_table; - properties_scm_ = tab->unprotect (); + properties_scm_ = Scheme_hash_table::make_smob (); event_source_ = new Dispatcher (); event_source_->unprotect (); events_below_ = new Dispatcher (); @@ -255,7 +251,25 @@ Context::set_property_from_event (SCM sev) ok = type_check_assignment (sym, val, ly_symbol2scm ("translation-type?")); if (ok) - set_property (sym, val); + { + if (to_boolean (ev->get_property ("once"))) + { + if (Global_context *g = get_global_context ()) + { + SCM old_val = SCM_UNDEFINED; + if (here_defined (sym, &old_val)) + g->add_finalization (scm_list_4 (ly_context_set_property_x_proc, + self_scm (), + sym, + old_val)); + else + g->add_finalization (scm_list_3 (ly_context_unset_property_proc, + self_scm (), + sym)); + } + } + set_property (sym, val); + } } } @@ -265,8 +279,28 @@ Context::unset_property_from_event (SCM sev) Stream_event *ev = unsmob (sev); SCM sym = ev->get_property ("symbol"); - type_check_assignment (sym, SCM_EOL, ly_symbol2scm ("translation-type?")); - unset_property (sym); + bool ok = type_check_assignment (sym, SCM_EOL, ly_symbol2scm ("translation-type?")); + + if (ok) + { + if (to_boolean (ev->get_property ("once"))) + { + if (Global_context *g = get_global_context ()) + { + SCM old_val = SCM_UNDEFINED; + if (here_defined (sym, &old_val)) + g->add_finalization (scm_list_4 (ly_context_set_property_x_proc, + self_scm (), + sym, + old_val)); + else + g->add_finalization (scm_list_3 (ly_context_unset_property_proc, + self_scm (), + sym)); + } + } + unset_property (sym); + } } /*