summaryrefslogtreecommitdiff
path: root/atspi/atspi-accessible.c
diff options
context:
space:
mode:
authorMike Gorse <mgorse@novell.com>2011-05-26 17:27:28 -0500
committerMike Gorse <mgorse@novell.com>2011-05-26 17:27:28 -0500
commitee59329278ddd73b7371e278b6e4f1f306ba2da6 (patch)
treea7448d6dc0b62b562621d3339cd8b8dcbe3fefb9 /atspi/atspi-accessible.c
parent73b811b78954dfb0f8b407354c146d9fbd47dea3 (diff)
downloadat-spi2-core-ee59329278ddd73b7371e278b6e4f1f306ba2da6.tar.gz
Allow caching of attributes
Attributes can now be cached, but not enabling by default, since there is currently no event to notify AT-SPI that attributes have changed (see BGO#649771), so this is dangerous but may improve performance if we can reliably assume that attributes will not change.
Diffstat (limited to 'atspi/atspi-accessible.c')
-rw-r--r--atspi/atspi-accessible.c40
1 files changed, 35 insertions, 5 deletions
diff --git a/atspi/atspi-accessible.c b/atspi/atspi-accessible.c
index bcd37de3..9461ece2 100644
--- a/atspi/atspi-accessible.c
+++ b/atspi/atspi-accessible.c
@@ -157,10 +157,12 @@ atspi_accessible_finalize (GObject *object)
g_free (accessible->description);
g_free (accessible->name);
+ if (accessible->attributes)
+ g_hash_table_unref (accessible->attributes);
#ifdef DEBUG_REF_COUNTS
accessible_count--;
- printf("at-spi: finalize: %d objects\n", accessible_count);
+ g_print ("at-spi: finalize: %d objects\n", accessible_count);
#endif
G_OBJECT_CLASS (atspi_accessible_parent_class)
@@ -573,8 +575,25 @@ atspi_accessible_get_attributes (AtspiAccessible *obj, GError **error)
g_return_val_if_fail (obj != NULL, NULL);
- message = _atspi_dbus_call_partial (obj, atspi_interface_accessible, "GetAttributes", error, "");
- return _atspi_dbus_return_hash_from_message (message);
+ if (!_atspi_accessible_test_cache (obj, ATSPI_CACHE_ATTRIBUTES))
+ {
+ message = _atspi_dbus_call_partial (obj, atspi_interface_accessible,
+ "GetAttributes", error, "");
+ obj->attributes = _atspi_dbus_return_hash_from_message (message);
+ _atspi_accessible_add_cache (obj, ATSPI_CACHE_ATTRIBUTES);
+ }
+
+ if (!obj->attributes)
+ return NULL;
+ return g_hash_table_ref (obj->attributes);
+}
+
+static void
+add_to_attribute_array (gpointer key, gpointer value, gpointer data)
+{
+ GArray **array = (GArray **)data;
+ gchar *str = g_strconcat (key, ":", value, NULL);
+ *array = g_array_append_val (*array, str);
}
/**
@@ -596,6 +615,17 @@ atspi_accessible_get_attributes_as_array (AtspiAccessible *obj, GError **error)
g_return_val_if_fail (obj != NULL, NULL);
+ if (_atspi_accessible_get_cache_mask (obj) & ATSPI_CACHE_ATTRIBUTES)
+ {
+ GArray *array = g_array_new (TRUE, TRUE, sizeof (gchar *));
+ GHashTable *attributes = atspi_accessible_get_attributes (obj, error);
+ if (!attributes)
+ return NULL;
+ g_hash_table_foreach (attributes, add_to_attribute_array, &array);
+ g_hash_table_unref (attributes);
+ return array;
+ }
+
message = _atspi_dbus_call_partial (obj, atspi_interface_accessible, "GetAttributes", error, "");
return _atspi_dbus_return_attribute_array_from_message (message);
}
@@ -1324,7 +1354,7 @@ atspi_accessible_clear_cache (AtspiAccessible *accessible)
}
}
-static AtspiCache
+AtspiCache
_atspi_accessible_get_cache_mask (AtspiAccessible *accessible)
{
AtspiCache mask;
@@ -1343,7 +1373,7 @@ _atspi_accessible_get_cache_mask (AtspiAccessible *accessible)
}
if (mask == ATSPI_CACHE_UNDEFINED)
- mask = ATSPI_CACHE_ALL;
+ mask = ATSPI_CACHE_DEFAULT;
return mask;
}