X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fengraver-group.cc;h=c431d10ae13cd35e83e6130e1e8bf09a4ac6a405;hb=97a0169312a260933246ab224e4f8b0969871dd5;hp=c69b974a69631aba681068aaadf91bae9789fa1a;hpb=958e95822083954cad00e0a598eb9f12ceba67b9;p=lilypond.git diff --git a/lily/engraver-group.cc b/lily/engraver-group.cc index c69b974a69..c431d10ae1 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" @@ -30,19 +31,48 @@ void Engraver_group::override (SCM 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 = 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 @@ -62,16 +92,13 @@ Engraver_group::disconnect_from_context () } void -Engraver_group::announce_grob (Grob_info info) +Engraver_group::announce_grob (Grob_info info, Direction dir, + Context *reroute_context) { - announce_infos_.push_back (info); + announce_infos_.push_back (Announce_grob_info (info, dir)); - Context *dad_con = context_->get_parent_context (); - if (info.rerouting_daddy_context_) - { - dad_con = info.rerouting_daddy_context_; - info.rerouting_daddy_context_ = 0; - } + Context *dad_con = reroute_context ? reroute_context + : context_->get_parent_context (); Engraver_group *dad_eng = dad_con @@ -79,7 +106,7 @@ Engraver_group::announce_grob (Grob_info info) : 0; if (dad_eng) - dad_eng->announce_grob (info); + dad_eng->announce_grob (info, dir); } void @@ -92,7 +119,7 @@ Engraver_group::acknowledge_grobs () for (vsize j = 0; j < announce_infos_.size (); j++) { - Grob_info info = announce_infos_[j]; + Announce_grob_info info = announce_infos_[j]; SCM meta = info.grob ()->get_property ("meta"); SCM nm = scm_assoc (name_sym, meta); @@ -177,12 +204,13 @@ Engraver_group::do_announces () while (pending_grobs ()); } -Engraver_group::Engraver_group () +Preinit_Engraver_group::Preinit_Engraver_group () { - acknowledge_hash_table_drul_[LEFT] - = acknowledge_hash_table_drul_[RIGHT] - = SCM_EOL; + acknowledge_hash_table_drul_.set (SCM_EOL, SCM_EOL); +} +Engraver_group::Engraver_group () +{ acknowledge_hash_table_drul_[LEFT] = scm_c_make_hash_table (61); acknowledge_hash_table_drul_[RIGHT] = scm_c_make_hash_table (61); }