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