diff options
author | Mike Gorse <mgorse@novell.com> | 2011-05-26 17:27:28 -0500 |
---|---|---|
committer | Mike Gorse <mgorse@novell.com> | 2011-05-26 17:27:28 -0500 |
commit | ee59329278ddd73b7371e278b6e4f1f306ba2da6 (patch) | |
tree | a7448d6dc0b62b562621d3339cd8b8dcbe3fefb9 /atspi/atspi-accessible.c | |
parent | 73b811b78954dfb0f8b407354c146d9fbd47dea3 (diff) | |
download | at-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.c | 40 |
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; } |