[gtk+/wip/cssstyle: 27/27] stylecontext: Fix cache updating



commit e0a26eeef041e0e8a89d1824362206de29194555
Author: Benjamin Otte <otte redhat com>
Date:   Tue Dec 23 08:19:39 2014 +0100

    stylecontext: Fix cache updating
    
    After the parent changes in commit
    3a337156d11a86c7a88f1f30a09276fdf6f63008 we need to refresh the cached
    styles after the current style. After all, they now depend on the base
    style.

 gtk/gtkstylecontext.c |   69 +++++++++++++++++++++++++++----------------------
 1 files changed, 38 insertions(+), 31 deletions(-)
---
diff --git a/gtk/gtkstylecontext.c b/gtk/gtkstylecontext.c
index 9cb683f..40914f5 100644
--- a/gtk/gtkstylecontext.c
+++ b/gtk/gtkstylecontext.c
@@ -2668,33 +2668,6 @@ gtk_style_context_clear_cache (GtkStyleContext *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
 gtk_style_context_do_invalidate (GtkStyleContext  *context,
                                  const GtkBitmask *changes)
 {
@@ -2734,6 +2707,41 @@ gtk_style_context_style_needs_full_revalidate (GtkCssStyle  *style,
     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
 gtk_style_context_should_create_transitions (GtkStyleContext *context)
 {
@@ -2808,8 +2816,6 @@ _gtk_style_context_validate (GtkStyleContext  *context,
     {
       GtkCssStyle *values;
 
-      gtk_style_context_clear_cache (context);
-
       style_info_set_values (info, NULL);
       values = style_values_lookup (context);
 
@@ -2827,8 +2833,6 @@ _gtk_style_context_validate (GtkStyleContext  *context,
     }
   else
     {
-      gtk_style_context_update_cache (context, parent_changes);
-
       if (!_gtk_bitmask_is_empty (parent_changes))
         {
           GtkCssStyle *new_values;
@@ -2883,6 +2887,9 @@ _gtk_style_context_validate (GtkStyleContext  *context,
     gtk_style_context_do_invalidate (context, changes);
 
   change = _gtk_css_change_for_child (change);
+  
+  gtk_style_context_update_cache (context, change, changes);
+
   for (list = priv->children; list; list = list->next)
     {
       _gtk_style_context_validate (list->data, timestamp, change, changes);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]