X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=gtk%2Fgtkcssprovider.c;h=751266847464ff2e9d495af992c5b203d60c7e8a;hb=ce0675f1fb2582717793ec29b1787039dfbf8437;hp=358fed253825af599382b898f8b3ed21600bc64c;hpb=6bec57777184f044274a3519e944fc304c91f0ed;p=~andy%2Fgtk diff --git a/gtk/gtkcssprovider.c b/gtk/gtkcssprovider.c index 358fed253..751266847 100644 --- a/gtk/gtkcssprovider.c +++ b/gtk/gtkcssprovider.c @@ -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 @@ -2884,7 +2912,7 @@ gtk_css_ruleset_print (const GtkCssRuleset *ruleset, WidgetPropertyValue *widget_value; guint i; - _gtk_css_selector_print (ruleset->selector, str); + _gtk_css_selector_tree_match_print (ruleset->selector_match, str); g_string_append (str, " {\n");