From: hanwen Date: Sun, 16 Oct 2005 12:36:43 +0000 (+0000) Subject: * lily/grob-scheme.cc (LY_DEFINE): new function ly:grob-set-callback! X-Git-Tag: release/2.7.16^2~84 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=64d36021c0d150d518dc3bf743f8064c887d393f;p=lilypond.git * 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. --- 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_;