/*
- grob-scheme.cc -- Scheme entry points for the grob datatype
+ This file is part of LilyPond, the GNU music typesetter.
- source file of the GNU LilyPond music typesetter
-
- (c) 1998--2009 Jan Nieuwenhuizen <janneke@gnu.org>
+ Copyright (C) 1998--2010 Jan Nieuwenhuizen <janneke@gnu.org>
Han-Wen Nienhuys <hanwen@xs4all.nl>
+
+ LilyPond is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ LilyPond is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with LilyPond. If not, see <http://www.gnu.org/licenses/>.
*/
#include "warn.hh" // error ()
return SCM_UNSPECIFIED;
}
+LY_DEFINE (ly_grob_set_nested_property_x, "ly:grob-set-nested-property!",
+ 3, 0, 0, (SCM grob, SCM symlist, SCM val),
+ "Set nested property @var{symlist} in grob @var{grob} to value @var{val}.")
+{
+ Grob *sc = unsmob_grob (grob);
+
+ LY_ASSERT_SMOB (Grob, grob, 1);
+
+ bool type_ok = ly_cheap_is_list (symlist);
+
+ if (type_ok)
+ for (SCM s = symlist; scm_is_pair (s) && type_ok; s = scm_cdr (s))
+ type_ok &= ly_is_symbol (scm_car (s));
+
+ SCM_ASSERT_TYPE (type_ok, symlist, SCM_ARG2, __FUNCTION__, "list of symbols");
+
+ set_nested_property (sc, symlist, val);
+ return SCM_UNSPECIFIED;
+}
+
+
LY_DEFINE (ly_grob_property, "ly:grob-property",
2, 1, 0, (SCM grob, SCM sym, SCM val),
"Return the value for property @var{sym} of @var{grob}."
}
+LY_DEFINE (ly_grob_set_object_x, "ly:grob-set-object!",
+ 3, 0, 0, (SCM grob, SCM sym, SCM val),
+ "Set @var{sym} in grob @var{grob} to value @var{val}.")
+{
+ Grob *sc = unsmob_grob (grob);
+
+ LY_ASSERT_SMOB (Grob, grob, 1);
+ LY_ASSERT_TYPE (ly_is_symbol, sym, 2);
+
+ sc->set_object (sym, val);
+ return SCM_UNSPECIFIED;
+}
/* TODO: make difference between scaled and unscalead variable in
calling (i.e different funcs.) */
return par ? par->self_scm () : SCM_EOL;
}
+LY_DEFINE (ly_grob_set_parent_x, "ly:grob-set-parent!",
+ 3, 0, 0, (SCM grob, SCM axis, SCM parent_grob),
+ "Set @var{parent-grob} the parent of grob @var{grob} in axis @var{axis}.")
+{
+ Grob *gr = unsmob_grob (grob);
+ Grob *parent = unsmob_grob (parent_grob);
+
+ LY_ASSERT_SMOB (Grob, grob, 1);
+ LY_ASSERT_TYPE (is_axis, axis, 2);
+ LY_ASSERT_SMOB (Grob, parent_grob, 3);
+
+ Axis a = Axis (scm_to_int (axis));
+ gr->set_parent (parent, a);
+ return SCM_UNSPECIFIED;
+}
+
LY_DEFINE (ly_grob_properties, "ly:grob-properties",
1, 0, 0, (SCM grob),
"Get the mutable properties of @var{grob}.")
Grob *refp = common_refpoint_of_array (ga->array (), gr, Axis (scm_to_int (axis)));
return refp ? refp->self_scm () : SCM_BOOL_F;
}
+
+LY_DEFINE (ly_grob_chain_callback, "ly:grob-chain-callback",
+ 3, 0, 0, (SCM grob, SCM proc, SCM sym),
+ "Find the callback that is stored as property"
+ " @var{sym} of grob @var{grob} and chain @var{proc}"
+ " to the head of this, meaning that it is called"
+ " using @var{grob} and the previous callback's result.")
+{
+ Grob *gr = unsmob_grob (grob);
+
+ LY_ASSERT_SMOB (Grob, grob, 1);
+ LY_ASSERT_TYPE (ly_is_procedure, proc, 2);
+ LY_ASSERT_TYPE (ly_is_symbol, sym, 3);
+
+ chain_callback (gr, proc, sym);
+ return SCM_UNSPECIFIED;
+}