+ * Children changed signal converter and forwarder.
+ *
+ * Klass (Interface) org.a11y.atspi.Event.Object
+ * Major is the signal name.
+ * Minor is 'add' or 'remove'
+ * detail1 is the index.
+ * detail2 is 0.
+ * any_data is the child reference.
+ */
+static gboolean
+children_changed_event_listener (GSignalInvocationHint * signal_hint,
+ guint n_param_values,
+ const GValue * param_values, gpointer data)
+{
+ GSignalQuery signal_query;
+ const gchar *name, *minor;
+ gint detail1 = 0, detail2 = 0;
+
+ AtkObject *accessible, *ao=NULL;
+ gpointer child;
+
+ g_signal_query (signal_hint->signal_id, &signal_query);
+ name = signal_query.signal_name;
+
+ accessible = ATK_OBJECT (g_value_get_object (¶m_values[0]));
+ minor = g_quark_to_string (signal_hint->detail);
+
+ detail1 = g_value_get_uint (param_values + 1);
+ child = g_value_get_pointer (param_values + 2);
+
+ if (ATK_IS_OBJECT (child))
+ {
+ ao = ATK_OBJECT (child);
+ emit_event (accessible, ITF_EVENT_OBJECT, name, minor, detail1, detail2,
+ "(so)", ao, append_object);
+ }
+ else if ((minor != NULL) && (strcmp (minor, "add") == 0))
+ {
+ ao = atk_object_ref_accessible_child (accessible,
+ detail1);
+ emit_event (accessible, ITF_EVENT_OBJECT, name, minor, detail1, detail2,
+ "(so)", ao, append_object);
+ }
+ else
+ {
+ emit_event (accessible, ITF_EVENT_OBJECT, name, minor, detail1, detail2,
+ "(so)", ao, append_object);
+ }
+
+ return TRUE;
+}
+
+/*---------------------------------------------------------------------------*/
+
+static void
+toplevel_added_event_listener (AtkObject * accessible,
+ guint index, AtkObject * child)
+{
+ emit_event (accessible, ITF_EVENT_OBJECT, "children-changed", "add", index, 0,
+ "(so)", child, append_object);
+}
+
+static void
+toplevel_removed_event_listener (AtkObject * accessible,
+ guint index, AtkObject * child)
+{
+ emit_event (accessible, ITF_EVENT_OBJECT, "children-changed", "remove", index, 0,
+ "(so)", child, append_object);
+}
+
+/*---------------------------------------------------------------------------*/
+
+/*