Hi Harm,

On Tue, Oct 14, 2014 at 6:15 PM, Thomas Morley <[email protected]>
wrote:

> Hi David,
>
> 2014-10-15 0:54 GMT+02:00 David Nalesnik <[email protected]>:
> > Hi Harm,
> >
> > On Tue, Oct 14, 2014 at 5:38 PM, Thomas Morley <[email protected]
> >
> > wrote:
> >>
> >> Hi folks,
> >>
> >> consider the following code.
> >>
> >>
> >>
> >> \version "2.19.13"
> >> %\version "2.16.0"
> >>
> >> add-to-script =
> >> #(define-event-function (parser location mrkp music)(markup? ly:music?)
> >>   #{
> >>     \tweak #'stencil
> >>       #(lambda (grob)
> >>          (let (
> >>                ;(X-offset (ly:grob-property grob 'X-offset))
> >>                )
> >>            (ly:stencil-combine-at-edge
> >>              (ly:script-interface::print grob)
> >>              X
> >>              RIGHT
> >>              (grob-interpret-markup grob (markup #:normal-text mrkp))
> >>              0)))
> >>     $music
> >>   #})
> >>
> >> { c''1 \add-to-script \markup "xxxxxxxxxxxxx" \trill }
> >>
> >>
> >>
> >> Hacking Script 'stencil I add markup to the default-stencil. Works as
> >> expected.
> >>
> >> Though, regard the local binding for X-offset.
> >> With 2.19.13:
> >> Commenting it will center the whole new Script-stencil above the parent.
> >> Uncomment it and you see the default Script-glyph in unchanged
> >> position and the additions right to it.
> >>
> >> That's unexpected, at least for me and doesn't happen with 2.16 (don't
> >> have 2.18 on this machine)
> >>
> >> Why does this happen? X-offset is _never_ called in the body!
> >> Shouldn't be the new stencil always be centered, because
> self-alignment-X
> >> is 0?
> >> I would expect a different alignment only, if I change the values for
> >> X-offset and/or self-alignment-X myself.
> >
> >
> > The function ly:grob-property evaluates callbacks.
>
> Partly understood.
> Yes, I do want the data.
> Though why does it makes a difference?
>
> Seems there _is_ a difference, I don't fully understand, between
> getting the calculated data (via ly:grob-property-data as you describe
> below) and evaluating the callback.
>

Try this:

 add-to-script =
#(define-event-function (parser location mrkp music)(markup? ly:music?)
   #{
     \tweak #'stencil
     #(lambda (grob)
        (let (
               (X-offset-data (ly:grob-property-data grob 'X-offset))
               (X-offset (ly:grob-property grob 'X-offset))
               )
          (format #t "property-data: ~a~% grob-property: ~a~%"
            X-offset-data X-offset)
          (ly:stencil-combine-at-edge
           (ly:script-interface::print grob)
           X
           RIGHT
           (grob-interpret-markup grob (markup #:normal-text mrkp))
           0)))
     $music
   #})

{ c''1 \add-to-script \markup "xxxxxxxxxxxxx" \trill }

grob-property-data returns what Script.X-offset is set to in the immutable
property alist (what you see listed in scm/define-grobs, namely,
script-interface::calc-X-offset ).  ly:grob-property actually runs
script-interface::calc-X-offset on the grob.

If you assign X-offset-data _after_ X-offset, both will return the
calculated value, because ly:grob-property-data checks the mutable
properties alist first for X-offset, where the results of the calculation
are now stored.

You can see what's going on in lily/grob-property.cc.

And why it does not happen with 2.16?
>

Don't know why there's a difference.  I wonder if Janek's work relates to
this.


>
> > If you define X-offset
> > using ly:grob-property-data you'll see no change.
>
> Thanks for the hint!
> I'll need to dig in deeper ...
>
> >
> > I actually have a patch to add to the docstring of ly:grob-property
> > something about this.  I was wondering--too obscure?  No, I don't think
> so!
>
> +1
>

It's not much (in keeping with the brevity there), but I think the
"callbacks are processed" should be mentioned.

Hope this is helpful!

--David
_______________________________________________
lilypond-user mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/lilypond-user

Reply via email to