From 62c6679f1deeb3abebd40583416189582de03d2e Mon Sep 17 00:00:00 2001
From: Joe Neeman <joeneeman@gmail.com>
Date: Tue, 6 Feb 2007 22:33:09 +0200
Subject: [PATCH] Prevent TupletBracket and TupletNumber from triggering
 cross-staff callbacks. Fixes (partially) #279

---
 lily/include/tuplet-bracket.hh |  1 +
 lily/tuplet-bracket.cc         | 18 ++++++++++++++++++
 lily/tuplet-number.cc          |  8 ++++++++
 scm/define-grobs.scm           |  2 ++
 4 files changed, 29 insertions(+)

diff --git a/lily/include/tuplet-bracket.hh b/lily/include/tuplet-bracket.hh
index 2097e98d58..6108244cf6 100644
--- a/lily/include/tuplet-bracket.hh
+++ b/lily/include/tuplet-bracket.hh
@@ -19,6 +19,7 @@ public:
   DECLARE_SCHEME_CALLBACK (calc_control_points, (SCM));
   DECLARE_SCHEME_CALLBACK (print, (SCM));
   DECLARE_SCHEME_CALLBACK (calc_connect_to_neighbors, (SCM smob));
+  DECLARE_SCHEME_CALLBACK (cross_staff, (SCM));
   
   DECLARE_GROB_INTERFACE();
   static Grob* get_common_x (Spanner *);
diff --git a/lily/tuplet-bracket.cc b/lily/tuplet-bracket.cc
index 489d3bc76e..baa42b727c 100644
--- a/lily/tuplet-bracket.cc
+++ b/lily/tuplet-bracket.cc
@@ -737,6 +737,24 @@ Tuplet_bracket::add_tuplet_bracket (Grob *me, Grob *bracket)
   Pointer_group_interface::add_grob (me, ly_symbol2scm ("tuplets"), bracket);
 }
 
+MAKE_SCHEME_CALLBACK (Tuplet_bracket, cross_staff, 1);
+SCM
+Tuplet_bracket::cross_staff (SCM smob)
+{
+  Grob *me = unsmob_grob (smob);
+  Grob *staff_symbol = 0;
+  extract_grob_set (me, "note-columns", cols);
+  for (vsize i = 0; i < cols.size (); i++)
+    {
+      Grob *stem = unsmob_grob (cols[i]->get_object ("stem"));
+      Grob *stem_staff = Staff_symbol_referencer::get_staff_symbol (stem);
+      if (staff_symbol && (stem_staff != staff_symbol))
+        return SCM_BOOL_T;
+      staff_symbol = stem_staff;
+    }
+  return SCM_BOOL_F;
+}
+
 ADD_INTERFACE (Tuplet_bracket,
 	       "A bracket with a number in the middle, used for tuplets. "
 	       "When the bracket spans  a line break, the value of "
diff --git a/lily/tuplet-number.cc b/lily/tuplet-number.cc
index 54032803e9..b888a5dd97 100644
--- a/lily/tuplet-number.cc
+++ b/lily/tuplet-number.cc
@@ -17,6 +17,7 @@
 struct Tuplet_number
 {
   DECLARE_SCHEME_CALLBACK (print, (SCM));
+  DECLARE_SCHEME_CALLBACK (cross_staff, (SCM));
   DECLARE_GROB_INTERFACE ();
 };
   
@@ -66,6 +67,13 @@ Tuplet_number::print (SCM smob)
   return stc_scm;
 }
 
+MAKE_SCHEME_CALLBACK (Tuplet_number, cross_staff, 1)
+SCM
+Tuplet_number::cross_staff (SCM smob)
+{
+  Grob *me = unsmob_grob (smob);
+  return Tuplet_bracket::cross_staff (me->get_object ("bracket"));
+}
 
 ADD_INTERFACE (Tuplet_number,
 	       "The number for a bracket. "
diff --git a/scm/define-grobs.scm b/scm/define-grobs.scm
index 6cfc4ed188..00394458fa 100644
--- a/scm/define-grobs.scm
+++ b/scm/define-grobs.scm
@@ -1990,6 +1990,7 @@
 	(connect-to-neighbor . ,ly:tuplet-bracket::calc-connect-to-neighbors)
 	(control-points . ,ly:tuplet-bracket::calc-control-points)
 	(stencil . ,ly:tuplet-bracket::print)
+	(cross-staff . ,ly:tuplet-bracket::cross-staff)
 	
 	(meta . ((class . Spanner)
 		 (interfaces . (line-interface
@@ -2002,6 +2003,7 @@
 	(font-shape . italic)
 	(font-size . -2)
 	(avoid-slur . inside)
+	(cross-staff . ,ly:tuplet-number::cross-staff)
 	(meta . ((class . Spanner)
 		 (interfaces . (text-interface tuplet-number-interface
 				font-interface))))))
-- 
2.39.5