[gtk+/wip/cssnode3: 31/102] cssnode: Refactor invalidation propagation



commit 2feb1e20398e90d4bc7776fb2e93bc313d92ddd2
Author: Benjamin Otte <otte redhat com>
Date:   Sun Feb 8 12:15:27 2015 +0100

    cssnode: Refactor invalidation propagation
    
    We want to be sure to gtk_css_node_invalidate() all potential changes.

 gtk/gtkcontainer.c      |    1 -
 gtk/gtkcssnode.c        |   29 ++++++++++++++++++++++++-----
 gtk/gtkcssnodeprivate.h |    1 -
 gtk/gtkwindow.c         |    1 -
 4 files changed, 24 insertions(+), 8 deletions(-)
---
diff --git a/gtk/gtkcontainer.c b/gtk/gtkcontainer.c
index 186f89d..6dc69b8 100644
--- a/gtk/gtkcontainer.c
+++ b/gtk/gtkcontainer.c
@@ -1855,7 +1855,6 @@ gtk_container_idle_sizer (GdkFrameClock *clock,
       container->priv->restyle_pending = FALSE;
       gtk_css_node_validate (gtk_style_context_get_root (gtk_widget_get_style_context (GTK_WIDGET 
(container))),
                              current_time,
-                             0,
                              empty);
 
       _gtk_bitmask_free (empty);
diff --git a/gtk/gtkcssnode.c b/gtk/gtkcssnode.c
index 9d7c0cb..36a108f 100644
--- a/gtk/gtkcssnode.c
+++ b/gtk/gtkcssnode.c
@@ -628,12 +628,31 @@ gtk_css_node_invalidate (GtkCssNode   *cssnode,
   gtk_css_node_set_invalid (cssnode, TRUE);
 }
 
+static void
+gtk_css_node_propagate_pending_changes (GtkCssNode *cssnode)
+{
+  GtkCssChange change;
+  GtkCssNode *child;
+
+  if (!cssnode->invalid)
+    return;
+
+  change = _gtk_css_change_for_child (cssnode->pending_changes);
+
+  for (child = gtk_css_node_get_first_child (cssnode);
+       child;
+       child = gtk_css_node_get_next_sibling (child))
+    {
+      gtk_css_node_invalidate (child, change);
+    }
+}
+
 void
 gtk_css_node_validate (GtkCssNode            *cssnode,
                        gint64                 timestamp,
-                       GtkCssChange           change,
                        const GtkBitmask      *parent_changes)
 {
+  GtkCssChange change;
   GtkCssNode *child;
   GtkBitmask *changes;
 
@@ -655,20 +674,20 @@ gtk_css_node_validate (GtkCssNode            *cssnode,
   if (!cssnode->invalid && change == 0 && _gtk_bitmask_is_empty (parent_changes))
     return;
 
+  gtk_css_node_propagate_pending_changes (cssnode);
+
   gtk_css_node_set_invalid (cssnode, FALSE);
 
-  change |= cssnode->pending_changes;
+  change = cssnode->pending_changes;
   cssnode->pending_changes = 0;
 
   changes = GTK_CSS_NODE_GET_CLASS (cssnode)->validate (cssnode, timestamp, change, parent_changes);
 
-  change = _gtk_css_change_for_child (change);
-
   for (child = gtk_css_node_get_first_child (cssnode);
        child;
        child = gtk_css_node_get_next_sibling (child))
     {
-      gtk_css_node_validate (child, timestamp, change, changes);
+      gtk_css_node_validate (child, timestamp, changes);
     }
 
   _gtk_bitmask_free (changes);
diff --git a/gtk/gtkcssnodeprivate.h b/gtk/gtkcssnodeprivate.h
index e0f60e5..25e4cfa 100644
--- a/gtk/gtkcssnodeprivate.h
+++ b/gtk/gtkcssnodeprivate.h
@@ -126,7 +126,6 @@ void                    gtk_css_node_invalidate         (GtkCssNode            *
                                                          GtkCssChange           change);
 void                    gtk_css_node_validate           (GtkCssNode            *cssnode,
                                                          gint64                 timestamp,
-                                                         GtkCssChange           change,
                                                          const GtkBitmask      *parent_changes);
 void                    gtk_css_node_set_invalid        (GtkCssNode            *node,
                                                          gboolean               invalid);
diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c
index 7ad77e1..9dfc7c6 100644
--- a/gtk/gtkwindow.c
+++ b/gtk/gtkwindow.c
@@ -5844,7 +5844,6 @@ gtk_window_show (GtkWidget *widget)
   empty = _gtk_bitmask_new ();
   gtk_css_node_validate (gtk_style_context_get_root (gtk_widget_get_style_context (widget)),
                          g_get_monotonic_time (),
-                         0,
                          empty);
   _gtk_bitmask_free (empty);
 


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