css: Don't got to the selector tree for change

The tree is optimized for mimizing the decisions, and
that prevents us from taking advantage of the more exact
superset matching that we can do now. So, instead do what
we used to do for verifiation: use the tree for finding the
superset matches, then just walk the rulesets to collect the
changes.
This commit is contained in:
Matthias Clasen
2020-01-15 08:03:09 -05:00
parent d0f75d9231
commit 968e21158e

View File

@@ -425,6 +425,33 @@ verify_tree_match_results (GtkCssProvider *provider,
#endif
}
static GtkCssChange
get_change (GtkCssProvider *provider,
const GtkCssMatcher *matcher)
{
GtkCssProviderPrivate *priv = gtk_css_provider_get_instance_private (provider);
GtkCssChange change = 0;
GPtrArray *tree_rules;
int i;
tree_rules = _gtk_css_selector_tree_match_all (priv->tree, matcher);
if (tree_rules)
{
for (i = tree_rules->len - 1; i >= 0; i--)
{
GtkCssRuleset *ruleset;
ruleset = tree_rules->pdata[i];
change |= _gtk_css_selector_get_change (ruleset->selector);
}
g_ptr_array_free (tree_rules, TRUE);
}
return change;
}
static void
verify_tree_get_change_results (GtkCssProvider *provider,
const GtkCssMatcher *matcher,
@@ -557,8 +584,7 @@ gtk_css_style_provider_lookup (GtkStyleProvider *provider,
_gtk_css_matcher_superset_init (&change_matcher, matcher, &matcher_class, GTK_CSS_CHANGE_CLASS | GTK_CSS_CHANGE_NAME);
*change = _gtk_css_selector_tree_get_change_all (priv->tree, &change_matcher);
verify_tree_get_change_results (css_provider, &change_matcher, *change);
*change = get_change (css_provider, &change_matcher);
}
}
@@ -745,7 +771,6 @@ parse_color_definition (GtkCssScanner *scanner)
GtkCssValue *color;
char *name;
if (!gtk_css_parser_try_at_keyword (scanner->parser, "define-color"))
return FALSE;
name = gtk_css_parser_consume_ident (scanner->parser);