- // TODO: The following should be carried out by a listener.
- string type = ly_symbol2string (cdef->get_context_name ());
- Object_key const *key = key_manager_.get_context_key (now_mom(), type, id);
- Context *new_context
- = cdef->instantiate (ops, key);
+IMPLEMENT_LISTENER (Context, set_property_from_event);
+void
+Context::set_property_from_event (SCM sev)
+{
+ Stream_event *ev = unsmob_stream_event (sev);
+
+ SCM sym = ev->get_property ("symbol");
+ if (scm_is_symbol (sym))
+ {
+ SCM val = ev->get_property ("value");
+ bool ok = true;
+ if (val != SCM_EOL)
+ ok = type_check_assignment (sym, val, ly_symbol2scm ("translation-type?"));
+ if (ok)
+ set_property (sym, val);
+ }
+}
+
+IMPLEMENT_LISTENER (Context, unset_property_from_event);
+void
+Context::unset_property_from_event (SCM sev)
+{
+ 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);
+}
+
+/*
+ Creates a new context from a CreateContext event, and sends an
+ AnnounceNewContext event to this context.
+*/
+IMPLEMENT_LISTENER (Context, create_context_from_event);
+void
+Context::create_context_from_event (SCM sev)
+{
+ Stream_event *ev = unsmob_stream_event (sev);
+
+ string id = ly_scm2string (ev->get_property ("id"));
+ SCM ops = ev->get_property ("ops");
+ SCM type_scm = ev->get_property ("type");
+ string type = ly_symbol2string (type_scm);
+
+ vector<Context_def*> path = path_to_acceptable_context (type_scm);
+
+ if (path.size () != 1)
+ {
+ programming_error (_f ("Invalid CreateContext event: Cannot create %s context", type.c_str ()));
+ return;
+ }
+ Context_def *cdef = path[0];
+
+ Context *new_context = cdef->instantiate (ops);