#include "scm-hash.hh"
#include "translator-group.hh"
#include "warn.hh"
+#include "lily-imports.hh"
bool
Context::is_removable () const
scm_cons (child->self_scm (), SCM_EOL));
child->daddy_context_ = this;
- this->events_below_->register_as_listener (child->events_below_);
+ events_below_->register_as_listener (child->events_below_);
}
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 ();
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);
+ }
}
}
Stream_event *ev = unsmob<Stream_event> (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);
+ }
}
/*
ly_symbol2scm ("UnsetProperty"));
new_context->events_below_->register_as_listener (new_context->event_source_);
- this->add_context (new_context);
+ add_context (new_context);
new_context->unprotect ();
if (!t)
{
warning (_f ("cannot find or create: `%s'", name.c_str ()));
- t = unsmob<Context_def> (this->definition_);
+ t = unsmob<Context_def> (definition_);
}
if (scm_is_symbol (t->get_default_child (SCM_EOL)))
{
void
Context::internal_send_stream_event (SCM type, Input *origin, SCM props[])
{
- Stream_event *e = new Stream_event
- (scm_call_1 (ly_lily_module_constant ("ly:make-event-class"), type),
- origin);
+ Stream_event *e = new Stream_event (Lily::ly_make_event_class (type), origin);
for (int i = 0; props[i]; i += 2)
{
e->set_property (props[i], props[i + 1]);
void
Context::disconnect_from_parent ()
{
- daddy_context_->events_below_->unregister_as_listener (this->events_below_);
- daddy_context_->context_list_ = scm_delq_x (this->self_scm (), daddy_context_->context_list_);
+ daddy_context_->events_below_->unregister_as_listener (events_below_);
+ daddy_context_->context_list_ = scm_delq_x (self_scm (), daddy_context_->context_list_);
daddy_context_ = 0;
}
}
int
-Context::print_smob (SCM port, scm_print_state *)
+Context::print_smob (SCM port, scm_print_state *) const
{
scm_puts ("#<", port);
scm_puts (class_name (), port);