static gboolean atk_listeners_registered = FALSE;
static gint toplevels = 0;
static gboolean exiting = FALSE;
+static AtkMisc *misc = NULL;
static guint atk_signal_text_changed;
static guint atk_signal_children_changed;
atk_bridge_initialized = TRUE;
atk_bridge_pid = getpid ();
+ misc = atk_misc_get_instance();
+
if (g_getenv ("ATK_BRIDGE_REDIRECT_LOG"))
{
fname = g_strconcat ("/tmp/", g_get_prgname (), ".at-spi-log", NULL);
"children-changed::remove",
(GCallback) spi_atk_bridge_toplevel_removed,
NULL);
+ /* in this case we redefine 'success' to mean 'registry is present' */
+ success = (spi_atk_bridge_get_registry () != CORBA_OBJECT_NIL);
}
else
{
success = spi_atk_bridge_do_registration ();
}
+ /*
+ * we must emit events even if we are not registered as a
+ * full-fledged app; See bugzilla #400709.
+ */
if (success)
{
spi_atk_register_event_listeners ();
if (spi_atk_bridge_get_registry () == CORBA_OBJECT_NIL)
{
- g_error ("Could not locate registry");
+ g_warning ("Could not locate registry");
return FALSE;
}
static void
spi_atk_bridge_register_application (Accessibility_Registry registry)
{
+ atk_misc_threads_leave (misc);
Accessibility_Registry_registerApplication (spi_atk_bridge_get_registry (),
BONOBO_OBJREF (this_app),
&ev);
+ atk_misc_threads_enter (misc);
+ if (ev._major != CORBA_NO_EXCEPTION)
+ CORBA_exception_free (&ev);
}
/*
(Atom) 31, &actual_type, &actual_format,
&nitems, &leftover, &data);
if (data == NULL)
- g_critical (_("AT_SPI_REGISTRY was not started at session startup."));
+ g_warning (_("AT_SPI_REGISTRY was not started at session startup."));
return (gchar *) data;
static void
deregister_application (BonoboObject *app)
{
- Accessibility_Registry registry = spi_atk_bridge_get_registry ();
+ Accessibility_Registry registry = spi_atk_bridge_get_registry ();
+ atk_misc_threads_leave (misc);
Accessibility_Registry_deregisterApplication (registry, BONOBO_OBJREF (app), &ev);
+ atk_misc_threads_enter (misc);
device_event_controller = bonobo_object_release_unref (device_event_controller, &ev);
registry = bonobo_object_release_unref (registry, &ev);
atk_remove_key_event_listener (atk_bridge_key_event_listener_id);
deregister_application (app);
+
+ misc = NULL;
}
static void
spi_atk_bridge_init_nil (&e.any_data, object);
if (BONOBO_EX (&ev))
registry_died = TRUE;
- else
+ else {
+ atk_misc_threads_leave (misc);
Accessibility_Registry_notifyEvent (spi_atk_bridge_get_registry (),
&e, &ev);
+ atk_misc_threads_enter (misc);
+ }
if (BONOBO_EX (&ev))
registry_died = TRUE;
#endif
CORBA_exception_init (&ev);
registry = spi_atk_bridge_get_registry ();
- if (registry_died) {
- g_free (e.type);
- return;
- }
- Accessibility_Registry_notifyEvent (registry,
- &e, &ev);
+ if (!registry_died)
+ {
+ atk_misc_threads_leave (misc);
+ Accessibility_Registry_notifyEvent (registry,
+ &e, &ev);
+ atk_misc_threads_enter (misc);
#ifdef SPI_BRIDGE_DEBUG
- if (ev._major != CORBA_NO_EXCEPTION)
- g_message ("error emitting event %s, (%d) %s",
- e.type,
- ev._major,
- CORBA_exception_id(&ev));
+ if (ev._major != CORBA_NO_EXCEPTION)
+ g_message ("error emitting event %s, (%d) %s",
+ e.type,
+ ev._major,
+ CORBA_exception_id(&ev));
#endif
- if (BONOBO_EX (&ev)) registry_died = TRUE;
-
+ if (BONOBO_EX (&ev)) registry_died = TRUE;
+ }
+
if (source)
bonobo_object_unref (BONOBO_OBJECT (source));
else
g_free (e.type);
if (!any && e.any_data._release) CORBA_free (e.any_data._value);
+
+ if (any && any->_release) CORBA_free (any->_value);
va_end (args);
spi_atk_emit_eventv (gobject, 0, 0, &any,
"object:property-change:%s", prop_name);
+ if (s_ao)
+ bonobo_object_unref (BONOBO_OBJECT (s_ao));
return TRUE;
}
if (sp)
g_free (sp);
+ if (s_ao)
+ bonobo_object_unref (BONOBO_OBJECT (s_ao));
+
return TRUE;
}
stateset = atk_object_ref_state_set (child);
name = atk_object_get_name (child);
- spi_atk_bridge_init_string (&any, child, (gchar**) &name);
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);
}