From 57c4f01e0d847393de702ee63d82f28a46ae8863 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Wed, 11 Jun 2014 00:30:30 +0200 Subject: [PATCH] stylecontext: Move property cache ... from per style data to only existing once per style context. This is technically an API break because it no longer allows getting different style properties between save()/restore() pairs, but I don't think this was ever intended to work that way, as the style property API was to be used and is used via gtk_widget_get_style(). And it simplifies code a lot. --- gtk/gtkstylecontext.c | 51 ++++++++++++++++++++----------------------- 1 file changed, 24 insertions(+), 27 deletions(-) diff --git a/gtk/gtkstylecontext.c b/gtk/gtkstylecontext.c index 2f9b348f99..882dac189a 100644 --- a/gtk/gtkstylecontext.c +++ b/gtk/gtkstylecontext.c @@ -260,7 +260,6 @@ struct GtkStyleInfo struct StyleData { GtkCssComputedValues *store; - GArray *property_cache; guint ref_count; }; @@ -276,6 +275,7 @@ struct _GtkStyleContextPrivate GtkWidgetPath *widget_path; GHashTable *style_data; GtkStyleInfo *info; + GArray *property_cache; gint scale; guint frame_clock_update_id; @@ -403,23 +403,20 @@ style_data_new (void) } static void -clear_property_cache (StyleData *data) +gtk_style_context_clear_property_cache (GtkStyleContext *context) { + GtkStyleContextPrivate *priv = context->priv; guint i; - if (!data->property_cache) - return; - - for (i = 0; i < data->property_cache->len; i++) + for (i = 0; i < priv->property_cache->len; i++) { - PropertyValue *node = &g_array_index (data->property_cache, PropertyValue, i); + PropertyValue *node = &g_array_index (priv->property_cache, PropertyValue, i); g_param_spec_unref (node->pspec); g_value_unset (&node->value); } - g_array_free (data->property_cache, TRUE); - data->property_cache = NULL; + g_array_set_size (priv->property_cache, 0); } static StyleData * @@ -439,7 +436,6 @@ style_data_unref (StyleData *data) return; g_object_unref (data->store); - clear_property_cache (data); g_slice_free (StyleData, data); } @@ -640,6 +636,8 @@ gtk_style_context_init (GtkStyleContext *style_context) priv->info = style_info_new (); priv->info->state_flags = GTK_STATE_FLAG_DIR_LTR; + priv->property_cache = g_array_new (FALSE, FALSE, sizeof (PropertyValue)); + gtk_style_context_set_cascade (style_context, _gtk_settings_get_style_cascade (gtk_settings_get_for_screen (priv->screen))); } @@ -775,6 +773,9 @@ gtk_style_context_finalize (GObject *object) while (priv->info) priv->info = style_info_pop (priv->info); + gtk_style_context_clear_property_cache (style_context); + g_array_free (priv->property_cache, TRUE); + G_OBJECT_CLASS (gtk_style_context_parent_class)->finalize (object); } @@ -2200,35 +2201,27 @@ _gtk_style_context_peek_style_property (GtkStyleContext *context, { GtkStyleContextPrivate *priv; PropertyValue *pcache, key = { 0 }; - StyleData *data; guint i; priv = context->priv; - data = style_data_lookup (context); - key.widget_type = widget_type; key.pspec = pspec; /* need value cache array */ - if (!data->property_cache) - data->property_cache = g_array_new (FALSE, FALSE, sizeof (PropertyValue)); - else - { - pcache = bsearch (&key, - data->property_cache->data, data->property_cache->len, - sizeof (PropertyValue), style_property_values_cmp); - if (pcache) - return &pcache->value; - } + pcache = bsearch (&key, + priv->property_cache->data, priv->property_cache->len, + sizeof (PropertyValue), style_property_values_cmp); + if (pcache) + return &pcache->value; i = 0; - while (i < data->property_cache->len && - style_property_values_cmp (&key, &g_array_index (data->property_cache, PropertyValue, i)) >= 0) + while (i < priv->property_cache->len && + style_property_values_cmp (&key, &g_array_index (priv->property_cache, PropertyValue, i)) >= 0) i++; - g_array_insert_val (data->property_cache, i, key); - pcache = &g_array_index (data->property_cache, PropertyValue, i); + g_array_insert_val (priv->property_cache, i, key); + pcache = &g_array_index (priv->property_cache, PropertyValue, i); /* cache miss, initialize value type, then set contents */ g_param_spec_ref (pcache->pspec); @@ -2996,6 +2989,8 @@ gtk_style_context_clear_cache (GtkStyleContext *context) style_info_set_data (info, NULL); } g_hash_table_remove_all (priv->style_data); + + gtk_style_context_clear_property_cache (context); } static void @@ -3025,6 +3020,8 @@ gtk_style_context_update_cache (GtkStyleContext *context, _gtk_bitmask_free (changes); } + + gtk_style_context_clear_property_cache (context); } static void