]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/grob.cc
updates
[lilypond.git] / lily / grob.cc
index 382cbe2de71742d05c32b45d27aa4594402360ef..b1fd927a149202c6a63b71330879f0b3510e1739 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c)  1997--2002 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+  (c)  1997--2003 Han-Wen Nienhuys <hanwen@cs.uu.nl>
 */
 
 
@@ -240,8 +240,11 @@ Grob::get_molecule ()  const
 
   mol =  get_uncached_molecule ();
   
-  Grob *me = (Grob*)this;
-  me->set_grob_property ("molecule", mol);
+  if (live ())
+    {
+      Grob *me = (Grob*)this;
+      me->set_grob_property ("molecule", mol);
+    }
   
   return unsmob_molecule (mol);  
 }
@@ -254,7 +257,6 @@ Grob::get_uncached_molecule ()const
   SCM  mol = SCM_EOL;
   if (gh_procedure_p (proc)) 
     mol = gh_apply (proc, scm_list_n (this->self_scm (), SCM_UNDEFINED));
-
   
   Molecule *m = unsmob_molecule (mol);
   
@@ -372,6 +374,13 @@ Grob::handle_broken_dependencies ()
 void
 Grob::suicide ()
 {
+  if (!live ())
+    return; 
+
+#if 0 // see below. 
+   String nm = name();
+#endif
+  
   mutable_property_alist_ = SCM_EOL;
   immutable_property_alist_ = SCM_EOL;
 
@@ -383,6 +392,19 @@ Grob::suicide ()
       dim_cache_[a].offset_callbacks_ = SCM_EOL;
       dim_cache_[a].offsets_left_ = 0;
     }
+
+#if 0
+  /*
+    This can make debugging a little easier: we can still know what
+    the object used to be. However, since all its links have been
+    broken, it's usually more convenient to set a conditional
+    breakpoint in GDB before the property lists are wiped.
+   */
+  mutable_property_alist_ = scm_acons (ly_symbol2scm ("name"),
+                                      scm_makfrom0str (nm.to_str0()),
+                                      mutable_property_alist_
+                                      );
+#endif
 }
 
 void
@@ -678,9 +700,8 @@ void
 Grob::warning (String s)const
 {
   SCM cause = self_scm();
-  while (cause != SCM_EOL && !unsmob_music (cause))
+  while (Grob * g = unsmob_grob (cause))
     {
-      Grob * g = unsmob_grob (cause);
       cause = g->get_grob_property ("cause");
     }
 
@@ -802,40 +823,40 @@ ly_grobs2scm (Link_array<Grob> a)
 }
 
 
-IMPLEMENT_TYPE_P (Grob, "ly-grob?");
+IMPLEMENT_TYPE_P (Grob, "ly:grob?");
 
 ADD_INTERFACE (Grob, "grob-interface",
-  "In music notation, lots of symbols are related in some way.  You can
-think of music notation as a graph where nodes are formed by the
-symbols, and the arcs by their relations. A grob is a node in that
-graph.  The directed edges in the graph are formed by references to
-other grobs (i.e. pointers).  This big graph of grobs specifies the
-notation problem. The solution of this problem is a description of the
-printout in closed form, i.e. a list of values.  These values are
-Molecules.
-
-All grobs have an X and Y-position on the page.  These X and Y positions
-are stored in a relative format, so they can easily be combined by
-stacking them, hanging one grob to the side of another, and coupling
-them into a grouping-grob.
-
-Each grob has a reference point (a.k.a.  parent): the position of a grob
-is stored relative to that reference point. For example the X-reference
-point of a staccato dot usually is the note head that it applies
-to. When the note head is moved, the staccato dot moves along
-automatically.
-
-A grob is often associated with a symbol, but some grobs do not print
-any symbols. They take care of grouping objects. For example, there is a
-separate grob that stacks staves vertically. The @ref{NoteCollision}
-is also an abstract grob: it only moves around chords, but doesn't print
-anything.
-",
-  "X-offset-callbacks Y-offset-callbacks X-extent-callback molecule cause
-Y-extent-callback molecule-callback extra-offset spacing-procedure
-staff-symbol interfaces dependencies X-extent Y-extent extra-X-extent
-causes meta layer before-line-breaking-callback
-after-line-breaking-callback extra-Y-extent minimum-X-extent
-minimum-Y-extent transparent");
+  "In music notation, lots of symbols are related in some way.  You can\n"
+"think of music notation as a graph where nodes are formed by the\n"
+"symbols, and the arcs by their relations. A grob is a node in that\n"
+"graph.  The directed edges in the graph are formed by references to\n"
+"other grobs (i.e. pointers).  This big graph of grobs specifies the\n"
+"notation problem. The solution of this problem is a description of the\n"
+"printout in closed form, i.e. a list of values.  These values are\n"
+"Molecules.\n"
+"\n"
+"All grobs have an X and Y-position on the page.  These X and Y positions\n"
+"are stored in a relative format, so they can easily be combined by\n"
+"stacking them, hanging one grob to the side of another, and coupling\n"
+"them into a grouping-grob.\n"
+"\n"
+"Each grob has a reference point (a.k.a.  parent): the position of a grob\n"
+"is stored relative to that reference point. For example the X-reference\n"
+"point of a staccato dot usually is the note head that it applies\n"
+"to. When the note head is moved, the staccato dot moves along\n"
+"automatically.\n"
+"\n"
+"A grob is often associated with a symbol, but some grobs do not print\n"
+"any symbols. They take care of grouping objects. For example, there is a\n"
+"separate grob that stacks staves vertically. The @ref{NoteCollision}\n"
+"is also an abstract grob: it only moves around chords, but doesn't print\n"
+"anything.\n"
+,
+  "X-offset-callbacks Y-offset-callbacks X-extent-callback molecule cause "
+"Y-extent-callback molecule-callback extra-offset spacing-procedure "
+"staff-symbol interfaces dependencies X-extent Y-extent extra-X-extent "
+"causes meta layer before-line-breaking-callback "
+"after-line-breaking-callback extra-Y-extent minimum-X-extent "
+"minimum-Y-extent transparent");