]> git.donarmstrong.com Git - lilypond.git/blob - lily/tweak-registration.cc
Merge branch 'jneeman' of git+ssh://jneem@git.sv.gnu.org/srv/git/lilypond into jneeman
[lilypond.git] / lily / tweak-registration.cc
1 /*
2   tweak-registration.cc -- implement Tweak_registry
3
4   source file of the GNU LilyPond music typesetter
5
6   (c) 2004--2006 Han-Wen Nienhuys <hanwen@xs4all.nl>
7 */
8
9 #include "tweak-registration.hh"
10
11 #include "object-key-undumper.hh"
12 #include "grob.hh"
13
14 #include "ly-smobs.icc"
15
16 Tweak_registry::Tweak_registry ()
17 {
18   undumper_ = 0;
19   smobify_self ();
20   undumper_ = new Object_key_undumper ();
21   undumper_->unprotect ();
22 }
23
24 Tweak_registry::~Tweak_registry ()
25 {
26 }
27
28 void
29 Tweak_registry::clear ()
30 {
31   tweaks_.clear ();
32   undumper_ = new Object_key_undumper ();
33   undumper_->unprotect ();
34 }
35
36 void
37 Tweak_registry::insert_tweak_from_file (SCM tweak)
38 {
39   SCM skey = scm_car (tweak);
40
41   assert (scm_is_pair (skey)
42           && scm_car (skey) == ly_symbol2scm ("key"));
43
44   Object_key const *key = undumper_->get_key (scm_to_int (scm_cadr (skey)));
45
46   SCM existing = SCM_EOL;
47   Tweak_map::const_iterator prev = tweaks_.find (key);
48   if (prev != tweaks_.end ())
49     existing = (*prev).second;
50
51   tweaks_[key] = scm_cons (scm_cdr (tweak), existing);
52 }
53
54 void
55 Tweak_registry::insert_grob_tweak (Grob *g, SCM tweak)
56 {
57   Object_key const *key = g->key ();
58   if (tweaks_.find (key) == tweaks_.end ())
59     tweaks_[key] = SCM_EOL;
60
61   tweaks_[key] = scm_cons (tweak, tweaks_[key]);
62 }
63
64 void
65 Tweak_registry::replace_grob_tweak (Grob *g, SCM tweak)
66 {
67   Object_key const *key = g->key ();
68   tweaks_[key] = scm_cons (tweak, SCM_EOL);
69 }
70
71 SCM
72 Tweak_registry::get_tweaks (Grob *g)
73 {
74   Object_key const *key = g->key ();
75   if (tweaks_.find (key) == tweaks_.end ())
76     return SCM_EOL;
77   return tweaks_[key];
78 }
79
80 SCM
81 Tweak_registry::list_tweaks ()
82 {
83   SCM retval = SCM_EOL;
84   for (Tweak_map::const_iterator i (tweaks_.begin ());
85        i != tweaks_.end ();
86        i++)
87     {
88       Object_key const *key = (*i).first;
89       for (SCM t = (*i).second; scm_is_pair (t); t = scm_cdr (t))
90         retval = scm_cons (scm_cons (key->self_scm (), scm_car (t)), retval);
91     }
92
93   return retval;
94 }
95
96 SCM
97 Tweak_registry::mark_smob (SCM smob)
98 {
99   Tweak_registry *me = (Tweak_registry *) SCM_CELL_WORD_1 (smob);
100
101   for (Tweak_map::const_iterator i (me->tweaks_.begin ());
102        i != me->tweaks_.end ();
103        i++)
104     {
105       scm_gc_mark ((*i).first->self_scm ());
106       scm_gc_mark ((*i).second);
107     }
108
109   if (me->undumper_)
110     scm_gc_mark (me->undumper_->self_scm ());
111
112   return SCM_EOL;
113 }
114
115 int
116 Tweak_registry::print_smob (SCM smob, SCM port, scm_print_state*)
117 {
118   (void) smob;                  // smother warning.
119   scm_puts ("#<Tweak_registry>", port);
120   return 1;
121 }
122
123 Object_key_undumper *
124 Tweak_registry::undumper () const
125 {
126   return undumper_;
127 }
128
129 IMPLEMENT_DEFAULT_EQUAL_P (Tweak_registry);
130 IMPLEMENT_SMOBS (Tweak_registry);
131
132 Tweak_registry *global_registry_;
133
134 void
135 init_global_tweak_registry ()
136 {
137   global_registry_ = new Tweak_registry ();
138 }