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.
This commit is contained in:
Benjamin Otte 2012-01-03 04:36:11 +01:00
parent 6dfab12e1b
commit 84d294ee7f
3 changed files with 36 additions and 41 deletions

View File

@ -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;
}

View File

@ -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

View File

@ -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;
}