#define DBG(a,b) if(_dbg>=(a))b
+#define bridge_threads_leave() \
+ if (!during_init_shutdown && !g_main_context_is_owner (NULL)) atk_misc_threads_leave(misc);
+#define bridge_threads_enter() \
+ if (!during_init_shutdown && !g_main_context_is_owner (NULL)) atk_misc_threads_enter(misc);
+
int _dbg = 0;
static CORBA_Environment ev;
static Accessibility_Registry registry = CORBA_OBJECT_NIL;
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[])
{
misc = atk_misc_get_instance();
if (g_getenv ("ATK_BRIDGE_REDIRECT_LOG"))
- {
+ {
fname = g_strconcat ("/tmp/", g_get_prgname (), ".at-spi-log", NULL);
/* make sure we're not being redirected - security issue */
if (!g_file_test (fname, G_FILE_TEST_IS_SYMLINK))
freopen (fname, "w", stderr);
g_free (fname);
- }
+ }
if (debug_env_string)
_dbg = (int) g_ascii_strtod (debug_env_string, 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)
{
- atk_misc_threads_leave (misc);
+ bridge_threads_leave ();
Accessibility_Registry_registerApplication (spi_atk_bridge_get_registry (),
BONOBO_OBJREF (this_app),
&ev);
- atk_misc_threads_enter (misc);
+ bridge_threads_enter ();
if (ev._major != CORBA_NO_EXCEPTION)
CORBA_exception_free (&ev);
}
{
static const char *canonical_display_name = NULL;
if (!canonical_display_name)
- {
+ {
const gchar *display_env = g_getenv ("AT_SPI_DISPLAY");
if (!display_env)
- {
+ {
display_env = g_getenv ("DISPLAY");
if (!display_env || !display_env[0])
canonical_display_name = ":0";
else
- {
+ {
gchar *display_p, *screen_p;
canonical_display_name = g_strdup (display_env);
display_p = strrchr (canonical_display_name, ':');
screen_p = strrchr (canonical_display_name, '.');
if (screen_p && display_p && (screen_p > display_p))
- {
+ {
*screen_p = '\0';
- }
- }
- }
+ }
+ }
+ }
else
- {
+ {
canonical_display_name = display_env;
- }
- }
+ }
+ }
return canonical_display_name;
}
CORBA_Environment ev;
char *ior = NULL;
- if (registry_died || (registry == CORBA_OBJECT_NIL)) {
- CORBA_exception_init (&ev);
- if (registry_died)
- {
- if (exiting)
- return CORBA_OBJECT_NIL;
- else
- DBG (1, g_warning ("registry died! restarting..."));
- }
+ if (registry_died || (registry == CORBA_OBJECT_NIL))
+ {
+ CORBA_exception_init (&ev);
+ if (registry_died)
+ {
+ if (exiting)
+ return CORBA_OBJECT_NIL;
+ else
+ DBG (1, g_warning ("registry died! restarting..."));
+ }
- /* XXX: This presumes that the registry has successfully restarted itself already...*/
- ior = (char *) spi_atk_bridge_get_registry_ior ();
+ /* XXX: This presumes that the registry has successfully restarted itself already...*/
+ ior = (char *) spi_atk_bridge_get_registry_ior ();
- if (ior != NULL)
- registry = CORBA_ORB_string_to_object (bonobo_activation_orb_get (),
- ior, &ev);
- else {
- g_warning ("IOR not set.");
- registry = CORBA_OBJECT_NIL;
- }
+ if (ior != NULL)
+ {
+ registry = CORBA_ORB_string_to_object (bonobo_activation_orb_get (),
+ ior, &ev);
+ XFree (ior);
+ }
+ else
+ {
+ g_warning ("IOR not set.");
+ registry = CORBA_OBJECT_NIL;
+ }
- if (ev._major != CORBA_NO_EXCEPTION)
- {
- g_error ("Accessibility app error: exception during "
- "registry activation from id: %s\n",
- CORBA_exception_id (&ev));
- CORBA_exception_free (&ev);
- }
+ if (ev._major != CORBA_NO_EXCEPTION)
+ {
+ g_error ("Accessibility app error: exception during "
+ "registry activation from id: %s\n",
+ CORBA_exception_id (&ev));
+ CORBA_exception_free (&ev);
+ }
- if (registry_died && registry) {
- registry_died = FALSE;
- spi_atk_bridge_register_application (registry);
- }
- }
+ if (registry_died && registry)
+ {
+ registry_died = FALSE;
+ spi_atk_bridge_register_application (registry);
+ }
+ }
return registry;
}
AtkObject *bo = atk_no_op_object_new (ao);
- if (atk_listeners_registered) return;
+ if (atk_listeners_registered)
+ {
+ g_object_unref (G_OBJECT (bo));
+ g_object_unref (ao);
+ return;
+ }
atk_listeners_registered = TRUE;
deregister_application (BonoboObject *app)
{
Accessibility_Registry registry = spi_atk_bridge_get_registry ();
- atk_misc_threads_leave (misc);
+ bridge_threads_leave ();
Accessibility_Registry_deregisterApplication (registry, BONOBO_OBJREF (app), &ev);
- atk_misc_threads_enter (misc);
+ 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_focus_tracker (atk_bridge_focus_tracker_id);
for (i = 0; ids && i < ids->len; i++)
- {
+ {
atk_remove_global_event_listener (g_array_index (ids, guint, i));
- }
+ }
if (atk_bridge_key_event_listener_id)
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 {
- atk_misc_threads_leave (misc);
+ else
+ {
+ bridge_threads_leave ();
Accessibility_Registry_notifyEvent (spi_atk_bridge_get_registry (),
&e, &ev);
- atk_misc_threads_enter (misc);
- }
+ bridge_threads_enter ();
+ }
if (BONOBO_EX (&ev))
registry_died = TRUE;
bonobo_object_unref (source);
-
+
+ if (e.any_data._release)
+ CORBA_free (e.any_data._value);
+
CORBA_exception_free (&ev);
}
CORBA_exception_init (&ev);
registry = spi_atk_bridge_get_registry ();
if (!registry_died)
- {
- atk_misc_threads_leave (misc);
+ {
+ bridge_threads_leave ();
Accessibility_Registry_notifyEvent (registry,
&e, &ev);
- atk_misc_threads_enter (misc);
+ bridge_threads_enter ();
#ifdef SPI_BRIDGE_DEBUG
if (ev._major != CORBA_NO_EXCEPTION)
g_message ("error emitting event %s, (%d) %s",
CORBA_exception_id(&ev));
#endif
if (BONOBO_EX (&ev)) registry_died = TRUE;
- }
+ }
if (source)
bonobo_object_unref (BONOBO_OBJECT (source));
spi_init_keystroke_from_atk_key_event (&key_event, event);
+ bridge_threads_leave ();
result = Accessibility_DeviceEventController_notifyListenersSync (
spi_atk_bridget_get_dec (), &key_event, &ev);
+ bridge_threads_enter ();
if (key_event.event_string) CORBA_free (key_event.event_string);
- if (BONOBO_EX(&ev)) {
+ if (BONOBO_EX(&ev))
+ {
result = FALSE;
CORBA_exception_free (&ev);
- }
+ }
return result;
}