2 tweak-registration.cc -- implement Tweak_registry
4 source file of the GNU LilyPond music typesetter
6 (c) 2004 Han-Wen Nienhuys <hanwen@xs4all.nl>
11 #include "object-key-undumper.hh"
12 #include "tweak-registration.hh"
13 #include "object-key.hh"
16 #include "ly-smobs.icc"
20 Tweak_registry::clear ()
23 undumper_ = new Object_key_undumper();
24 scm_gc_unprotect_object (undumper_->self_scm ());
28 Tweak_registry::insert_tweak_from_file (SCM tweak)
30 SCM skey = scm_car (tweak);
32 assert(scm_is_pair (skey) &&
33 scm_car (skey) == ly_symbol2scm ("key"));
35 Object_key const * key = undumper_->get_key (scm_to_int (scm_cadr (skey)));
36 if (tweaks_.find (key) == tweaks_.end())
38 tweaks_[key] = SCM_EOL;
41 tweaks_[key] = scm_cons (scm_cdr (tweak), tweaks_[key]);
46 Tweak_registry::insert_grob_tweak (Grob *g, SCM tweak)
48 Object_key const * key = g->get_key ();
49 if (tweaks_.find (key) == tweaks_.end())
51 tweaks_[key] = SCM_EOL;
54 tweaks_[key] = scm_cons (tweak, tweaks_[key]);
59 Tweak_registry::get_tweaks (Grob *g)
61 Object_key const *key = g->get_key();
62 if (tweaks_.find (key) == tweaks_.end())
69 Tweak_registry::Tweak_registry ()
73 undumper_ = new Object_key_undumper();
74 scm_gc_unprotect_object (undumper_->self_scm ());
77 Tweak_registry::~Tweak_registry ()
82 Tweak_registry::list_tweaks ()
85 for (Tweak_map::const_iterator i (tweaks_.begin ());
89 const Object_key * key = (*i).first;
90 for (SCM t = (*i).second; scm_is_pair (t); t = scm_cdr (t))
92 retval = scm_cons (scm_cons (key->self_scm(), scm_car (t)), retval);
100 Tweak_registry::mark_smob (SCM smob)
102 Tweak_registry *me = (Tweak_registry*) SCM_CELL_WORD_1(smob);
104 for (Tweak_map::const_iterator i (me->tweaks_.begin ());
105 i != me->tweaks_.end();
108 scm_gc_mark ((*i).first->self_scm());
109 scm_gc_mark ((*i).second);
113 scm_gc_mark (me->undumper_->self_scm());
119 Tweak_registry::print_smob (SCM smob, SCM port, scm_print_state*)
121 scm_puts ("#<Tweak_registry>", port);
126 Tweak_registry::undumper () const
131 IMPLEMENT_DEFAULT_EQUAL_P(Tweak_registry);
132 IMPLEMENT_SMOBS(Tweak_registry);
135 Tweak_registry * global_registry_;
138 init_global_tweak_registry()
140 global_registry_ = new Tweak_registry();
144 LY_DEFINE(ly_clear_tweak_registry, "ly:tweak-clear-registry",
146 "Clear global tweak registry"
149 global_registry_->clear ();
150 return SCM_UNSPECIFIED;
153 LY_DEFINE(ly_insert_tweak, "ly:insert-tweak",
155 (SCM grob, SCM tweak),
156 "add new tweak for grob."
159 Grob *gr = unsmob_grob (grob);
160 SCM_ASSERT_TYPE(gr, grob, SCM_ARG1, __FUNCTION__, "Grob");
161 SCM_ASSERT_TYPE(scm_list_p (tweak) == SCM_BOOL_T
162 && ly_c_procedure_p (scm_car (tweak)),
163 tweak, SCM_ARG2, __FUNCTION__, "Tweak");
165 global_registry_->insert_grob_tweak (gr, tweak);
166 return SCM_UNSPECIFIED;
170 LY_DEFINE(ly_tweak_read_keys, "ly:tweak-define-keys",
175 global_registry_->undumper ()->parse_contents (keys);
176 return SCM_UNSPECIFIED;
180 LY_DEFINE(ly_all_tweaks, "ly:all-tweaks",
185 return global_registry_->list_tweaks();
189 LY_DEFINE(ly_tweak_read_tweaks, "ly:tweak-define-tweaks",
194 for (SCM s = tweaks; scm_is_pair (s); s = scm_cdr (s))
196 global_registry_->insert_tweak_from_file (scm_car (s));
198 return SCM_UNSPECIFIED;