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: * _gtk_css_lookup_resolve:
* @lookup: the lookup * @lookup: the lookup
* @context: the context the values are resolved for * @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 * Resolves the current lookup into a styleproperties object. This is done
* by converting from the "winning declaration" to the "computed value". * by converting from the "winning declaration" to the "computed value".
* *
* XXX: This bypasses the notion of "specified value". If this ever becomes * XXX: This bypasses the notion of "specified value". If this ever becomes
* an issue, go fix it. * an issue, go fix it.
*
* Returns: a new #GtkStyleProperties
**/ **/
GtkStyleProperties * void
_gtk_css_lookup_resolve (GtkCssLookup *lookup, _gtk_css_lookup_resolve (GtkCssLookup *lookup,
GtkStyleContext *context) GtkStyleContext *context,
GtkStyleProperties *props)
{ {
GtkStyleProperties *props;
GtkStyleContext *parent; GtkStyleContext *parent;
guint i, n; guint i, n;
g_return_val_if_fail (lookup != NULL, NULL); g_return_if_fail (lookup != NULL);
g_return_val_if_fail (GTK_IS_STYLE_CONTEXT (context), 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); parent = gtk_style_context_get_parent (context);
n = _gtk_css_style_property_get_n_properties (); n = _gtk_css_style_property_get_n_properties ();
props = gtk_style_properties_new ();
for (i = 0; i < n; i++) for (i = 0; i < n; i++)
{ {
@ -219,6 +218,4 @@ _gtk_css_lookup_resolve (GtkCssLookup *lookup,
&value); &value);
g_value_unset (&value); g_value_unset (&value);
} }
return props;
} }

View File

@ -41,8 +41,9 @@ void _gtk_css_lookup_set (GtkCssLookup
guint id, guint id,
GtkCssSection *section, GtkCssSection *section,
const GValue *value); const GValue *value);
GtkStyleProperties * _gtk_css_lookup_resolve (GtkCssLookup *lookup, void _gtk_css_lookup_resolve (GtkCssLookup *lookup,
GtkStyleContext *context); GtkStyleContext *context,
GtkStyleProperties *props);
G_END_DECLS 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_properties_set_color_lookup_func (style_data->store,
gtk_style_context_color_lookup_func, gtk_style_context_color_lookup_func,
context); context);
_gtk_css_lookup_resolve (lookup, context, style_data->store);
_gtk_css_lookup_free (lookup); _gtk_css_lookup_free (lookup);
} }
@ -1091,44 +1092,40 @@ style_data_lookup (GtkStyleContext *context,
gtk_style_context_set_state (context, state); 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; GtkWidgetPath *path;
data = style_data_new (); priv->current_data = style_data_new ();
path = create_query_path (context);
build_properties (context, data, path, state);
build_icon_factories (context, data, path);
g_hash_table_insert (priv->style_data, g_hash_table_insert (priv->style_data,
style_info_copy (priv->info_stack->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); gtk_widget_path_free (path);
} }
if (G_UNLIKELY (state_mismatch)) data = priv->current_data;
{
gtk_style_context_restore (context);
}
else
{
if (priv->theming_engine) if (priv->theming_engine)
g_object_unref (priv->theming_engine); g_object_unref (priv->theming_engine);
gtk_style_properties_get (data->store, 0, gtk_style_properties_get (priv->current_data->store, 0,
"engine", &priv->theming_engine, "engine", &priv->theming_engine,
NULL); NULL);
if (!priv->theming_engine) if (!priv->theming_engine)
priv->theming_engine = g_object_ref (gtk_theming_engine_load (NULL)); priv->theming_engine = g_object_ref (gtk_theming_engine_load (NULL));
}
priv->current_data = data; if (G_UNLIKELY (state_mismatch))
priv->current_state = state; gtk_style_context_restore (context);
return data; return data;
} }