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:
@ -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;
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user