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