X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=scm%2Flily-library.scm;h=91ece1e476a360785b81614f636d59e79d9123d7;hb=0cff19d6ce3479985ce3d57bc07b85630c92e062;hp=514f5b40fb576f37ee1ad5321b0e4d83388dc74a;hpb=70365334614c31a82e9a3860c9eb9334cdc2879a;p=lilypond.git diff --git a/scm/lily-library.scm b/scm/lily-library.scm index 514f5b40fb..91ece1e476 100644 --- a/scm/lily-library.scm +++ b/scm/lily-library.scm @@ -285,30 +285,24 @@ bookoutput function" (ly:add-context-mod mods (list 'apply (ly:music-property m 'procedure)))) - ((SequentialMusic SimultaneousMusic) - (fold loop context (ly:music-property m 'elements))) ((ContextSpeccedMusic) (loop (ly:music-property m 'element) (ly:music-property m 'context-type))) - (else (if (and warn (ly:duration? (ly:music-property m 'duration))) - (begin - (ly:music-warning - music - (_ "Music unsuitable for context-mod")) - (set! warn #f)))))) + (else + (let ((callback (ly:music-property m 'elements-callback))) + (if (procedure? callback) + (fold loop context (callback m)) + (if (and warn (ly:duration? (ly:music-property m 'duration))) + (begin + (ly:music-warning + music + (_ "Music unsuitable for context-mod")) + (set! warn #f)))))))) context) mods)) (define-public (context-defs-from-music parser output-def music) - (let ((bottom 'Voice) (warn #t)) - (define (get-bottom sym) - (or - (let ((def (ly:output-def-lookup output-def sym #f))) - (and def - (let ((def-child (ly:context-def-lookup def 'default-child #f))) - (and def-child - (get-bottom def-child))))) - sym)) + (let ((warn #t)) (let loop ((m music) (mods #f)) ;; The parser turns all sets, overrides etc into something ;; wrapped in ContextSpeccedMusic. If we ever get a set, @@ -338,34 +332,38 @@ bookoutput function" (ly:music-property m 'symbol) (ly:music-property m 'grob-property-path))))) (case (ly:music-property m 'name) - ((SequentialMusic SimultaneousMusic) - (fold loop mods (ly:music-property m 'elements))) ((ApplyContext) (ly:add-context-mod mods (list 'apply (ly:music-property m 'procedure)))) ((ContextSpeccedMusic) - (let ((sym (ly:music-property m 'context-type))) - (if (eq? sym 'Bottom) - (set! sym bottom) - (set! bottom (get-bottom sym))) - (let ((def (ly:output-def-lookup output-def sym))) - (if (ly:context-def? def) - (ly:output-def-set-variable! - output-def sym - (ly:context-def-modify - def - (loop (ly:music-property m 'element) - (ly:make-context-mod)))) - (ly:music-warning - music - (ly:format (_ "Cannot find context-def \\~a") sym)))))) - (else (if (and warn (ly:duration? (ly:music-property m 'duration))) - (begin - (ly:music-warning - music - (_ "Music unsuitable for output-def")) - (set! warn #f)))))) + ;; Use let* here to let defs catch up with modifications + ;; to the context defs made in the recursion + (let* ((mods (loop (ly:music-property m 'element) + (ly:make-context-mod))) + (defs (ly:output-find-context-def + output-def (ly:music-property m 'context-type)))) + (if (null? defs) + (ly:music-warning + music + (ly:format (_ "Cannot find context-def \\~a") + (ly:music-property m 'context-type))) + (for-each + (lambda (entry) + (ly:output-def-set-variable! + output-def (car entry) + (ly:context-def-modify (cdr entry) mods))) + defs)))) + (else + (let ((callback (ly:music-property m 'elements-callback))) + (if (procedure? callback) + (fold loop mods (callback m)) + (if (and warn (ly:duration? (ly:music-property m 'duration))) + (begin + (ly:music-warning + music + (_ "Music unsuitable for output-def")) + (set! warn #f)))))))) mods)))