#define DBG(a,b) if(_dbg>=(a))b
+#define bridge_threads_leave() \
+ if (!during_init_shutdown) atk_misc_threads_leave(misc)
+#define bridge_threads_enter() \
+ if (!during_init_shutdown) atk_misc_threads_enter(misc)
+
int _dbg = 0;
static CORBA_Environment ev;
static Accessibility_Registry registry = CORBA_OBJECT_NIL;
static gboolean atk_listeners_registered = FALSE;
static gint toplevels = 0;
static gboolean exiting = FALSE;
+static AtkMisc *misc = NULL;
+static gboolean during_init_shutdown = TRUE;
static guint atk_signal_text_changed;
static guint atk_signal_children_changed;
done = TRUE;
}
+static gboolean
+post_init (void)
+{
+ during_init_shutdown = FALSE;
+ return FALSE;
+}
+
static int
atk_bridge_init (gint *argc, gchar **argv[])
{
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 ();
{
atk_bridge_initialized = FALSE;
}
+ g_idle_add (post_init, NULL);
+
return 0;
}
static void
spi_atk_bridge_register_application (Accessibility_Registry registry)
{
+ bridge_threads_leave ();
Accessibility_Registry_registerApplication (spi_atk_bridge_get_registry (),
BONOBO_OBJREF (this_app),
&ev);
+ bridge_threads_enter ();
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 ();
+ bridge_threads_leave ();
Accessibility_Registry_deregisterApplication (registry, BONOBO_OBJREF (app), &ev);
+ bridge_threads_enter ();
device_event_controller = bonobo_object_release_unref (device_event_controller, &ev);
registry = bonobo_object_release_unref (registry, &ev);
_exit (0);
}
+ during_init_shutdown = TRUE;
exiting = TRUE;
/*
* Check whether we still have windows which have not been deleted.
{
return;
}
+ during_init_shutdown = TRUE;
atk_bridge_initialized = FALSE;
this_app = NULL;
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 {
+ bridge_threads_leave ();
Accessibility_Registry_notifyEvent (spi_atk_bridge_get_registry (),
&e, &ev);
+ bridge_threads_enter ();
+ }
if (BONOBO_EX (&ev))
registry_died = TRUE;
registry = spi_atk_bridge_get_registry ();
if (!registry_died)
{
-
+ bridge_threads_leave ();
Accessibility_Registry_notifyEvent (registry,
&e, &ev);
+ bridge_threads_enter ();
#ifdef SPI_BRIDGE_DEBUG
if (ev._major != CORBA_NO_EXCEPTION)
g_message ("error emitting event %s, (%d) %s",