diff --git a/gtk/gtkcsslookup.c b/gtk/gtkcsslookup.c index cfe5bfc5c5..8b0c33b0df 100644 --- a/gtk/gtkcsslookup.c +++ b/gtk/gtkcsslookup.c @@ -44,12 +44,6 @@ _gtk_css_lookup_is_missing (const GtkCssLookup *lookup, return lookup->values[id].value == NULL; } -gboolean -_gtk_css_lookup_all_set (const GtkCssLookup *lookup) -{ - return lookup->n_set_values == GTK_CSS_PROPERTY_N_PROPERTIES; -} - /** * _gtk_css_lookup_set: * @lookup: the lookup @@ -75,7 +69,6 @@ _gtk_css_lookup_set (GtkCssLookup *lookup, lookup->values[id].value = value; lookup->values[id].section = section; - lookup->n_set_values ++; } /** diff --git a/gtk/gtkcsslookupprivate.h b/gtk/gtkcsslookupprivate.h index 34acd504c3..ef29c4e9b3 100644 --- a/gtk/gtkcsslookupprivate.h +++ b/gtk/gtkcsslookupprivate.h @@ -36,7 +36,6 @@ typedef struct { } GtkCssLookupValue; struct _GtkCssLookup { - guint n_set_values; GtkCssLookupValue values[GTK_CSS_PROPERTY_N_PROPERTIES]; }; @@ -44,7 +43,6 @@ void _gtk_css_lookup_init (GtkCssLookup void _gtk_css_lookup_destroy (GtkCssLookup *lookup); gboolean _gtk_css_lookup_is_missing (const GtkCssLookup *lookup, guint id); -gboolean _gtk_css_lookup_all_set (const GtkCssLookup *lookup); void _gtk_css_lookup_set (GtkCssLookup *lookup, guint id, GtkCssSection *section, diff --git a/gtk/gtkcssprovider.c b/gtk/gtkcssprovider.c index 6db8d88ba6..e2388de1e1 100644 --- a/gtk/gtkcssprovider.c +++ b/gtk/gtkcssprovider.c @@ -489,9 +489,6 @@ gtk_css_style_provider_lookup (GtkStyleProvider *provider, ruleset->styles[j].section, ruleset->styles[j].value); } - - if (_gtk_css_lookup_all_set (lookup)) - break; } g_ptr_array_free (tree_rules, TRUE); diff --git a/gtk/gtkcssselector.c b/gtk/gtkcssselector.c index b08e3c7a2b..802ae9a395 100644 --- a/gtk/gtkcssselector.c +++ b/gtk/gtkcssselector.c @@ -1815,120 +1815,6 @@ gtk_css_selectors_skip_initial_selector (GtkCssSelector *selector, const GtkCssS return (GtkCssSelector *)gtk_css_selector_previous (selector); } -static gboolean -gtk_css_selector_tree_match_bloom (const GtkCssSelectorTree *tree, - const GtkCountingBloomFilter *filter, - gboolean skipping) -{ - const GtkCssSelectorTree *prev; - - switch (tree->selector.class->category) - { - case GTK_CSS_SELECTOR_CATEGORY_SIMPLE: - break; - case GTK_CSS_SELECTOR_CATEGORY_SIMPLE_RADICAL: - if (skipping) - break; - if (!gtk_counting_bloom_filter_may_contain (filter, - gtk_css_selector_hash_one (&tree->selector))) - return FALSE; - break; - case GTK_CSS_SELECTOR_CATEGORY_PARENT: - skipping = FALSE; - break; - case GTK_CSS_SELECTOR_CATEGORY_SIBLING: - skipping = TRUE; - break; - default: - g_assert_not_reached (); - return FALSE; - } - - if (gtk_css_selector_tree_get_matches (tree)) - return TRUE; - - for (prev = gtk_css_selector_tree_get_previous (tree); - prev != NULL; - prev = gtk_css_selector_tree_get_sibling (prev)) - { - if (gtk_css_selector_tree_match_bloom (prev, filter, skipping)) - return TRUE; - } - - return FALSE; -} - -static void -gtk_css_selector_tree_found_match (const GtkCssSelectorTree *tree, - GPtrArray **results) -{ - int i; - gpointer *matches; - - matches = gtk_css_selector_tree_get_matches (tree); - if (!matches) - return; - - if (*results == NULL) - *results = g_ptr_array_sized_new (16); - - for (i = 0; matches[i] != NULL; i++) - g_ptr_array_insert_sorted (*results, matches[i]); -} - -static void -gtk_css_selector_tree_match (const GtkCssSelectorTree *tree, - const GtkCountingBloomFilter *filter, - GtkCssNode *node, - GPtrArray **results) -{ - const GtkCssSelectorTree *prev; - GtkCssNode *child; - - if (!gtk_css_selector_match_one (&tree->selector, node)) - return; - - gtk_css_selector_tree_found_match (tree, results); - - if (filter && !gtk_css_selector_is_simple (&tree->selector)) - { - /* We can pass both TRUE or FALSE for skipping here, because the - * function will immediately update it. */ - if (!gtk_css_selector_tree_match_bloom (tree, filter, FALSE)) - return; - } - - for (prev = gtk_css_selector_tree_get_previous (tree); - prev != NULL; - prev = gtk_css_selector_tree_get_sibling (prev)) - { - for (child = gtk_css_selector_iterator (&tree->selector, node, NULL); - child; - child = gtk_css_selector_iterator (&tree->selector, node, child)) - { - gtk_css_selector_tree_match (prev, filter, child, results); - } - } - - return; -} - -GPtrArray * -_gtk_css_selector_tree_match_all (const GtkCssSelectorTree *tree, - const GtkCountingBloomFilter *filter, - GtkCssNode *node) -{ - GPtrArray *results = NULL; - - for (; tree != NULL; - tree = gtk_css_selector_tree_get_sibling (tree)) - { - gtk_css_selector_tree_match (tree, filter, node, &results); - } - - return results; -} - /* When checking for changes via the tree we need to know if a rule further down the tree matched, because if so we need to add "our bit" to the Change. For instance in a match like *.class:active we'll @@ -1997,6 +1883,80 @@ gtk_css_selector_tree_get_change (const GtkCssSelectorTree *tree, return change; } +static void +gtk_css_selector_tree_found_match (const GtkCssSelectorTree *tree, + GPtrArray **results) +{ + int i; + gpointer *matches; + + matches = gtk_css_selector_tree_get_matches (tree); + if (!matches) + return; + + if (*results == NULL) + *results = g_ptr_array_sized_new (16); + + for (i = 0; matches[i] != NULL; i++) + g_ptr_array_insert_sorted (*results, matches[i]); +} + +static gboolean +gtk_css_selector_tree_match (const GtkCssSelectorTree *tree, + const GtkCountingBloomFilter *filter, + gboolean match_filter, + GtkCssNode *node, + GPtrArray **results) +{ + const GtkCssSelectorTree *prev; + GtkCssNode *child; + + if (match_filter && tree->selector.class->category == GTK_CSS_SELECTOR_CATEGORY_SIMPLE_RADICAL && + !gtk_counting_bloom_filter_may_contain (filter, gtk_css_selector_hash_one (&tree->selector))) + return FALSE; + + if (!gtk_css_selector_match_one (&tree->selector, node)) + return TRUE; + + gtk_css_selector_tree_found_match (tree, results); + + if (filter && !gtk_css_selector_is_simple (&tree->selector)) + match_filter = tree->selector.class->category == GTK_CSS_SELECTOR_CATEGORY_PARENT; + + for (prev = gtk_css_selector_tree_get_previous (tree); + prev != NULL; + prev = gtk_css_selector_tree_get_sibling (prev)) + { + for (child = gtk_css_selector_iterator (&tree->selector, node, NULL); + child; + child = gtk_css_selector_iterator (&tree->selector, node, child)) + { + if (!gtk_css_selector_tree_match (prev, filter, match_filter, child, results)) + break; + } + } + + return TRUE; +} + +GPtrArray * +_gtk_css_selector_tree_match_all (const GtkCssSelectorTree *tree, + const GtkCountingBloomFilter *filter, + GtkCssNode *node) +{ + const GtkCssSelectorTree *iter; + GPtrArray *results = NULL; + + for (iter = tree; + iter != NULL; + iter = gtk_css_selector_tree_get_sibling (iter)) + { + gtk_css_selector_tree_match (iter, filter, FALSE, node, &results); + } + + return results; +} + gboolean _gtk_css_selector_tree_is_empty (const GtkCssSelectorTree *tree) { @@ -2020,7 +1980,7 @@ gtk_css_selector_tree_get_change_all (const GtkCssSelectorTree *tree, #ifdef PRINT_TREE static void -_gtk_css_selector_tree_print (const GtkCssSelectorTree *tree, GString *str, char *prefix) +_gtk_css_selector_tree_print (const GtkCssSelectorTree *tree, GString *str, const char *prefix) { gboolean first = TRUE; int len, i;