diff options
author | Benjamin Otte <otte@redhat.com> | 2012-03-29 15:40:20 +0200 |
---|---|---|
committer | Benjamin Otte <otte@redhat.com> | 2012-04-17 08:59:14 +0200 |
commit | 751187aa0c246978713b51cee0c38f423bf04681 (patch) | |
tree | 79e0a54532167229b23e4f59fd4cbb76277eb657 | |
parent | a737adadf8f3f4971e54aa81b62a411bfd35a1a2 (diff) | |
download | gtk+-751187aa0c246978713b51cee0c38f423bf04681.tar.gz |
stylecontext: Keep per-styleinfo data
Instead of having one global data structure, keep it per style info.
This means that we can do special tricks on the "global" style data.
-rw-r--r-- | gtk/gtkstylecontext.c | 45 |
1 files changed, 26 insertions, 19 deletions
diff --git a/gtk/gtkstylecontext.c b/gtk/gtkstylecontext.c index 8774d7a1ee..a0cb27cfea 100644 --- a/gtk/gtkstylecontext.c +++ b/gtk/gtkstylecontext.c @@ -336,6 +336,7 @@ struct GtkStyleInfo GArray *regions; GtkJunctionSides junction_sides; GtkStateFlags state_flags; + StyleData *data; }; struct StyleData @@ -375,7 +376,6 @@ struct _GtkStyleContextPrivate GtkWidgetPath *widget_path; GHashTable *style_data; GSList *info_stack; - StyleData *current_data; GSList *animation_regions; GSList *animations; @@ -522,6 +522,7 @@ style_info_copy (const GtkStyleInfo *info) copy->junction_sides = info->junction_sides; copy->state_flags = info->state_flags; + copy->data = info->data; return copy; } @@ -972,47 +973,46 @@ static StyleData * style_data_lookup (GtkStyleContext *context) { GtkStyleContextPrivate *priv; - StyleData *data; + GtkStyleInfo *info; GtkCssValue *v; priv = context->priv; + info = priv->info_stack->data; /* Current data in use is cached, just return it */ - if (priv->current_data) - return priv->current_data; + if (info->data) + return info->data; g_assert (priv->widget != NULL || priv->widget_path != NULL); - priv->current_data = g_hash_table_lookup (priv->style_data, priv->info_stack->data); + info->data = g_hash_table_lookup (priv->style_data, info); - if (!priv->current_data) + if (!info->data) { GtkWidgetPath *path; path = create_query_path (context); - priv->current_data = style_data_new (); + info->data = style_data_new (); g_hash_table_insert (priv->style_data, - style_info_copy (priv->info_stack->data), - priv->current_data); + style_info_copy (info), + info->data); - build_properties (context, priv->current_data, path, ((GtkStyleInfo *) priv->info_stack->data)->state_flags); + build_properties (context, info->data, path, info->state_flags); gtk_widget_path_free (path); } - data = priv->current_data; - if (priv->theming_engine) g_object_unref (priv->theming_engine); - v = _gtk_css_computed_values_get_value_by_name (priv->current_data->store, "engine"); + v = _gtk_css_computed_values_get_value_by_name (info->data->store, "engine"); if (v) priv->theming_engine = _gtk_css_value_dup_object (v); else priv->theming_engine = g_object_ref (gtk_theming_engine_load (NULL)); - return data; + return info->data; } static void @@ -1053,8 +1053,9 @@ gtk_style_context_queue_invalidate_internal (GtkStyleContext *context, GtkCssChange change) { GtkStyleContextPrivate *priv = context->priv; + GtkStyleInfo *info = priv->info_stack->data; - priv->current_data = NULL; + info->data = NULL; if (!gtk_style_context_is_saved (context)) { @@ -1736,8 +1737,6 @@ gtk_style_context_restore (GtkStyleContext *context) info = style_info_new (); priv->info_stack = g_slist_prepend (priv->info_stack, info); } - - priv->current_data = NULL; } static gboolean @@ -3283,8 +3282,16 @@ gtk_style_context_do_invalidate (GtkStyleContext *context, priv->invalidating_context = TRUE; if (clear_caches) - g_hash_table_remove_all (priv->style_data); - priv->current_data = NULL; + { + GSList *list; + + for (list = priv->info_stack; list; list = list->next) + { + GtkStyleInfo *info = list->data; + info->data = NULL; + } + g_hash_table_remove_all (priv->style_data); + } g_signal_emit (context, signals[CHANGED], 0); |