lilypond-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: event listener and engraver properties


From: Neil Puttock
Subject: Re: event listener and engraver properties
Date: Wed, 1 Jun 2011 21:47:25 +0100

On 1 June 2011 20:31, Graham Percival <address@hidden> wrote:

> However, I'm confused/concerned about getting the text value of
> text spanners.  I'm currently doing:
>
> #(define (format-textspan engraver event)
>   (let* ((context (ly:translator-context engraver))
>          (moment (ly:context-current-moment context))
>          (spanner-props (ly:context-property context TextSpanner))
>          (details (chain-assoc-get 'bound-details spanner-props))
>          (left-props (assoc-get 'left details '()))
>          (left-text (assoc-get 'text left-props '())))
>     (print-line engraver
>                 "set_string"
>                 (ly:event-property event 'span-direction)
>                 left-text)))
>
> which uses the engraver.  I couldn't see any event-specific way to
> get the text of a text spanner -- the information appears to exist
> on the engraver level only.

Hmm, this is one situation where listening to events isn't as user-friendly.

The event for a text spanner doesn't carry the text info since it's
applied via an override (a separate event class).  You'd need to
listen for overrides and check the symbol being set (which is the grob
the override's applied to):

\version "2.15.0"

listen =
#(define-music-function (parser location music) (ly:music?)

   (define (add-stream-listener global listener . types)
     (apply ly:add-listener
            (cons* listener (ly:context-events-below global) types))
     global)

   (define (process-event event)
     (case (ly:event-property event 'class)
       ((text-span-event)
        (newline)
        (display (ly:event-property event 'span-direction)))
       ((Override)
        (newline)
        (display (ly:event-property event 'symbol)))))

   (let* ((global (ly:make-global-context $defaultlayout))
          (listener (ly:make-listener process-event))
          (global-disp (ly:context-events-below global)))

     (ly:connect-dispatchers (ly:make-dispatcher) global-disp)
     (add-stream-listener global listener 'StreamEvent)
     (ly:interpret-music-expression music global)
     music))

\listen
\relative c' {
  \override TextSpanner #'(bound-details left text) = #"foo"
  c1\startTextSpan
  c1\stopTextSpan
}

Cheers,
Neil



reply via email to

[Prev in Thread] Current Thread [Next in Thread]