]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/context-property.cc
Release: bump version.
[lilypond.git] / lily / context-property.cc
index 7ee4b904d9a7edaf34aa4f0247cd704208ddf097..1ccfe5a970973e7ce3be409406985dcafd0e42f7 100644 (file)
@@ -1,7 +1,7 @@
 /*
   This file is part of LilyPond, the GNU music typesetter.
 
-  Copyright (C) 2004--2011 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  Copyright (C) 2004--2012 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
@@ -24,6 +24,7 @@
 #include "main.hh"
 #include "simple-closure.hh"
 #include "spanner.hh"
+#include "unpure-pure-container.hh"
 #include "warn.hh"
 
 /*
@@ -113,10 +114,16 @@ execute_override_property (Context *context,
   target_alist = scm_acons (symbol, new_value, target_alist);
 
   bool ok = true;
-  if (!ly_is_procedure (new_value)
-      && !is_simple_closure (new_value))
-    ok = type_check_assignment (symbol, new_value,
-                                ly_symbol2scm ("backend-type?"));
+  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
@@ -218,29 +225,38 @@ execute_pushpop_property (Context *context,
 void
 apply_property_operations (Context *tg, SCM pre_init_ops)
 {
-  SCM correct_order = scm_reverse (pre_init_ops);
-  for (SCM s = correct_order; scm_is_pair (s); s = scm_cdr (s))
+  for (SCM s = pre_init_ops; scm_is_pair (s); s = scm_cdr (s))
     {
       SCM entry = scm_car (s);
       SCM type = scm_car (entry);
       entry = scm_cdr (entry);
+      if (!scm_is_pair (entry))
+        continue;
+      SCM context_prop = scm_car (entry);
+      if (scm_is_pair (context_prop))
+        {
+          if (tg->is_alias (scm_car (context_prop)))
+            context_prop = scm_cdr (context_prop);
+          else
+            continue;
+        }
 
       if (type == ly_symbol2scm ("push"))
         {
-          SCM context_prop = scm_car (entry);
           SCM val = scm_cadr (entry);
           SCM grob_prop_path = scm_cddr (entry);
           sloppy_general_pushpop_property (tg, context_prop, grob_prop_path, val);
         }
       else if (type == ly_symbol2scm ("pop"))
         {
-          SCM context_prop = scm_car (entry);
           SCM val = SCM_UNDEFINED;
           SCM grob_prop_path = scm_cdr (entry);
           sloppy_general_pushpop_property (tg, context_prop, grob_prop_path, val);
         }
       else if (type == ly_symbol2scm ("assign"))
-        tg->set_property (scm_car (entry), scm_cadr (entry));
+        tg->set_property (context_prop, scm_cadr (entry));
+      else if (type == ly_symbol2scm ("apply"))
+        scm_apply_1 (context_prop, tg->self_scm (), scm_cdr (entry));
     }
 }