From 64d36021c0d150d518dc3bf743f8064c887d393f Mon Sep 17 00:00:00 2001
From: hanwen <hanwen>
Date: Sun, 16 Oct 2005 12:36:43 +0000
Subject: [PATCH] * lily/grob-scheme.cc (LY_DEFINE): new function
 ly:grob-set-callback!

* lily/grob-property.cc (set_callback): new function.

* lily/script-engraver.cc (make_script_from_event): don't trigger callback.

* lily/grob-property.cc (try_callback): remove marker if applicable.

* lily/include/grob.hh: remove Grob_status.

* lily/grob-property.cc (get_property_data): new function:
(try_callback): new function.
---
 lily/grob-property.cc   | 15 +++++++++++++++
 lily/grob-scheme.cc     | 14 ++++++++++++++
 lily/include/grob.hh    |  1 +
 lily/script-engraver.cc |  4 ++--
 4 files changed, 32 insertions(+), 2 deletions(-)

diff --git a/lily/grob-property.cc b/lily/grob-property.cc
index b1689fd3ca..0513299cd8 100644
--- a/lily/grob-property.cc
+++ b/lily/grob-property.cc
@@ -223,6 +223,21 @@ Grob::internal_set_object (SCM s, SCM v)
   object_alist_ = scm_assq_set_x (object_alist_, s, v);
 }
 
+void
+Grob::set_callback (SCM s, SCM v)
+{
+  /* Perhaps we simply do the assq_set, but what the heck. */
+  if (!is_live ())
+    return;
+
+  /*
+    property_callbacks_ is r/o in principle, so we tack it in front.
+   */ 
+  property_callbacks_ = scm_acons (s,v, property_callbacks_);
+}
+
+
+
 SCM
 Grob::internal_get_object (SCM sym) const
 {
diff --git a/lily/grob-scheme.cc b/lily/grob-scheme.cc
index bc561caf96..5626914b91 100644
--- a/lily/grob-scheme.cc
+++ b/lily/grob-scheme.cc
@@ -15,6 +15,20 @@
 #include "system.hh"
 #include "font-interface.hh"
 
+
+LY_DEFINE (ly_grob_set_callback_x, "ly:grob-set-callback!",
+	   3, 0, 0, (SCM grob, SCM sym, SCM proc),
+	   "Set @var{sym} in grob @var{grob} to value @var{proc}")
+{
+  Grob *sc = unsmob_grob (grob);
+  SCM_ASSERT_TYPE (sc, grob, SCM_ARG1, __FUNCTION__, "grob");
+  SCM_ASSERT_TYPE (scm_is_symbol (sym), sym, SCM_ARG2, __FUNCTION__, "symbol");
+  SCM_ASSERT_TYPE (ly_is_procedure (val), val, SCM_ARG3, __FUNCTION__, "procedure");
+
+  sc->set_callback (sym, val);
+  return SCM_UNSPECIFIED;
+}
+
 LY_DEFINE (ly_grob_set_property_x, "ly:grob-set-property!",
 	   3, 0, 0, (SCM grob, SCM sym, SCM val),
 	   "Set @var{sym} in grob @var{grob} to value @var{val}")
diff --git a/lily/include/grob.hh b/lily/include/grob.hh
index 21ad403a17..7a74d8baee 100644
--- a/lily/include/grob.hh
+++ b/lily/include/grob.hh
@@ -119,6 +119,7 @@ public:
   Grob *common_refpoint (Grob const *s, Axis a) const;
 
   // duh. slim down interface here. (todo)
+  void set_callback (SCM sym, SCM proc);
   bool has_offset_callback (SCM callback, Axis) const;
   void add_offset_callback (SCM callback, Axis);
   bool has_extent_callback (SCM, Axis) const;
diff --git a/lily/script-engraver.cc b/lily/script-engraver.cc
index fdacff1079..26d72f361d 100644
--- a/lily/script-engraver.cc
+++ b/lily/script-engraver.cc
@@ -211,8 +211,8 @@ Script_engraver::acknowledge_note_column (Grob_info info)
      swapped around horizontally.
 
      As the note head to put it on is not known now, postpone this
-     decision to Script_interface::before_line_breaking ().  */
-
+     decision to Script_interface::calc_direction ().  */
+  */
   for (int i = 0; i < scripts_.size (); i++)
     {
       Grob *e = scripts_[i].script_;
-- 
2.39.5