+/*
+ Ugh. This is slightly expensive. We could/should cache the value of
+ the group count?
+*/
+bool
+Engraver_group::pending_grobs () const
+{
+ if (!announce_infos_.empty ())
+ return true;
+ for (SCM s = context_->children_contexts ();
+ scm_is_pair (s); s = scm_cdr (s))
+ {
+ Context *c = unsmob<Context> (scm_car (s));
+ Engraver_group *group
+ = dynamic_cast<Engraver_group *> (c->implementation ());
+
+ if (group && group->pending_grobs ())
+ return true;
+ }
+ return false;
+}
+
+void
+Engraver_group::do_announces ()
+{
+ do
+ {
+ /*
+ DOCME: why is this inside the loop?
+ */
+ for (SCM s = context ()->children_contexts ();
+ scm_is_pair (s); s = scm_cdr (s))
+ {
+ Context *c = unsmob<Context> (scm_car (s));
+ Engraver_group *group
+ = dynamic_cast<Engraver_group *> (c->implementation ());
+ if (group)
+ group->do_announces ();
+ }
+
+ while (1)
+ {
+ precomputed_translator_foreach (PROCESS_ACKNOWLEDGED);
+ if (announce_infos_.size () == 0)
+ break;