#endif
accessible->priv = atspi_accessible_get_instance_private (accessible);
+
+ accessible->children = g_ptr_array_new_with_free_func (g_object_unref);
}
static void
AtspiAccessible *accessible = ATSPI_ACCESSIBLE (object);
AtspiEvent e;
AtspiAccessible *parent;
- GList *children;
- GList *l;
+ gint i;
/* TODO: Only fire if object not already marked defunct */
memset (&e, 0, sizeof (e));
e.detail2 = 0;
_atspi_send_event (&e);
- if (accessible->states)
- {
- g_object_unref (accessible->states);
- accessible->states = NULL;
- }
+ g_clear_object (&accessible->states);
parent = accessible->accessible_parent;
- if (parent && parent->children)
- {
- GList*ls = g_list_find (parent->children, accessible);
- if(ls)
- {
- gboolean replace = (ls == parent->children);
- ls = g_list_remove (ls, accessible);
- if (replace)
- parent->children = ls;
- g_object_unref (object);
- }
- }
-
if (parent)
{
- g_object_unref (parent);
accessible->accessible_parent = NULL;
+ if (parent->children)
+ g_ptr_array_remove (parent->children, accessible);
+ g_object_unref (parent);
}
- children = accessible->children;
- accessible->children = NULL;
- for (l = children; l; l = l->next)
+ if (accessible->children) for (i = accessible->children->len - 1; i >= 0; i--)
{
- AtspiAccessible *child = l->data;
+ AtspiAccessible *child = g_ptr_array_index (accessible->children, i);
if (child && child->accessible_parent == accessible)
{
- g_object_unref (accessible);
child->accessible_parent = NULL;
+ g_object_unref (accessible);
}
- g_object_unref (child);
}
- g_list_free (children);
+
+ if (accessible->children)
+ {
+ g_ptr_array_free (accessible->children, TRUE);
+ accessible->children = NULL;
+ }
G_OBJECT_CLASS (atspi_accessible_parent_class) ->dispose (object);
}
{
AtspiAccessible *accessible = ATSPI_ACCESSIBLE (object);
- g_free (accessible->description);
- g_free (accessible->name);
+ g_free (accessible->description);
+ g_free (accessible->name);
+
if (accessible->attributes)
g_hash_table_unref (accessible->attributes);
+ if (accessible->priv->cache)
+ g_hash_table_destroy (accessible->priv->cache);
+
#ifdef DEBUG_REF_COUNTS
accessible_count--;
g_hash_table_remove (_atspi_get_live_refs (), accessible);
g_print ("at-spi: finalize: %d objects\n", accessible_count);
#endif
- G_OBJECT_CLASS (atspi_accessible_parent_class)
- ->finalize (object);
+ G_OBJECT_CLASS (atspi_accessible_parent_class)->finalize (object);
}
static void
{
g_return_val_if_fail (obj != NULL, NULL);
- if (obj->parent.app &&
- !_atspi_accessible_test_cache (obj, ATSPI_CACHE_PARENT))
+ if (!_atspi_accessible_test_cache (obj, ATSPI_CACHE_PARENT))
{
DBusMessage *message, *reply;
DBusMessageIter iter, iter_variant;
+ if (!obj->parent.app)
+ return NULL;
message = dbus_message_new_method_call (obj->parent.app->bus_name,
obj->parent.path,
DBUS_INTERFACE_PROPERTIES, "Get");
return ret;
}
- return g_list_length (obj->children);
+ if (!obj->children)
+ return 0; /* assume it's disposed */
+
+ return obj->children->len;
}
/**
GError **error)
{
AtspiAccessible *child;
+ DBusMessage *reply;
g_return_val_if_fail (obj != NULL, NULL);
- if (!_atspi_accessible_test_cache (obj, ATSPI_CACHE_CHILDREN))
+ if (_atspi_accessible_test_cache (obj, ATSPI_CACHE_CHILDREN))
{
- DBusMessage *reply;
- reply = _atspi_dbus_call_partial (obj, atspi_interface_accessible,
- "GetChildAtIndex", error, "i",
- child_index);
- return _atspi_dbus_return_accessible_from_message (reply);
+ if (!obj->children)
+ return NULL; /* assume disposed */
+
+ child = g_ptr_array_index (obj->children, child_index);
+ if (child)
+ return g_object_ref (child);
}
- child = g_list_nth_data (obj->children, child_index);
+ reply = _atspi_dbus_call_partial (obj, atspi_interface_accessible,
+ "GetChildAtIndex", error, "i", child_index);
+ child = _atspi_dbus_return_accessible_from_message (reply);
+
if (!child)
return NULL;
- return g_object_ref (child);
+
+ if (_atspi_accessible_test_cache (obj, ATSPI_CACHE_CHILDREN))
+ {
+ if (child_index >= obj->children->len)
+ g_ptr_array_set_size (obj->children, child_index + 1);
+ g_ptr_array_index (obj->children, child_index) = g_object_ref (child);
+ }
+ return child;
}
/**
gint
atspi_accessible_get_index_in_parent (AtspiAccessible *obj, GError **error)
{
- GList *l;
gint i = 0;
+ dbus_int32_t ret = -1;
g_return_val_if_fail (obj != NULL, -1);
- if (_atspi_accessible_test_cache (obj, ATSPI_CACHE_PARENT) &&
- !obj->accessible_parent)
- return -1;
- if (!obj->accessible_parent ||
- !_atspi_accessible_test_cache (obj->accessible_parent,
- ATSPI_CACHE_CHILDREN))
+ if (_atspi_accessible_test_cache (obj, ATSPI_CACHE_PARENT))
{
- dbus_int32_t ret = -1;
- _atspi_dbus_call (obj, atspi_interface_accessible,
- "GetIndexInParent", NULL, "=>i", &ret);
- return ret;
- }
+ if (!obj->accessible_parent)
+ return -1;
- l = obj->accessible_parent->children;
- while (l)
- {
- if (l->data == obj) return i;
- l = g_list_next (l);
- i++;
+ if (!_atspi_accessible_test_cache (obj->accessible_parent, ATSPI_CACHE_CHILDREN) || !obj->accessible_parent->children)
+ goto dbus;
+
+ for (i = 0; i < obj->accessible_parent->children->len; i++)
+ if (g_ptr_array_index (obj->accessible_parent->children, i) == obj)
+ return i;
}
- return -1;
+
+dbus:
+ _atspi_dbus_call (obj, atspi_interface_accessible,
+ "GetIndexInParent", NULL, "=>i", &ret);
+ return ret;
}
typedef struct
* Gets the set of #AtspiRelation objects which describes this #AtspiAccessible object's
* relationships with other #AtspiAccessible objects.
*
- * Returns: (element-type AtspiAccessible*) (transfer full): a #GArray of
+ * Returns: (element-type AtspiRelation*) (transfer full): a #GArray of
* #AtspiRelation pointers or NULL on exception.
**/
GArray *
}
/**
- * atspi_accessible_get_action:
+ * atspi_accessible_get_action: (rename-to atspi_accessible_get_action_iface)
* @obj: a pointer to the #AtspiAccessible instance to query.
*
* Gets the #AtspiAction interface for an #AtspiAccessible.
* instance, or NULL if @obj does not implement #AtspiAction.
*
* Deprecated: 2.10: Use atspi_accessible_get_action_iface instead.
- * Rename to: atspi_accessible_get_action_iface
**/
AtspiAction *
atspi_accessible_get_action (AtspiAccessible *accessible)
}
/**
- * atspi_accessible_get_collection:
+ * atspi_accessible_get_collection: (rename-to atspi_accessible_get_collection_iface)
* @obj: a pointer to the #AtspiAccessible instance to query.
*
* Gets the #AtspiCollection interface for an #AtspiAccessible.
* instance, or NULL if @obj does not implement #AtspiCollection.
*
* Deprecated: 2.10: Use atspi_accessible_get_collection_iface instead.
- * Rename to: atspi_accessible_get_collection_iface
**/
AtspiCollection *
atspi_accessible_get_collection (AtspiAccessible *accessible)
}
/**
- * atspi_accessible_get_component:
+ * atspi_accessible_get_component: (rename-to atspi_accessible_get_component_iface)
* @obj: a pointer to the #AtspiAccessible instance to query.
*
* Gets the #AtspiComponent interface for an #AtspiAccessible.
* instance, or NULL if @obj does not implement #AtspiComponent.
*
* Deprecated: 2.10: Use atspi_accessible_get_component_iface instead.
- * Rename to: atspi_accessible_get_component_iface
**/
AtspiComponent *
atspi_accessible_get_component (AtspiAccessible *obj)
}
/**
- * atspi_accessible_get_document:
+ * atspi_accessible_get_document: (rename-to atspi_accessible_get_document_iface)
* @obj: a pointer to the #AtspiAccessible instance to query.
*
* Gets the #AtspiDocument interface for an #AtspiAccessible.
* instance, or NULL if @obj does not implement #AtspiDocument.
*
* Deprecated: 2.10: Use atspi_accessible_get_document_iface instead.
- * Rename to: atspi_accessible_get_document_iface
**/
AtspiDocument *
atspi_accessible_get_document (AtspiAccessible *accessible)
}
/**
- * atspi_accessible_get_editable_text:
+ * atspi_accessible_get_editable_text: (rename-to atspi_accessible_get_editable_text_iface)
* @obj: a pointer to the #AtspiAccessible instance to query.
*
* Gets the #AtspiEditableText interface for an #AtspiAccessible.
* instance, or NULL if @obj does not implement #AtspiEditableText.
*
* Deprecated: 2.10: Use atspi_accessible_get_editable_text_iface instead.
- * Rename to: atspi_accessible_get_editable_text_iface
**/
AtspiEditableText *
atspi_accessible_get_editable_text (AtspiAccessible *accessible)
}
/**
- * atspi_accessible_get_hypertext:
+ * atspi_accessible_get_hypertext: (rename-to atspi_accessible_get_hypertext_iface)
* @obj: a pointer to the #AtspiAccessible instance to query.
*
* Gets the #AtspiHypertext interface for an #AtspiAccessible.
* instance, or NULL if @obj does not implement #AtspiHypertext.
*
* Deprecated: 2.10: Use atspi_accessible_get_hypertext_iface instead.
- * Rename to: atspi_accessible_get_hypertext_iface
**/
AtspiHypertext *
atspi_accessible_get_hypertext (AtspiAccessible *accessible)
}
/**
- * atspi_accessible_get_image:
+ * atspi_accessible_get_image: (rename-to atspi_accessible_get_image_iface)
* @obj: a pointer to the #AtspiAccessible instance to query.
*
* Gets the #AtspiImage interface for an #AtspiAccessible.
* NULL if @obj does not implement #AtspiImage.
*
* Deprecated: 2.10: Use atspi_accessible_get_image_iface instead.
- * Rename to: atspi_accessible_get_image_iface
**/
AtspiImage *
atspi_accessible_get_image (AtspiAccessible *accessible)
}
/**
- * atspi_accessible_get_selection:
+ * atspi_accessible_get_selection: (rename-to atspi_accessible_get_selection_iface)
* @obj: a pointer to the #AtspiAccessible instance to query.
*
* Gets the #AtspiSelection interface for an #AtspiAccessible.
* instance, or NULL if @obj does not implement #AtspiSelection.
*
* Deprecated: 2.10: Use atspi_accessible_get_selection_iface instead.
- * Rename to: atspi_accessible_get_selection_iface
**/
AtspiSelection *
atspi_accessible_get_selection (AtspiAccessible *accessible)
#endif
/**
- * atspi_accessible_get_table:
+ * atspi_accessible_get_table: (rename-to atspi_accessible_get_table_iface)
* @obj: a pointer to the #AtspiAccessible instance to query.
*
* Gets the #AtspiTable interface for an #AtspiAccessible.
* NULL if @obj does not implement #AtspiTable.
*
* Deprecated: 2.10: Use atspi_accessible_get_table_iface instead.
- * Rename to: atspi_accessible_get_table_iface
**/
AtspiTable *
atspi_accessible_get_table (AtspiAccessible *obj)
}
/**
- * atspi_accessible_get_text:
+ * atspi_accessible_get_text: (rename-to atspi_accessible_get_text_iface)
* @obj: a pointer to the #AtspiAccessible instance to query.
*
* Gets the #AtspiTable interface for an #AtspiAccessible.
* NULL if @obj does not implement #AtspiText.
*
* Deprecated: 2.10: Use atspi_accessible_get_text_iface instead.
- * Rename to: atspi_accessible_get_text_iface
**/
AtspiText *
atspi_accessible_get_text (AtspiAccessible *obj)
}
/**
- * atspi_accessible_get_value:
+ * atspi_accessible_get_value: (rename-to atspi_accessible_get_value_iface)
* @obj: a pointer to the #AtspiAccessible instance to query.
*
* Gets the #AtspiTable interface for an #AtspiAccessible.
* NULL if @obj does not implement #AtspiValue.
*
* Deprecated: 2.10: Use atspi_accessible_get_value_iface instead.
- * Rename to: atspi_accessible_get_value_iface
**/
AtspiValue *
atspi_accessible_get_value (AtspiAccessible *accessible)
/**
* atspi_accessible_clear_cache:
- * @accessible: The #AtspiAccessible whose cache to clear.
+ * @obj: The #AtspiAccessible whose cache to clear.
*
* Clears the cached information for the given accessible and all of its
* descendants.
*/
void
-atspi_accessible_clear_cache (AtspiAccessible *accessible)
+atspi_accessible_clear_cache (AtspiAccessible *obj)
{
- GList *l;
+ gint i;
- if (accessible)
+ if (obj)
{
- accessible->cached_properties = ATSPI_CACHE_NONE;
- for (l = accessible->children; l; l = l->next)
- atspi_accessible_clear_cache (l->data);
+ obj->cached_properties = ATSPI_CACHE_NONE;
+ if (obj->children)
+ for (i = 0; i < obj->children->len; i++)
+ atspi_accessible_clear_cache (g_ptr_array_index (obj->children, i));
}
}