X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fengraver-group.cc;h=cf1832fe1fb73dd25f93e621e7a20d077485bbd0;hb=43e591c72387cd624d98ed48f63cfc063d857359;hp=9b5efb27797015c40e0b39fc5a24ff6d732eebae;hpb=7eef6e252aea1c29512a2df501aaa5c832f57038;p=lilypond.git diff --git a/lily/engraver-group.cc b/lily/engraver-group.cc index 9b5efb2779..cf1832fe1f 100644 --- a/lily/engraver-group.cc +++ b/lily/engraver-group.cc @@ -20,6 +20,7 @@ #include "context.hh" #include "dispatcher.hh" #include "engraver-group.hh" +#include "global-context.hh" #include "grob.hh" #include "grob-properties.hh" #include "paper-score.hh" @@ -29,20 +30,49 @@ void Engraver_group::override (SCM sev) { - Stream_event *ev = Stream_event::unsmob (sev); + Stream_event *ev = unsmob (sev); + SCM sym = ev->get_property ("symbol"); + Grob_property_info gpi (context (), sym); - Grob_property_info (context (), ev->get_property ("symbol")) - .push (ev->get_property ("property-path"), - ev->get_property ("value")); + if (to_boolean (ev->get_property ("once"))) + { + SCM token = gpi.temporary_override (ev->get_property ("property-path"), + ev->get_property ("value")); + if (scm_is_pair (token)) + if (Global_context *g = context ()->get_global_context ()) + { + g->add_finalization (scm_list_4 (ly_context_matched_pop_property_proc, + context ()->self_scm (), + sym, + token)); + } + } + else + gpi.push (ev->get_property ("property-path"), + ev->get_property ("value")); } void Engraver_group::revert (SCM sev) { - Stream_event *ev = Stream_event::unsmob (sev); + Stream_event *ev = unsmob (sev); + SCM sym = ev->get_property ("symbol"); + Grob_property_info gpi (context (), sym); - Grob_property_info (context (), ev->get_property ("symbol")) - .pop (ev->get_property ("property-path")); + if (to_boolean (ev->get_property ("once"))) + { + SCM token = gpi.temporary_revert (ev->get_property ("property-path")); + if (scm_is_pair (token)) + if (Global_context *g = context ()->get_global_context ()) + { + g->add_finalization (scm_list_4 (ly_context_matched_pop_property_proc, + context ()->self_scm (), + sym, + token)); + } + } + else + gpi.pop (ev->get_property ("property-path")); } void @@ -117,7 +147,7 @@ Engraver_group::acknowledge_grobs () } Engraver_dispatch_list *dispatch - = Engraver_dispatch_list::unsmob (acklist); + = unsmob (acklist); if (dispatch) dispatch->apply (info); @@ -136,7 +166,7 @@ Engraver_group::pending_grobs () const for (SCM s = context_->children_contexts (); scm_is_pair (s); s = scm_cdr (s)) { - Context *c = Context::unsmob (scm_car (s)); + Context *c = unsmob (scm_car (s)); Engraver_group *group = dynamic_cast (c->implementation ()); @@ -157,7 +187,7 @@ Engraver_group::do_announces () for (SCM s = context ()->children_contexts (); scm_is_pair (s); s = scm_cdr (s)) { - Context *c = Context::unsmob (scm_car (s)); + Context *c = unsmob (scm_car (s)); Engraver_group *group = dynamic_cast (c->implementation ()); if (group)