cssnode: Only queue_validate() when node is visible
authorBenjamin Otte <otte@redhat.com>
Fri, 10 Jul 2015 19:34:41 +0000 (21:34 +0200)
committerBenjamin Otte <otte@redhat.com>
Fri, 10 Jul 2015 19:44:32 +0000 (21:44 +0200)
This avoids running animations in hidden toplevels.

gtk/gtkcssnode.c

index 7bae9d5ba2de5dd8834c73f5f880d2c102ac9fed..0b88b916ddc2b2aee28cbe604fc74f12394b4e97 100644 (file)
@@ -67,17 +67,20 @@ gtk_css_node_set_invalid (GtkCssNode *node,
 
   node->invalid = invalid;
 
-  if (node->parent)
-    {
-      if (invalid && node->visible)
-        gtk_css_node_set_invalid (node->parent, TRUE);
-    }
-  else
+  if (node->visible)
     {
-      if (invalid)
-        GTK_CSS_NODE_GET_CLASS (node)->queue_validate (node);
+      if (node->parent)
+        {
+          if (invalid)
+            gtk_css_node_set_invalid (node->parent, TRUE);
+        }
       else
-        GTK_CSS_NODE_GET_CLASS (node)->dequeue_validate (node);
+        {
+          if (invalid)
+            GTK_CSS_NODE_GET_CLASS (node)->queue_validate (node);
+          else
+            GTK_CSS_NODE_GET_CLASS (node)->dequeue_validate (node);
+        }
     }
 }
 
@@ -896,6 +899,22 @@ gtk_css_node_set_visible (GtkCssNode *cssnode,
   cssnode->visible = visible;
   g_object_notify_by_pspec (G_OBJECT (cssnode), cssnode_properties[PROP_VISIBLE]);
 
+  if (cssnode->invalid)
+    {
+      if (cssnode->visible)
+        {
+          if (cssnode->parent)
+            gtk_css_node_set_invalid (cssnode->parent, TRUE);
+          else
+            GTK_CSS_NODE_GET_CLASS (cssnode)->queue_validate (cssnode);
+        }
+      else
+        {
+          if (cssnode->parent == NULL)
+            GTK_CSS_NODE_GET_CLASS (cssnode)->dequeue_validate (cssnode);
+        }
+    }
+
   if (cssnode->next_sibling)
     gtk_css_node_invalidate (cssnode->next_sibling, GTK_CSS_CHANGE_ANY_SIBLING
                                                     | GTK_CSS_CHANGE_NTH_CHILD