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 ();
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);
}
/*
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