+ do {
+ for (SCM s = context ()->children_contexts ();
+ scm_is_pair (s); s = scm_cdr (s))
+ {
+ Context *c = unsmob_context (scm_car (s));
+ Engraver_group_engraver * group
+ = dynamic_cast<Engraver_group_engraver*> (c->implementation ());
+ if (group)
+ group->do_announces ();
+ }
+
+ do
+ {
+ engraver_each (get_simple_trans_list (),
+ &Engraver::process_acknowledged_grobs);
+
+
+ if (announce_infos_.size () == 0)
+ break;
+
+ acknowledge_grobs ();
+ announce_infos_.clear ();
+ }
+ while (1);
+
+ } while (pending_grob_count () > 0);
+}
+
+
+
+void
+Engraver_group_engraver::initialize ()
+{
+ SCM tab = scm_make_vector (scm_int2num (61), SCM_BOOL_F);
+ context ()->set_property ("acknowledgeHashTable", tab);
+
+ Translator_group::initialize ();
+}
+
+Engraver_group_engraver::Engraver_group_engraver () {}
+
+ENTER_DESCRIPTION (Engraver_group_engraver,
+/* descr */ "A group of engravers taken together",
+/* creats*/ "",
+/* accepts */ "",
+/* acks */ "",
+/* reads */ "",
+/* write */ "");
+
+
+
+/*****************/
+
+
+bool
+engraver_valid (Translator*tr, SCM ifaces)
+{
+ SCM ack_ifs = scm_assoc (ly_symbol2scm ("interfaces-acked"), tr->translator_description ());
+ ack_ifs = scm_cdr (ack_ifs);
+ for (SCM s = ifaces; scm_is_pair (s); s = scm_cdr (s))
+ if (scm_c_memq (scm_car (s), ack_ifs) != SCM_BOOL_F)
+ return true;
+ return false;
+}
+
+
+
+SCM
+find_acknowledge_engravers (SCM gravlist, SCM meta_alist)
+{
+ SCM ifaces = scm_cdr (scm_assoc (ly_symbol2scm ("interfaces"), meta_alist));
+
+ SCM l = SCM_EOL;
+ for (SCM s = gravlist; scm_is_pair (s); s = scm_cdr (s))