#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"
Engraver_group::override (SCM sev)
{
Stream_event *ev = unsmob<Stream_event> (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<Stream_event> (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
}
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
: 0;
if (dad_eng)
- dad_eng->announce_grob (info);
+ dad_eng->announce_grob (info, dir);
}
void
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);
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);
}