From 84d294ee7f795dfed34828194b39e68e6f186d56 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Tue, 3 Jan 2012 04:36:11 +0100 Subject: [PATCH] stylecontext: NMake safe to call into during lookup When resolving a lookup, we may want to query the current style context, as in the next patch. This works now. --- gtk/gtkcsslookup.c | 19 ++++++-------- gtk/gtkcsslookupprivate.h | 5 ++-- gtk/gtkstylecontext.c | 53 ++++++++++++++++++--------------------- 3 files changed, 36 insertions(+), 41 deletions(-) diff --git a/gtk/gtkcsslookup.c b/gtk/gtkcsslookup.c index ff833cb0fb..ef075d37d6 100644 --- a/gtk/gtkcsslookup.c +++ b/gtk/gtkcsslookup.c @@ -107,29 +107,28 @@ _gtk_css_lookup_set (GtkCssLookup *lookup, * _gtk_css_lookup_resolve: * @lookup: the lookup * @context: the context the values are resolved for + * @props: a new #GtkStyleProperties to be filled with the new properties * * Resolves the current lookup into a styleproperties object. This is done * by converting from the "winning declaration" to the "computed value". * * XXX: This bypasses the notion of "specified value". If this ever becomes * an issue, go fix it. - * - * Returns: a new #GtkStyleProperties **/ -GtkStyleProperties * -_gtk_css_lookup_resolve (GtkCssLookup *lookup, - GtkStyleContext *context) +void +_gtk_css_lookup_resolve (GtkCssLookup *lookup, + GtkStyleContext *context, + GtkStyleProperties *props) { - GtkStyleProperties *props; GtkStyleContext *parent; guint i, n; - g_return_val_if_fail (lookup != NULL, NULL); - g_return_val_if_fail (GTK_IS_STYLE_CONTEXT (context), NULL); + g_return_if_fail (lookup != NULL); + g_return_if_fail (GTK_IS_STYLE_CONTEXT (context)); + g_return_if_fail (GTK_IS_STYLE_PROPERTIES (props)); parent = gtk_style_context_get_parent (context); n = _gtk_css_style_property_get_n_properties (); - props = gtk_style_properties_new (); for (i = 0; i < n; i++) { @@ -219,6 +218,4 @@ _gtk_css_lookup_resolve (GtkCssLookup *lookup, &value); g_value_unset (&value); } - - return props; } diff --git a/gtk/gtkcsslookupprivate.h b/gtk/gtkcsslookupprivate.h index 79e5578686..90cf0cf6df 100644 --- a/gtk/gtkcsslookupprivate.h +++ b/gtk/gtkcsslookupprivate.h @@ -41,8 +41,9 @@ void _gtk_css_lookup_set (GtkCssLookup guint id, GtkCssSection *section, const GValue *value); -GtkStyleProperties * _gtk_css_lookup_resolve (GtkCssLookup *lookup, - GtkStyleContext *context); +void _gtk_css_lookup_resolve (GtkCssLookup *lookup, + GtkStyleContext *context, + GtkStyleProperties *props); G_END_DECLS diff --git a/gtk/gtkstylecontext.c b/gtk/gtkstylecontext.c index be0fb8a666..b53f82c1b4 100644 --- a/gtk/gtkstylecontext.c +++ b/gtk/gtkstylecontext.c @@ -987,10 +987,11 @@ build_properties (GtkStyleContext *context, } } - style_data->store = _gtk_css_lookup_resolve (lookup, context); + style_data->store = gtk_style_properties_new (); _gtk_style_properties_set_color_lookup_func (style_data->store, gtk_style_context_color_lookup_func, context); + _gtk_css_lookup_resolve (lookup, context, style_data->store); _gtk_css_lookup_free (lookup); } @@ -1091,44 +1092,40 @@ style_data_lookup (GtkStyleContext *context, gtk_style_context_set_state (context, state); } - data = g_hash_table_lookup (priv->style_data, priv->info_stack->data); + priv->current_data = g_hash_table_lookup (priv->style_data, priv->info_stack->data); + priv->current_state = state; - if (!data) + if (!priv->current_data) { GtkWidgetPath *path; - data = style_data_new (); - path = create_query_path (context); - - build_properties (context, data, path, state); - build_icon_factories (context, data, path); - + priv->current_data = style_data_new (); g_hash_table_insert (priv->style_data, style_info_copy (priv->info_stack->data), - data); + priv->current_data); + + path = create_query_path (context); + + build_properties (context, priv->current_data, path, state); + build_icon_factories (context, priv->current_data, path); gtk_widget_path_free (path); } + data = priv->current_data; + + if (priv->theming_engine) + g_object_unref (priv->theming_engine); + + gtk_style_properties_get (priv->current_data->store, 0, + "engine", &priv->theming_engine, + NULL); + + if (!priv->theming_engine) + priv->theming_engine = g_object_ref (gtk_theming_engine_load (NULL)); + if (G_UNLIKELY (state_mismatch)) - { - gtk_style_context_restore (context); - } - else - { - if (priv->theming_engine) - g_object_unref (priv->theming_engine); - - gtk_style_properties_get (data->store, 0, - "engine", &priv->theming_engine, - NULL); - - if (!priv->theming_engine) - priv->theming_engine = g_object_ref (gtk_theming_engine_load (NULL)); - } - - priv->current_data = data; - priv->current_state = state; + gtk_style_context_restore (context); return data; }