/*
* Converts the Accessible object reference to its D-Bus object path
*/
-static gchar *
-ref_to_path (guint ref)
+gchar *
+atk_dbus_ref_to_path (guint ref)
{
return g_strdup_printf(SPI_ATK_OBJECT_REFERENCE_TEMPLATE, ref);
}
ref = object_to_ref (ATK_OBJECT(accessible));
if (ref != 0)
{
+ spi_emit_cache_removal (ref, atk_adaptor_app_data->bus);
g_hash_table_remove(ref2ptr, GINT_TO_POINTER(ref));
}
}
{
AtkObject *current;
guint i;
+ gint count = atk_object_get_n_accessible_children (accessible);
- for (i =0; i < atk_object_get_n_accessible_children (accessible); i++)
+ if (count < 0) count = 0;
+ for (i =0; i < count; i++)
{
current = atk_object_ref_accessible_child (accessible, i);
+ if (current)
+ {
#ifdef SPI_ATK_DEBUG
- non_owned_accessible (current);
+ non_owned_accessible (current);
#endif
- if (!has_manages_descendants (current))
- {
- g_queue_push_tail (traversal, current);
- }
- else
- {
- g_object_unref (G_OBJECT (current));
+ if (!has_manages_descendants (current))
+ g_queue_push_tail (traversal, current);
+ else
+ g_object_unref (G_OBJECT (current));
}
}
}
}
/*
+ * TODO WARNING HACK This function is dangerous.
+ * It should only be called before sending an event on an
+ * object that has not already been registered.
+ */
+gchar *
+atk_dbus_object_attempt_registration (AtkObject *accessible)
+{
+ guint ref;
+
+ ref = object_to_ref (accessible);
+ if (!ref)
+ {
+ /* See if the object is attached to the main tree */
+ AtkObject *current, *prev = NULL;
+ guint cref = 0;
+
+ /* This should iterate until it hits a NULL or registered parent */
+ prev = accessible;
+ current = atk_object_get_parent (accessible);
+ if (current)
+ cref = object_to_ref (current);
+ while (current && !cref)
+ {
+ prev = current;
+ current = atk_object_get_parent (current);
+ if (current)
+ cref = object_to_ref (current);
+ }
+
+ /* A registered parent, with non-registered child, has been found */
+ if (current)
+ {
+ register_subtree (prev);
+ }
+
+ /* The object SHOULD be registered now. If it isn't - I give up */
+ ref = object_to_ref (accessible);
+ if (ref)
+ {
+ return atk_dbus_ref_to_path (ref);
+ }
+ else
+ {
+#ifdef SPI_ATK_DEBUG
+ g_debug ("AT-SPI: Could not register a non-attached accessible object");
+#endif
+ return NULL;
+ }
+ }
+ else
+ {
+ return atk_dbus_ref_to_path (ref);
+ }
+}
+
+
+/*
* Used to lookup a D-Bus path from the AtkObject.
*/
gchar *
if (!ref)
return NULL;
else
- return ref_to_path (ref);
+ return atk_dbus_ref_to_path (ref);
}
gchar *
AtkObject *accessible)
{
update_accessible (accessible);
+ return TRUE;
}
static gboolean
gpointer data)
{
tree_update_wrapper (signal_hint, n_param_values, param_values, data, tree_update_state_action);
+ return TRUE;
}
static gboolean
update_accessible (accessible);
}
/* Parent value us updated by child-add signal of parent object */
+ return TRUE;
}
static gboolean
const GValue *param_values,
gpointer data)
{
- tree_update_wrapper (signal_hint, n_param_values, param_values, data, tree_update_property_action);
+ tree_update_wrapper (signal_hint, n_param_values, param_values, data, tree_update_property_action);
+ return TRUE;
}
static gboolean
const gchar *detail = NULL;
AtkObject *child;
+ if (has_manages_descendants (accessible)) return TRUE;
if (signal_hint->detail)
detail = g_quark_to_string (signal_hint->detail);
register_subtree (child);
update_accessible (accessible);
}
+ return TRUE;
}
static gboolean
gpointer data)
{
tree_update_wrapper (signal_hint, n_param_values, param_values, data, tree_update_children_action);
+ return TRUE;
}
/*---------------------------------------------------------------------------*/