stylecontext: Fix cache updating

After the parent changes in commit
3a337156d1 we need to refresh the cached
styles after the current style. After all, they now depend on the base
style.
This commit is contained in:
Benjamin Otte 2014-12-23 08:19:39 +01:00
parent 730f429168
commit 89b5d15415

View File

@ -2675,33 +2675,6 @@ gtk_style_context_clear_cache (GtkStyleContext *context)
gtk_style_context_clear_property_cache (context); gtk_style_context_clear_property_cache (context);
} }
static void
gtk_style_context_update_cache (GtkStyleContext *context,
const GtkBitmask *parent_changes)
{
GtkStyleContextPrivate *priv;
GHashTableIter iter;
gpointer key, value;
if (_gtk_bitmask_is_empty (parent_changes))
return;
priv = context->priv;
g_hash_table_iter_init (&iter, priv->style_values);
while (g_hash_table_iter_next (&iter, &key, &value))
{
const GtkCssNodeDeclaration *decl = key;
GtkCssStyle *values = value;
values = update_properties (context, values, decl, parent_changes);
g_hash_table_iter_replace (&iter, values);
}
gtk_style_context_clear_property_cache (context);
}
static void static void
gtk_style_context_do_invalidate (GtkStyleContext *context, gtk_style_context_do_invalidate (GtkStyleContext *context,
const GtkBitmask *changes) const GtkBitmask *changes)
@ -2742,6 +2715,41 @@ gtk_style_context_style_needs_full_revalidate (GtkCssStyle *style,
return FALSE; return FALSE;
} }
static void
gtk_style_context_update_cache (GtkStyleContext *context,
GtkCssChange change,
const GtkBitmask *parent_changes)
{
GtkStyleContextPrivate *priv;
GHashTableIter iter;
gpointer key, value;
if (_gtk_bitmask_is_empty (parent_changes))
return;
priv = context->priv;
g_hash_table_iter_init (&iter, priv->style_values);
while (g_hash_table_iter_next (&iter, &key, &value))
{
const GtkCssNodeDeclaration *decl = key;
GtkCssStyle *style = value;
if (gtk_style_context_style_needs_full_revalidate (style, change))
{
g_hash_table_iter_remove (&iter);
}
else
{
style = update_properties (context, style, decl, parent_changes);
g_hash_table_iter_replace (&iter, style);
}
}
gtk_style_context_clear_property_cache (context);
}
static gboolean static gboolean
gtk_style_context_should_create_transitions (GtkStyleContext *context) gtk_style_context_should_create_transitions (GtkStyleContext *context)
{ {
@ -2816,8 +2824,6 @@ _gtk_style_context_validate (GtkStyleContext *context,
{ {
GtkCssStyle *values; GtkCssStyle *values;
gtk_style_context_clear_cache (context);
style_info_set_values (info, NULL); style_info_set_values (info, NULL);
values = style_values_lookup (context); values = style_values_lookup (context);
@ -2835,8 +2841,6 @@ _gtk_style_context_validate (GtkStyleContext *context,
} }
else else
{ {
gtk_style_context_update_cache (context, parent_changes);
if (!_gtk_bitmask_is_empty (parent_changes)) if (!_gtk_bitmask_is_empty (parent_changes))
{ {
GtkCssStyle *new_values; GtkCssStyle *new_values;
@ -2891,6 +2895,9 @@ _gtk_style_context_validate (GtkStyleContext *context,
gtk_style_context_do_invalidate (context, changes); gtk_style_context_do_invalidate (context, changes);
change = _gtk_css_change_for_child (change); change = _gtk_css_change_for_child (change);
gtk_style_context_update_cache (context, change, changes);
for (list = priv->children; list; list = list->next) for (list = priv->children; list; list = list->next)
{ {
_gtk_style_context_validate (list->data, timestamp, change, changes); _gtk_style_context_validate (list->data, timestamp, change, changes);