]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtkcssprovider.c
stylecontext: Do invalidation on first resize container
[~andy/gtk] / gtk / gtkcssprovider.c
index 5500a7c9f732bde24cc346209231468be5feb7b2..751266847464ff2e9d495af992c5b203d60c7e8a 100644 (file)
@@ -1273,19 +1273,6 @@ gtk_css_ruleset_add (GtkCssRuleset       *ruleset,
     ruleset->styles[i].section = NULL;
 }
 
-static gboolean
-gtk_css_ruleset_matches (GtkCssRuleset       *ruleset,
-                         const GtkCssMatcher *matcher)
-{
-  return _gtk_css_selector_matches (ruleset->selector, matcher);
-}
-
-static GtkCssChange
-gtk_css_ruleset_get_change (GtkCssRuleset *ruleset)
-{
-  return _gtk_css_selector_get_change (ruleset->selector);
-}
-
 static void
 gtk_css_scanner_destroy (GtkCssScanner *scanner)
 {
@@ -1419,6 +1406,7 @@ verify_tree_match_results (GtkCssProvider *provider,
 #ifdef VERIFY_TREE
   GtkCssProviderPrivate *priv = provider->priv;
   GtkCssRuleset *ruleset;
+  gboolean should_match;
   int i, j;
 
   for (i = 0; i < priv->rulesets->len; i++)
@@ -1435,18 +1423,61 @@ verify_tree_match_results (GtkCssProvider *provider,
              break;
            }
        }
-
-      if (found != !!gtk_css_ruleset_matches (ruleset, matcher))
+      should_match = _gtk_css_selector_matches (ruleset->selector, matcher);
+      if (found != !!should_match)
        {
          g_error ("expected rule '%s' to %s, but it %s\n",
                   _gtk_css_selector_to_string (ruleset->selector),
-                  gtk_css_ruleset_matches (ruleset, matcher) ? "match" : "not match",
+                  should_match ? "match" : "not match",
                   found ? "matched" : "didn't match");
        }
     }
 #endif
 }
 
+static void
+verify_tree_get_change_results (GtkCssProvider *provider,
+                               const GtkCssMatcher *matcher,
+                               GtkCssChange change)
+{
+#ifdef VERIFY_TREE
+  {
+    GtkCssChange verify_change = 0;
+    GPtrArray *tree_rules;
+    int i;
+
+    tree_rules = _gtk_css_selector_tree_match_all (provider->priv->tree, matcher);
+    verify_tree_match_results (provider, matcher, tree_rules);
+
+    for (i = tree_rules->len - 1; i >= 0; i--)
+      {
+       GtkCssRuleset *ruleset;
+
+       ruleset = tree_rules->pdata[i];
+
+       verify_change |= _gtk_css_selector_tree_match_get_change (ruleset->selector_match);
+      }
+
+    if (change != verify_change)
+      {
+       GString *s;
+
+       s = g_string_new ("");
+       g_string_append_printf (s, "expected change 0x%x, but it was 0x%x", verify_change, change);
+       if ((change & ~verify_change) != 0)
+         g_string_append_printf (s, ", unexpectedly set: 0x%x", change & ~verify_change);
+       if ((~change & verify_change) != 0)
+         g_string_append_printf (s, ", unexpectedly no set: 0x%x",  ~change & verify_change);
+       g_warning (s->str);
+       g_string_free (s, TRUE);
+      }
+
+    g_ptr_array_free (tree_rules, TRUE);
+  }
+#endif
+}
+
+
 static gboolean
 gtk_css_provider_get_style_property (GtkStyleProvider *provider,
                                      GtkWidgetPath    *path,
@@ -1457,6 +1488,7 @@ gtk_css_provider_get_style_property (GtkStyleProvider *provider,
   GtkCssProvider *css_provider = GTK_CSS_PROVIDER (provider);
   GtkCssProviderPrivate *priv = css_provider->priv;
   WidgetPropertyValue *val;
+  GPtrArray *tree_rules;
   GtkCssMatcher matcher;
   gboolean found = FALSE;
   gchar *prop_name;
@@ -1465,22 +1497,20 @@ gtk_css_provider_get_style_property (GtkStyleProvider *provider,
   if (!_gtk_css_matcher_init (&matcher, path, state))
     return FALSE;
 
+  tree_rules = _gtk_css_selector_tree_match_all (priv->tree, &matcher);
+  verify_tree_match_results (css_provider, &matcher, tree_rules);
+
   prop_name = g_strdup_printf ("-%s-%s",
                                g_type_name (pspec->owner_type),
                                pspec->name);
 
-  for (i = priv->rulesets->len - 1; i >= 0; i--)
+  for (i = tree_rules->len - 1; i >= 0; i--)
     {
-      GtkCssRuleset *ruleset;
-
-      ruleset = &g_array_index (priv->rulesets, GtkCssRuleset, i);
+      GtkCssRuleset *ruleset = tree_rules->pdata[i];
 
       if (ruleset->widget_style == NULL)
         continue;
 
-      if (!gtk_css_ruleset_matches (ruleset, &matcher))
-        continue;
-
       for (val = ruleset->widget_style; val != NULL; val = val->next)
        {
          if (strcmp (val->name, prop_name) == 0)
@@ -1507,6 +1537,7 @@ gtk_css_provider_get_style_property (GtkStyleProvider *provider,
     }
 
   g_free (prop_name);
+  g_ptr_array_free (tree_rules, TRUE);
 
   return found;
 }
@@ -1591,29 +1622,14 @@ gtk_css_style_provider_get_change (GtkStyleProviderPrivate *provider,
 {
   GtkCssProvider *css_provider;
   GtkCssProviderPrivate *priv;
-  GtkCssChange change = 0;
-  GPtrArray *tree_rules;
-  int i;
+  GtkCssChange change;
 
   css_provider = GTK_CSS_PROVIDER (provider);
   priv = css_provider->priv;
 
-  tree_rules = _gtk_css_selector_tree_match_all (priv->tree, matcher);
-  verify_tree_match_results (css_provider, matcher, tree_rules);
+  change = _gtk_css_selector_tree_get_change_all (priv->tree, matcher);
 
-  for (i = tree_rules->len - 1; i >= 0; i--)
-    {
-      GtkCssRuleset *ruleset;
-
-      ruleset = tree_rules->pdata[i];
-
-      if (ruleset->styles == NULL)
-        continue;
-
-      change |= gtk_css_ruleset_get_change (ruleset);
-    }
-
-  g_ptr_array_free (tree_rules, TRUE);
+  verify_tree_get_change_results (css_provider, matcher, change);
 
   return change;
 }
@@ -2436,6 +2452,18 @@ gtk_css_provider_postprocess (GtkCssProvider *css_provider)
 
   priv->tree = _gtk_css_selector_tree_builder_build (builder);
   _gtk_css_selector_tree_builder_free (builder);
+
+#ifndef VERIFY_TREE
+  for (i = 0; i < priv->rulesets->len; i++)
+    {
+      GtkCssRuleset *ruleset;
+
+      ruleset = &g_array_index (priv->rulesets, GtkCssRuleset, i);
+
+      _gtk_css_selector_free (ruleset->selector);
+      ruleset->selector = NULL;
+    }
+#endif
 }
 
 static gboolean