#include "context.hh"
#include "engraver.hh"
+#include "global-context.hh"
#include "international.hh"
#include "item.hh"
#include "main.hh"
grob_property_path, new_value);
}
+bool
+typecheck_grob (SCM symbol, SCM value)
+{
+ if (is_unpure_pure_container (value))
+ return typecheck_grob (symbol, unpure_pure_container_unpure_part (value))
+ && typecheck_grob (symbol, unpure_pure_container_pure_part (value));
+ return ly_is_procedure (value)
+ || is_simple_closure (value)
+ || type_check_assignment (symbol, value, ly_symbol2scm ("backend-type?"));
+}
+
/*
Grob descriptions (ie. alists with layout properties) are
represented as a (ALIST . BASED-ON) pair, where BASED-ON is the
{
SCM current_context_val = SCM_EOL;
- Context *where = context->where_defined (context_property,
- ¤t_context_val);
+ if (!context->here_defined (context_property, ¤t_context_val))
+ {
+ Context *g = context->get_global_context ();
+ if (!g)
+ return; // Context is probably dead
- /*
- Don't mess with MIDI.
- */
- if (!where)
- return;
+ /*
+ Don't mess with MIDI.
+ */
+ if (g == context
+ || !g->here_defined (context_property, ¤t_context_val))
+ return;
- if (where != context)
- {
- SCM base = updated_grob_properties (context, context_property);
+ /* where != context */
+
+ SCM base = updated_grob_properties (context->get_parent_context (),
+ context_property);
current_context_val = scm_cons (base, base);
context->set_property (context_property, current_context_val);
}
*/
target_alist = scm_acons (symbol, new_value, target_alist);
- bool ok = true;
- bool pc = is_unpure_pure_container (new_value);
- SCM vals[] = {pc ? unpure_pure_container_unpure_part (new_value) : new_value,
- pc ? unpure_pure_container_pure_part (new_value) : SCM_BOOL_F
- };
-
- for (int i = 0; i < 2; i++)
- if (!ly_is_procedure (vals[i])
- && !is_simple_closure (vals[i]))
- ok = ok && type_check_assignment (symbol, vals[i],
- ly_symbol2scm ("backend-type?"));
/*
tack onto alist. We can use set_car, since
updated_grob_properties () in child contexts will check
for changes in the car.
*/
- if (ok)
+ if (typecheck_grob (symbol, new_value))
{
scm_set_car_x (current_context_val, target_alist);
}
SCM grob_property_path)
{
SCM current_context_val = SCM_EOL;
- if (context->where_defined (context_property, ¤t_context_val)
- == context)
+ if (context->here_defined (context_property, ¤t_context_val))
{
SCM current_alist = scm_car (current_context_val);
SCM daddy = scm_cdr (current_context_val);