grobs that have tweaks specced.
+2004-11-15 Han-Wen Nienhuys <hanwen@xs4all.nl>
+
+ * lily/system.cc (apply_tweaks): new function. Run tweaks on all
+ grobs that have tweaks specced.
+
2004-11-14 Heikki Junes <hjunes@cc.hut.fi>
* Documentation/user/sound-output.itexi: add code snippets for MIDI.
class Note_performer;
class Output_def;
class Object_key;
+class Object_key_dumper;
+class Object_key_undumper;
class Output_property;
class Page;
class Paper_book;
public:
Object_key_undumper *undumper() const;
void clear ();
- void insert_tweak (SCM);
+ void insert_grob_tweak (Grob*, SCM);
SCM get_tweaks (Grob *);
SCM list_tweaks ();
+ void insert_tweak_from_file (SCM);
Tweak_registry ();
};
+extern Tweak_registry *global_registry_;
+
DECLARE_UNSMOB(Tweak_registry, tweak_registry);
#endif /* TWEAK_REGISTRATION_HH */
Object_key *
Lilypond_context_key::from_scheme (SCM a)
{
- return new Lilypond_grob_key (unsmob_key (scm_car (a)),
- *unsmob_moment (scm_cadr (a)),
- ly_scm2string (scm_list_ref (a, scm_from_int (2))),
- scm_to_int (scm_list_ref (a, scm_from_int (3))));
+ return new Lilypond_context_key (unsmob_key (scm_car (a)),
+ *unsmob_moment (scm_cadr (a)),
+ ly_scm2string (scm_list_ref (a, scm_from_int (2))),
+ ly_scm2string (scm_list_ref (a, scm_from_int (3))),
+ scm_to_int (scm_list_ref (a, scm_from_int (4))));
}
static void
determine_output_options ()
{
-
+ bool found_gnome = false;
bool found_tex = false;
SCM formats = ly_output_formats ();
for (SCM s = formats; scm_is_pair (s); s = scm_cdr (s))
{
found_tex = found_tex || (ly_scm2string (scm_car (s)) == "tex");
+ found_gnome = found_gnome || ly_scm2string(scm_car (s)) == "gnome";
}
-
if (make_pdf || make_png)
{
make_ps = true;
{
make_tex = true;
}
- if (!(make_dvi
- || make_tex
- || make_ps
- || make_png
- || make_pdf))
+ if (!found_gnome
+ && !(make_dvi
+ || make_tex
+ || make_ps
+ || make_png
+ || make_pdf))
{
make_pdf = true;
make_ps = true;
}
}
+void init_global_tweak_registry();
+
static void
main_with_guile (void *, int, char **)
{
ly_c_init_guile ();
call_constructors ();
-
+
+ init_global_tweak_registry ();
+
determine_output_options ();
all_fonts_global = new All_font_metrics (global_path.to_string ());
SCM
Object_key_dumper::key_serial (int k)
{
- return scm_cons (ly_symbol2scm ("key"),
- scm_from_int (k));
+ return scm_list_2 (ly_symbol2scm ("key"),
+ scm_from_int (k));
}
SCM
SCM *tail = &new_key;
for (SCM t = skey; scm_is_pair (t); t = scm_cdr (t))
{
- SCM entry = scm_car (t);
- if (scm_is_pair (entry)
- && scm_car (entry) == ly_symbol2scm ("key"))
+ SCM item = scm_car (t);
+ if (scm_is_pair (item)
+ && scm_car (item) == ly_symbol2scm ("key"))
{
- int index = scm_to_int (scm_cadr (entry));
+ int index = scm_to_int (scm_cadr (item));
Object_key const *key = get_key (index);
*tail = scm_cons (key->self_scm(), SCM_EOL);
}
else
{
- *tail = scm_cons (entry, SCM_EOL);
+ *tail = scm_cons (item, SCM_EOL);
}
tail = SCM_CDRLOC(*tail);
}
} undumpers[] = {
{BASE_KEY, Object_key::from_scheme},
{COPIED_KEY, Copied_key::from_scheme},
+ {GENERAL_KEY, Lilypond_general_key::from_scheme},
{GROB_KEY, Lilypond_grob_key::from_scheme},
{CONTEXT_KEY, Lilypond_context_key::from_scheme},
- {GENERAL_KEY, Lilypond_general_key::from_scheme},
{KEY_COUNT,0},
};
Spring_smob::mark_smob (SCM) { return SCM_UNSPECIFIED; }
int
-Spring_smob::print_smob (SCM s, SCM p, scm_print_state *)
+Spring_smob::print_smob (SCM, SCM p, scm_print_state *)
{
scm_puts ("#<Spring smob>", p);
return 1;
#include "staff-symbol-referencer.hh"
#include "paper-book.hh"
#include "paper-system.hh"
+#include "tweak-registration.hh"
System::System (System const &src, int count)
Axis_group_interface::add_element (me, p);
}
+void
+apply_tweaks (Grob *g, bool broken)
+{
+ if (bool (g->original_) == broken)
+ {
+ SCM tweaks = global_registry_->get_tweaks (g);
+ for (SCM s = tweaks; scm_is_pair (s); s = scm_cdr (s))
+ {
+ SCM proc = scm_caar (s);
+ SCM rest = scm_cdar (s);
+ scm_apply_1 (proc, g->self_scm(), rest);
+ }
+ }
+}
+
void
System::pre_processing ()
{
unsmob_grob (scm_car (s))->handle_prebroken_dependencies ();
fixup_refpoints (get_property ("all-elements"));
+
+ for (SCM s = get_property ("all-elements"); scm_is_pair (s); s = scm_cdr (s))
+ apply_tweaks (unsmob_grob (scm_car (s)), false);
+
for (SCM s = get_property ("all-elements"); scm_is_pair (s); s = scm_cdr (s))
{
Grob *sc = unsmob_grob (scm_car (s));
for (SCM s = get_property ("all-elements"); scm_is_pair (s); s = scm_cdr (s))
{
Grob *g = unsmob_grob (scm_car (s));
+
+ apply_tweaks (g, true);
+
g->calculate_dependencies (POSTCALCED, POSTCALCING,
ly_symbol2scm ("after-line-breaking-callback"));
}
}
void
-Tweak_registry::insert_tweak (SCM tweak)
+Tweak_registry::insert_tweak_from_file (SCM tweak)
{
SCM skey = scm_car (tweak);
tweaks_[key] = scm_cons (scm_cdr (tweak), tweaks_[key]);
}
+
+void
+Tweak_registry::insert_grob_tweak (Grob *g, SCM tweak)
+{
+ Object_key const * key = g->get_key ();
+ if (tweaks_.find (key) == tweaks_.end())
+ {
+ tweaks_[key] = SCM_EOL;
+ }
+
+ tweaks_[key] = scm_cons (tweak, tweaks_[key]);
+}
+
+
SCM
Tweak_registry::get_tweaks (Grob *g)
{
const Object_key * key = (*i).first;
for (SCM t = (*i).second; scm_is_pair (t); t = scm_cdr (t))
{
- retval = scm_cons (key->self_scm(), scm_car (t));
+ retval = scm_cons (scm_cons (key->self_scm(), scm_car (t)), retval);
}
}
scm_gc_mark ((*i).second);
}
- return me->undumper_ ? me->undumper_->self_scm() : SCM_EOL;
+ if (me->undumper_)
+ scm_gc_mark (me->undumper_->self_scm());
+
+ return SCM_EOL;
}
-
int
Tweak_registry::print_smob (SCM smob, SCM port, scm_print_state*)
{
void
init_global_tweak_registry()
{
- // global_registry_ = new Tweak_registry();
+ global_registry_ = new Tweak_registry();
}
-ADD_SCM_INIT_FUNC(init_global_tweak_registry,init_global_tweak_registry);
-LY_DEFINE(ly_clear_tweak_registry, "ly:clear-tweak-registry",
+LY_DEFINE(ly_clear_tweak_registry, "ly:tweak-clear-registry",
0,0,0,(),
"Clear global tweak registry"
)
return SCM_UNSPECIFIED;
}
+LY_DEFINE(ly_insert_tweak, "ly:insert-tweak",
+ 2,0,0,
+ (SCM grob, SCM tweak),
+ "add new tweak for grob."
+ )
+{
+ Grob *gr = unsmob_grob (grob);
+ SCM_ASSERT_TYPE(gr, grob, SCM_ARG1, __FUNCTION__, "Grob");
+ SCM_ASSERT_TYPE(scm_list_p (tweak) == SCM_BOOL_T
+ && ly_c_procedure_p (scm_car (tweak)),
+ tweak, SCM_ARG2, __FUNCTION__, "Tweak");
+
+ global_registry_->insert_grob_tweak (gr, tweak);
+ return SCM_UNSPECIFIED;
+}
+
-LY_DEFINE(ly_tweak_read_keys, "ly:tweak-read-keys",
+LY_DEFINE(ly_tweak_read_keys, "ly:tweak-define-keys",
1,0,0,(SCM keys),
"Read keys"
)
return SCM_UNSPECIFIED;
}
-LY_DEFINE(ly_tweak_read_tweaks, "ly:tweak-read-tweaks",
+
+LY_DEFINE(ly_all_tweaks, "ly:all-tweaks",
+ 0,0,0,(),
+ "all tweaks"
+ )
+{
+ return global_registry_->list_tweaks();
+}
+
+
+LY_DEFINE(ly_tweak_read_tweaks, "ly:tweak-define-tweaks",
1,0,0,(SCM tweaks),
"Read tweaks"
)
{
for (SCM s = tweaks; scm_is_pair (s); s = scm_cdr (s))
{
- global_registry_->insert_tweak (scm_car (s));
+ global_registry_->insert_tweak_from_file (scm_car (s));
}
return SCM_UNSPECIFIED;
}
(text-items #:init-value '() #:accessor text-items)
(grob #:init-value #f #:accessor grob)
(item-grobs #:init-value (make-hash-table 31) #:accessor item-grobs)
- (grob-tweaks #:init-value (make-hash-table 31) #:accessor grob-tweaks)
(window-width #:init-keyword #:window-width #:accessor window-width)
(window-height #:init-keyword #:window-height #:accessor window-height)
(canvas-width #:init-keyword #:canvas-width #:accessor canvas-width)
(ly:input-location music-origin)
#f)))
+
(define-method (tweak (go <gnome-outputter>) item offset)
(let* ((grob (hashq-ref (item-grobs go) item #f))
(extra-offset (ly:grob-property grob 'extra-offset))
(- 0 (cdr extra-offset))))))
(if grob
- (hashq-set! (grob-tweaks go) grob
- (cons
- 'extra-offset
- (list
- (cons (+ (car origin) (car offset))
- (- 0 (+ (cdr origin) (cdr offset))))))))))
-
-;; FIXME: this only saves new tweaks, old tweaks are lost.
+ (ly:insert-tweak grob (list tweak-grob-property
+ 'extra-offset
+ (offset-add origin offset))))))
+
(define-method (save-tweaks (go <gnome-outputter>))
(let*
((dumper (ly:make-dumper))
- (tweaks (hash-fold
- (lambda (grob value seed)
- (cons
- (list 'set-property
- (list
- 'key
- (ly:dumper-key-serial dumper (ly:grob-key grob)))
- value)
- seed))
- '() (grob-tweaks go))))
-
- (if (not (null? tweaks))
+ (tweaks (ly:all-tweaks))
+ (serialized-tweaks (map
+ (lambda (tweak)
+ (append
+ (list
+ (ly:dumper-key-serial dumper (car tweak))
+ (list 'unquote (procedure-name (cadr tweak))))
+ (cddr tweak)))
+ tweaks)))
+
+ (if (not (null? serialized-tweaks))
(let ((file (open-file (string-append (name go) ".twy") "w")))
(format file
";;;tweaks. Generated file. Do not edit.
-;;; KEYS
-(ly:clear-keys)
-(ly:define-keys `~S)
-;;; TWEAKS \n
-(ly:clear-twbeaks)
-(ly:define-tweaks `~S)"
-
+(ly:tweak-clear-registry)
+(ly:tweak-define-keys `~S)
+(ly:tweak-define-tweaks `~S)"
(ly:dumper-definitions dumper)
- tweaks)))))
+ serialized-tweaks)))))
;;;(define (item-event go grob item event)
(define (item-event go item event)
(let ((properties (ly:grob-properties grob))
(basic-properties (ly:grob-basic-properties grob))
- (id (ly:grob-id grob))
(x (inexact->exact (gdk-event-button:x-root event)))
(y (inexact->exact (gdk-event-button:y-root event))))
)))
+(define-public (offset-add a b)
+ (cons (+ (car a) (car b))
+ (+ (cdr a) (cdr b))))
+
(define-public (interval-length x)
"Length of the number-pair X, when an interval"
(max 0 (- (cdr x) (car x)))
(exit 0))))
+(define-public (tweak-grob-property grob sym val)
+ (set! (ly:grob-property grob sym) val))