]> git.donarmstrong.com Git - lilypond.git/blob - lily/stream-event.cc
ff736d88323809227888f6b74037107ec21827d1
[lilypond.git] / lily / stream-event.cc
1 /*
2   stream-event.cc -- implement Stream_event
3
4   source file of the GNU LilyPond music typesetter
5
6   (c) 2005-2006 Erik Sandberg  <mandolaerik@gmail.com>
7 */
8
9 #include "stream-event.hh"
10
11 #include "ly-smobs.icc"
12 #include "context.hh"
13 #include "input.hh"
14 #include "input.hh"
15
16 /* TODO: Rename Stream_event -> Event */
17
18 Stream_event::Stream_event ()
19   : Prob (ly_symbol2scm ("Stream_event"), SCM_EOL)
20 {
21 }
22
23 Stream_event::Stream_event (SCM event_class, SCM mutable_props)
24   : Prob (ly_symbol2scm ("Stream_event"),
25           scm_list_1 (scm_cons (ly_symbol2scm ("class"), event_class)))
26 {
27   mutable_property_alist_ = mutable_props;
28 }
29
30 Stream_event::Stream_event (SCM class_name, Input *origin)
31   : Prob (ly_symbol2scm ("Stream_event"),
32           scm_list_1 (scm_cons (ly_symbol2scm ("class"), class_name)))
33 {
34   if (origin)
35     set_spot (origin);
36 }
37
38 Stream_event::Stream_event (Stream_event *ev)
39   : Prob (ly_symbol2scm ("Stream_event"), SCM_EOL)
40 {
41   mutable_property_alist_ = scm_copy_tree (ev->mutable_property_alist_);
42   immutable_property_alist_ = ev->immutable_property_alist_;
43 }
44
45 Input *
46 Stream_event::origin () const
47 {
48   Input *i = unsmob_input (get_property ("origin"));
49   return i ? i : &dummy_input_global;
50 }
51
52 void
53 Stream_event::set_spot (Input *i)
54 {
55   set_property ("origin", make_input (*i));
56 }
57
58 bool
59 Stream_event::internal_in_event_class (SCM class_name)
60 {
61   SCM cl = get_property ("class");
62   cl = scm_call_1 (ly_lily_module_constant ("ly:make-event-class"), cl);
63   return scm_c_memq (class_name, cl) != SCM_BOOL_F;
64 }
65
66 IMPLEMENT_TYPE_P (Stream_event, "ly:stream-event?");
67
68 MAKE_SCHEME_CALLBACK (Stream_event, undump, 1);
69 MAKE_SCHEME_CALLBACK (Stream_event, dump, 1);
70
71 SCM
72 Stream_event::dump (SCM self)
73 {
74   Stream_event *ev = unsmob_stream_event (self);
75   // Reversed alists look prettier.
76   return scm_cons (scm_reverse (ev->immutable_property_alist_),
77                    scm_reverse (ev->mutable_property_alist_));
78 }
79
80 SCM
81 Stream_event::undump (SCM data)
82 {
83   Stream_event *obj = new Stream_event ();
84   obj->immutable_property_alist_ = scm_reverse (scm_car (data));
85   obj->mutable_property_alist_ = scm_reverse (scm_cdr (data));
86   return obj->unprotect ();
87 }
88
89 Stream_event *
90 unsmob_stream_event (SCM m)
91 {
92   return dynamic_cast<Stream_event*> (unsmob_prob (m));
93 }