+
+static gboolean
+spi_atk_bridge_document_event_listener (GSignalInvocationHint *signal_hint,
+ guint n_param_values,
+ const GValue *param_values,
+ gpointer data)
+{
+ GObject *gobject;
+ GSignalQuery signal_query;
+ CORBA_any any;
+ const gchar *name, *s;
+#ifdef SPI_BRIDGE_DEBUG
+ const gchar *s2;
+#endif
+
+ g_signal_query (signal_hint->signal_id, &signal_query);
+
+ name = signal_query.signal_name;
+
+#ifdef SPI_BRIDGE_DEBUG
+ s2 = g_type_name (G_OBJECT_TYPE (g_value_get_object (param_values + 0)));
+ s = atk_object_get_name (ATK_OBJECT (g_value_get_object (param_values + 0)));
+ fprintf (stderr, "Received signal %s:%s from object %s (gail %s)\n",
+ g_type_name (signal_query.itype), name, s ? s : "<NULL>" , s2);
+#endif
+
+ gobject = g_value_get_object (param_values + 0);
+
+ s = atk_object_get_name (ATK_OBJECT (gobject));
+ spi_atk_bridge_init_string (&any, ATK_OBJECT (gobject), (gchar **) &s);
+
+ spi_atk_emit_eventv (gobject, 0, 0, &any,
+ "document:%s", name);
+ return TRUE;
+}
+
+static void
+spi_atk_tidy_windows (void)
+{
+ AtkObject *root;
+ gint n_children;
+ gint i;
+
+ root = atk_get_root ();
+ n_children = atk_object_get_n_accessible_children (root);
+ for (i = 0; i < n_children; i++)
+ {
+ AtkObject *child;
+ AtkStateSet *stateset;
+ CORBA_any any;
+ const gchar *name;
+
+ child = atk_object_ref_accessible_child (root, i);
+ stateset = atk_object_ref_state_set (child);
+
+ name = atk_object_get_name (child);
+ if (atk_state_set_contains_state (stateset, ATK_STATE_ACTIVE))
+ {
+ spi_atk_bridge_init_string (&any, child, (gchar**) &name);
+ spi_atk_emit_eventv (G_OBJECT (child), 0, 0, &any, "window:deactivate");
+ if (registry_died)
+ return;
+ }
+ g_object_unref (stateset);
+
+ spi_atk_bridge_init_string (&any, child, (gchar**) &name);
+ spi_atk_emit_eventv (G_OBJECT (child), 0, 0, &any, "window:destroy");
+ g_object_unref (child);
+ }
+}
+
+static void
+reinit_register_vars (void)
+{
+ registry = CORBA_OBJECT_NIL;
+ device_event_controller = CORBA_OBJECT_NIL;
+ this_app = NULL;
+}
+
+static void
+spi_atk_bridge_init_base (CORBA_any *any, AtkObject *obj,
+ Accessibility_Application *app, Accessibility_Role *role,
+ CORBA_string *name)
+{
+ const gchar *s = atk_object_get_name (obj);
+ *app = spi_accessible_new_return (atk_get_root (), FALSE, NULL);
+ *role = spi_role_from_atk_role (atk_object_get_role (obj));
+ *name = s ? s : ""; /* string gets dup-ed in util.c spi_init_any_* */
+}
+
+static void
+spi_atk_bridge_init_nil (CORBA_any *any, AtkObject *obj)
+{
+ Accessibility_Application app = CORBA_OBJECT_NIL;
+ Accessibility_Role role = Accessibility_ROLE_UNKNOWN;
+ CORBA_string name;
+ spi_atk_bridge_init_base (any, obj, &app, &role, &name);
+ spi_init_any_nil (any, app, role, name);
+}
+
+static void
+spi_atk_bridge_init_object (CORBA_any *any, AtkObject *obj, CORBA_Object *c_obj)
+{
+ Accessibility_Application app = CORBA_OBJECT_NIL;
+ Accessibility_Role role = Accessibility_ROLE_UNKNOWN;
+ CORBA_string name;
+ spi_atk_bridge_init_base (any, obj, &app, &role, &name);
+ spi_init_any_object (any, app, role, name, c_obj);
+}
+
+static void
+spi_atk_bridge_init_string (CORBA_any *any, AtkObject *obj, gchar **string)
+{
+ Accessibility_Application app = CORBA_OBJECT_NIL;
+ Accessibility_Role role = Accessibility_ROLE_UNKNOWN;
+ CORBA_string name;
+ spi_atk_bridge_init_base (any, obj, &app, &role, &name);
+ spi_init_any_string (any, app, role, name, string);
+}
+
+static void
+spi_atk_bridge_init_rect (CORBA_any *any, AtkObject *obj, AtkRectangle *rect)
+{
+ Accessibility_Application app = CORBA_OBJECT_NIL;
+ Accessibility_Role role = Accessibility_ROLE_UNKNOWN;
+ CORBA_string name;
+ spi_atk_bridge_init_base (any, obj, &app, &role, &name);
+ spi_init_any_rect (any, app, role, name, rect);
+}
+