+/*
+ context-scheme.cc -- Context bindings
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 1998--2007 Jan Nieuwenhuizen <janneke@gnu.org>
+ Han-Wen Nienhuys <hanwen@xs4all.nl>
+*/
+
#include "context.hh"
#include "context-def.hh"
+#include "dispatcher.hh"
-
-LY_DEFINE(ly_context_id,
- "ly:context-id", 1,0,0, (SCM context),
- "Return the id string of @var{context}, i.e. for @code{\\context Voice "
-"= one .. } it will return the string @code{one}.")
+LY_DEFINE (ly_context_id, "ly:context-id",
+ 1, 0, 0, (SCM context),
+ "Return the id string of @var{context}, "
+ "i.e. for @code{\\context Voice = one .. } "
+ "return the string @code{one}.")
{
- Context * tr = (unsmob_context (context));
- SCM_ASSERT_TYPE(tr, context, SCM_ARG1, __FUNCTION__, "Context");
+ Context *tr = unsmob_context (context);
- return scm_makfrom0str (tr->id_string_. to_str0 ());
-}
+ LY_ASSERT_SMOB (Context, context, 1);
+ return ly_string2scm (tr->id_string ());
+}
-LY_DEFINE(ly_context_name,
- "ly:context-name", 1,0,0, (SCM context),
- "Return the name of @var{context}, i.e. for @code{\\context Voice "
-"= one .. } it will return the symbol @code{Voice}.")
+LY_DEFINE (ly_context_name, "ly:context-name",
+ 1, 0, 0, (SCM context),
+ "Return the name of @var{context}, "
+ "i.e. for @code{\\context Voice = one .. } "
+ "return the symbol @code{Voice}.")
{
- Context * tr = (unsmob_context (context));
- SCM_ASSERT_TYPE(tr, context, SCM_ARG1, __FUNCTION__, "Context");
+ LY_ASSERT_SMOB (Context, context, 1);
- return unsmob_context_def (tr->definition_)->get_context_name ();
+ Context *tr = unsmob_context (context);
+
+ return ly_symbol2scm (tr->context_name ().c_str ());
}
+LY_DEFINE (ly_context_grob_definition, "ly:context-grob-definition",
+ 2, 0, 0, (SCM context, SCM name),
+ "Return the definition of @var{name} (a symbol) within @var{context} "
+ "as an alist")
+{
+ Context *tr = unsmob_context (context);
+
+ LY_ASSERT_SMOB (Context, context, 1);
+ LY_ASSERT_TYPE(ly_is_symbol, name, 2);
+
+ return updated_grob_properties (tr, name);
+}
-LY_DEFINE(ly_context_pushpop_property,
- "ly:context-pushpop-property", 3, 1, 0,
- (SCM context, SCM grob, SCM eltprop, SCM val),
- "Do a single @code{\\override} or @code{\\revert} operation "
- "in @var{context}. The grob definition @code{grob} is extended with "
- "@code{eltprop} (if @var{val} is specified) "
- "or reverted (if unspecified).")
+LY_DEFINE (ly_context_pushpop_property, "ly:context-pushpop-property",
+ 3, 1, 0, (SCM context, SCM grob, SCM eltprop, SCM val),
+ "Do a single @code{\\override} or @code{\\revert} operation "
+ "in @var{context}. The grob definition @code{grob} is extended "
+ "with @code{eltprop} (if @var{val} is specified) "
+ "or reverted (if unspecified).")
{
- Context *tg = (unsmob_context (context));
+ Context *tg = unsmob_context (context);
- SCM_ASSERT_TYPE(tg, context, SCM_ARG1, __FUNCTION__, "context");
- SCM_ASSERT_TYPE(gh_symbol_p (grob), grob, SCM_ARG2, __FUNCTION__, "symbol");
- SCM_ASSERT_TYPE(gh_symbol_p (eltprop), eltprop, SCM_ARG3, __FUNCTION__, "symbol");
+ LY_ASSERT_SMOB (Context, context, 1);
+ LY_ASSERT_TYPE(ly_is_symbol, grob, 2);
+ LY_ASSERT_TYPE(ly_is_symbol, eltprop, 3);
execute_pushpop_property (tg, grob, eltprop, val);
- return SCM_UNDEFINED;
+ return SCM_UNSPECIFIED;
}
-
-LY_DEFINE(ly_get_context_property,
- "ly:get-context-property", 2, 0, 0,
- (SCM context, SCM name),
- "retrieve the value of @var{name} from context @var{context}")
+LY_DEFINE (ly_context_property, "ly:context-property",
+ 2, 0, 0, (SCM c, SCM name),
+ "Return the value of @var{name} from context @var{c}")
{
- Context *t = unsmob_context (context);
- Context * tr= (t);
- SCM_ASSERT_TYPE(tr, context, SCM_ARG1, __FUNCTION__, "Translator group");
- SCM_ASSERT_TYPE(gh_symbol_p (name), name, SCM_ARG2, __FUNCTION__, "symbol");
+ LY_ASSERT_SMOB (Context, c, 1);
+ LY_ASSERT_TYPE(ly_is_symbol, name, 2);
- return tr->internal_get_property (name);
-
+ Context *t = unsmob_context (c);
+ return t->internal_get_property (name);
}
-LY_DEFINE(ly_set_context_property,
- "ly:set-context-property!", 3, 0, 0,
- (SCM context, SCM name, SCM val),
- "set value of property @var{name} in context @var{context} to @var{val}.")
+LY_DEFINE (ly_context_set_property_x, "ly:context-set-property!",
+ 3, 0, 0, (SCM context, SCM name, SCM val),
+ "Set value of property @var{name} in context @var{context} "
+ "to @var{val}.")
{
- Context *t = unsmob_context (context);
- Context * tr= (t);
+ LY_ASSERT_SMOB (Context, context, 1);
+ LY_ASSERT_TYPE(ly_is_symbol, name, 2);
- SCM_ASSERT_TYPE(tr, context, SCM_ARG1, __FUNCTION__, "Context");
- SCM_ASSERT_TYPE(gh_symbol_p (name), name, SCM_ARG2, __FUNCTION__, "symbol");
+ Context *tr = unsmob_context (context);
- tr->internal_set_property (name, val);
+ tr->set_property (name, val);
return SCM_UNSPECIFIED;
}
-
-LY_DEFINE(ly_context_property_where_defined,
- "ly:context-property-where-defined", 2, 0, 0,
- (SCM context, SCM name),
- "Return the context above @var{context} where @var{name} is defined.")
+LY_DEFINE (ly_context_property_where_defined, "ly:context-property-where-defined",
+ 2, 0, 0, (SCM context, SCM name),
+ "Return the context above @var{context} "
+ "where @var{name} is defined.")
{
- Context *t = unsmob_context (context);
- Context * tr = (t);
- SCM_ASSERT_TYPE(tr, context, SCM_ARG1, __FUNCTION__, "Context");
- SCM_ASSERT_TYPE(gh_symbol_p (name), name, SCM_ARG2, __FUNCTION__, "symbol");
-
-
- tr = tr->where_defined (name);
+ LY_ASSERT_SMOB (Context, context, 1);
+ LY_ASSERT_TYPE(ly_is_symbol,name, 2);
+
+ Context *tr = unsmob_context (context);
+ SCM val;
+ tr = tr->where_defined (name, &val);
if (tr)
- return tr->self_scm();
+ return tr->self_scm ();
return SCM_EOL;
}
-LY_DEFINE(ly_unset_context_property,
- "ly:unset-context-property", 2, 0, 0,
- (SCM context, SCM name),
- "Unset value of property @var{name} in context @var{context}.")
+LY_DEFINE (ly_context_unset_property, "ly:context-unset-property", 2, 0, 0,
+ (SCM context, SCM name),
+ "Unset value of property @var{name} in context @var{context}.")
{
- Context *t = unsmob_context (context);
- Context * tr = (t);
- SCM_ASSERT_TYPE(tr, context, SCM_ARG1, __FUNCTION__, "Context");
- SCM_ASSERT_TYPE(gh_symbol_p (name), name, SCM_ARG2, __FUNCTION__, "symbol");
-
+ LY_ASSERT_SMOB (Context, context, 1);
+ LY_ASSERT_TYPE(ly_is_symbol,name, 2);
+ Context *tr = unsmob_context (context);
+
tr->unset_property (name);
-
return SCM_UNSPECIFIED;
}
-
-
-LY_DEFINE(ly_context_parent,
- "ly:context-parent", 1, 0, 0,
- (SCM context),
- "Return the parent of @var{context}, #f if none.")
+LY_DEFINE (ly_context_parent, "ly:context-parent",
+ 1, 0, 0, (SCM context),
+ "Return the parent of @var{context}, @code{#f} if none.")
{
- Context *t = unsmob_context (context);
- Context * tr= (t);
+ LY_ASSERT_SMOB (Context, context, 1);
+ Context *tr = unsmob_context (context);
- SCM_ASSERT_TYPE(tr, context, SCM_ARG1, __FUNCTION__, "Context");
-
- tr = tr->daddy_context_ ;
+ tr = tr->get_parent_context ();
if (tr)
- return tr->self_scm();
+ return tr->self_scm ();
else
return SCM_BOOL_F;
}
-/*
- Todo: should support translator IDs, and creation?
- */
-LY_DEFINE(ly_translator_find,
- "ly:translator-find", 2, 0,0,
- (SCM context, SCM name),
- "Find a parent of @var{context} that has name or alias @var{name}. "
- "Return @code{#f} if not found." )
+/* FIXME: todo: should support translator IDs, and creation? */
+LY_DEFINE (ly_context_find, "ly:context-find",
+ 2, 0, 0, (SCM context, SCM name),
+ "Find a parent of @var{context} that has name or alias @var{name}. "
+ "Return @code{#f} if not found.")
{
- Context * tr= ( unsmob_context (context));
+ LY_ASSERT_SMOB (Context, context, 1);
+ LY_ASSERT_TYPE(ly_is_symbol,name, 2);
+ Context *tr = unsmob_context (context);
- SCM_ASSERT_TYPE(tr, context, SCM_ARG1, __FUNCTION__, "context");
- SCM_ASSERT_TYPE(gh_symbol_p (name), name, SCM_ARG2, __FUNCTION__, "symbol");
-
while (tr)
{
if (tr->is_alias (name))
- return tr->self_scm();
- tr = tr->daddy_context_ ;
+ return tr->self_scm ();
+ tr = tr->get_parent_context ();
}
-
+
return SCM_BOOL_F;
}
-
-LY_DEFINE(ly_context_properties,
- "ly:context-properties", 1, 0, 0,
- (SCM context),
- "Return all properties of @var{context} in an alist.")
+LY_DEFINE (ly_context_now, "ly:context-now",
+ 1, 0, 0, (SCM context),
+ "Return now-moment of context CONTEXT")
{
- Context *t = unsmob_context (context);
- Context * tr= (t);
+ LY_ASSERT_SMOB (Context, context, 1);
+ Context *ctx = unsmob_context (context);
+ return ctx->now_mom ().smobbed_copy ();
+}
- SCM_ASSERT_TYPE(tr, context, SCM_ARG1, __FUNCTION__, "Context");
+LY_DEFINE (ly_context_event_source, "ly:context-event-source",
+ 1, 0, 0, (SCM context),
+ "Return event-source of context CONTEXT")
+{
+ LY_ASSERT_SMOB (Context, context, 1);
+ Context *ctx = unsmob_context (context);
+ return ctx->event_source ()->self_scm ();
+}
- return tr->properties_as_alist ();
+LY_DEFINE (ly_context_events_below, "ly:context-events-below",
+ 1, 0, 0, (SCM context),
+ "Return a stream-distributor that distributes all events\n"
+ " from @var{context} and all its subcontexts.")
+{
+ LY_ASSERT_SMOB (Context, context, 1);
+ Context *ctx = unsmob_context (context);
+ return ctx->events_below ()->self_scm ();
}