[gtk+] stylecontext: Move property cache
- From: Benjamin Otte <otte src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] stylecontext: Move property cache
- Date: Tue, 10 Jun 2014 23:41:44 +0000 (UTC)
commit 57c4f01e0d847393de702ee63d82f28a46ae8863
Author: Benjamin Otte <otte redhat com>
Date: Wed Jun 11 00:30:30 2014 +0200
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 files changed, 24 insertions(+), 27 deletions(-)
---
diff --git a/gtk/gtkstylecontext.c b/gtk/gtkstylecontext.c
index 2f9b348..882dac1 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
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]