#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"
void
Engraver_group::override (SCM sev)
{
- Stream_event *ev = Stream_event::unsmob (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 = Stream_event::unsmob (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
}
Engraver_dispatch_list *dispatch
- = Engraver_dispatch_list::unsmob (acklist);
+ = unsmob<Engraver_dispatch_list> (acklist);
if (dispatch)
dispatch->apply (info);
for (SCM s = context_->children_contexts ();
scm_is_pair (s); s = scm_cdr (s))
{
- Context *c = Context::unsmob (scm_car (s));
+ Context *c = unsmob<Context> (scm_car (s));
Engraver_group *group
= dynamic_cast<Engraver_group *> (c->implementation ());
for (SCM s = context ()->children_contexts ();
scm_is_pair (s); s = scm_cdr (s))
{
- Context *c = Context::unsmob (scm_car (s));
+ Context *c = unsmob<Context> (scm_car (s));
Engraver_group *group
= dynamic_cast<Engraver_group *> (c->implementation ());
if (group)