cssselector: Rewrite change computation
We know that non-simple selectors cause a transition to the all matcher, so just assume the all matcher from that point on.
This commit is contained in:
		@ -25,17 +25,6 @@
 | 
				
			|||||||
#include "gtkcssprovider.h"
 | 
					#include "gtkcssprovider.h"
 | 
				
			||||||
#include "gtkstylecontextprivate.h"
 | 
					#include "gtkstylecontextprivate.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* 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 a match like *.class:active we'll
 | 
					 | 
				
			||||||
   get a tree that first checks :active, if that matches we continue down
 | 
					 | 
				
			||||||
   to the tree, and if we get a match we add CHANGE_CLASS. However, the
 | 
					 | 
				
			||||||
   end of the tree where we have a match is an ANY which doesn't actually
 | 
					 | 
				
			||||||
   modify the change, so we don't know if we have a match or not. We fix
 | 
					 | 
				
			||||||
   this by setting GTK_CSS_CHANGE_GOT_MATCH which lets us guarantee
 | 
					 | 
				
			||||||
   that change != 0 on any match. */
 | 
					 | 
				
			||||||
#define GTK_CSS_CHANGE_GOT_MATCH GTK_CSS_CHANGE_RESERVED_BIT
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
typedef struct _GtkCssSelectorClass GtkCssSelectorClass;
 | 
					typedef struct _GtkCssSelectorClass GtkCssSelectorClass;
 | 
				
			||||||
typedef gboolean (* GtkCssSelectorForeachFunc) (const GtkCssSelector *selector,
 | 
					typedef gboolean (* GtkCssSelectorForeachFunc) (const GtkCssSelector *selector,
 | 
				
			||||||
                                                const GtkCssMatcher  *matcher,
 | 
					                                                const GtkCssMatcher  *matcher,
 | 
				
			||||||
@ -60,8 +49,6 @@ struct _GtkCssSelectorClass {
 | 
				
			|||||||
                                     const GtkCssMatcher        *matcher);
 | 
					                                     const GtkCssMatcher        *matcher);
 | 
				
			||||||
  GtkCssChange      (* get_change)  (const GtkCssSelector       *selector,
 | 
					  GtkCssChange      (* get_change)  (const GtkCssSelector       *selector,
 | 
				
			||||||
				     GtkCssChange                previous_change);
 | 
									     GtkCssChange                previous_change);
 | 
				
			||||||
  GtkCssChange      (* tree_get_change)  (const GtkCssSelectorTree *tree,
 | 
					 | 
				
			||||||
					  const GtkCssMatcher      *matcher);
 | 
					 | 
				
			||||||
  void              (* add_specificity)  (const GtkCssSelector  *selector,
 | 
					  void              (* add_specificity)  (const GtkCssSelector  *selector,
 | 
				
			||||||
                                          guint                 *ids,
 | 
					                                          guint                 *ids,
 | 
				
			||||||
                                          guint                 *classes,
 | 
					                                          guint                 *classes,
 | 
				
			||||||
@ -168,16 +155,6 @@ gtk_css_selector_tree_found_match (const GtkCssSelectorTree *tree,
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static GtkCssChange
 | 
					 | 
				
			||||||
gtk_css_selector_tree_get_change (const GtkCssSelectorTree *tree,
 | 
					 | 
				
			||||||
				  const GtkCssMatcher      *matcher)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  if (tree == NULL)
 | 
					 | 
				
			||||||
    return 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  return tree->selector.class->tree_get_change (tree, matcher);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static gboolean
 | 
					static gboolean
 | 
				
			||||||
gtk_css_selector_match (const GtkCssSelector *selector,
 | 
					gtk_css_selector_match (const GtkCssSelector *selector,
 | 
				
			||||||
                        const GtkCssMatcher  *matcher)
 | 
					                        const GtkCssMatcher  *matcher)
 | 
				
			||||||
@ -239,21 +216,6 @@ gtk_css_selector_tree_get_sibling (const GtkCssSelectorTree *tree)
 | 
				
			|||||||
  return gtk_css_selector_tree_at_offset (tree, tree->sibling_offset);
 | 
					  return gtk_css_selector_tree_at_offset (tree, tree->sibling_offset);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static GtkCssChange
 | 
					 | 
				
			||||||
gtk_css_selector_tree_get_previous_change (const GtkCssSelectorTree *tree,
 | 
					 | 
				
			||||||
					   const GtkCssMatcher      *matcher)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  GtkCssChange previous_change = 0;
 | 
					 | 
				
			||||||
  const GtkCssSelectorTree *prev;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  for (prev = gtk_css_selector_tree_get_previous (tree);
 | 
					 | 
				
			||||||
       prev != NULL;
 | 
					 | 
				
			||||||
       prev = gtk_css_selector_tree_get_sibling (prev))
 | 
					 | 
				
			||||||
    previous_change |= gtk_css_selector_tree_get_change (prev, matcher);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  return previous_change;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* DEFAULTS */
 | 
					/* DEFAULTS */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
@ -327,33 +289,6 @@ gtk_css_selector_descendant_foreach_matcher (const GtkCssSelector      *selector
 | 
				
			|||||||
  return FALSE;
 | 
					  return FALSE;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static GtkCssChange
 | 
					 | 
				
			||||||
gtk_css_selector_descendant_tree_get_change (const GtkCssSelectorTree *tree,
 | 
					 | 
				
			||||||
					     const GtkCssMatcher  *matcher)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  GtkCssMatcher ancestor;
 | 
					 | 
				
			||||||
  GtkCssChange change, previous_change;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  change = 0;
 | 
					 | 
				
			||||||
  previous_change = 0;
 | 
					 | 
				
			||||||
  while (_gtk_css_matcher_get_parent (&ancestor, matcher))
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      matcher = &ancestor;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      previous_change |= gtk_css_selector_tree_get_previous_change (tree, matcher);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      /* any matchers are dangerous here, as we may loop forever, but
 | 
					 | 
				
			||||||
	 we can terminate now as all possible matches have already been added */
 | 
					 | 
				
			||||||
      if (_gtk_css_matcher_matches_any (matcher))
 | 
					 | 
				
			||||||
	break;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  if (previous_change != 0)
 | 
					 | 
				
			||||||
    change |= _gtk_css_change_for_child (previous_change) | GTK_CSS_CHANGE_GOT_MATCH;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  return change;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static GtkCssChange
 | 
					static GtkCssChange
 | 
				
			||||||
gtk_css_selector_descendant_get_change (const GtkCssSelector *selector, GtkCssChange previous_change)
 | 
					gtk_css_selector_descendant_get_change (const GtkCssSelector *selector, GtkCssChange previous_change)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@ -366,7 +301,6 @@ static const GtkCssSelectorClass GTK_CSS_SELECTOR_DESCENDANT = {
 | 
				
			|||||||
  gtk_css_selector_descendant_foreach_matcher,
 | 
					  gtk_css_selector_descendant_foreach_matcher,
 | 
				
			||||||
  gtk_css_selector_default_match_one,
 | 
					  gtk_css_selector_default_match_one,
 | 
				
			||||||
  gtk_css_selector_descendant_get_change,
 | 
					  gtk_css_selector_descendant_get_change,
 | 
				
			||||||
  gtk_css_selector_descendant_tree_get_change,
 | 
					 | 
				
			||||||
  gtk_css_selector_default_add_specificity,
 | 
					  gtk_css_selector_default_add_specificity,
 | 
				
			||||||
  gtk_css_selector_default_hash_one,
 | 
					  gtk_css_selector_default_hash_one,
 | 
				
			||||||
  gtk_css_selector_default_compare_one,
 | 
					  gtk_css_selector_default_compare_one,
 | 
				
			||||||
@ -412,35 +346,6 @@ gtk_css_selector_descendant_for_region_foreach_matcher (const GtkCssSelector
 | 
				
			|||||||
  return FALSE;
 | 
					  return FALSE;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static GtkCssChange
 | 
					 | 
				
			||||||
gtk_css_selector_descendant_for_region_tree_get_change (const GtkCssSelectorTree *tree,
 | 
					 | 
				
			||||||
					                const GtkCssMatcher  *matcher)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  GtkCssMatcher ancestor;
 | 
					 | 
				
			||||||
  GtkCssChange change, previous_change;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  previous_change = gtk_css_selector_tree_get_previous_change (tree, matcher);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  change = 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  while (_gtk_css_matcher_get_parent (&ancestor, matcher))
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      matcher = &ancestor;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      previous_change |= _gtk_css_change_for_child (gtk_css_selector_tree_get_previous_change (tree, matcher));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      /* any matchers are dangerous here, as we may loop forever, but
 | 
					 | 
				
			||||||
	 we can terminate now as all possible matches have already been added */
 | 
					 | 
				
			||||||
      if (_gtk_css_matcher_matches_any (matcher))
 | 
					 | 
				
			||||||
	break;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  if (previous_change != 0)
 | 
					 | 
				
			||||||
    change |= previous_change | GTK_CSS_CHANGE_GOT_MATCH;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  return change;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static GtkCssChange
 | 
					static GtkCssChange
 | 
				
			||||||
gtk_css_selector_descendant_for_region_get_change (const GtkCssSelector *selector, GtkCssChange previous_change)
 | 
					gtk_css_selector_descendant_for_region_get_change (const GtkCssSelector *selector, GtkCssChange previous_change)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@ -453,7 +358,6 @@ static const GtkCssSelectorClass GTK_CSS_SELECTOR_DESCENDANT_FOR_REGION = {
 | 
				
			|||||||
  gtk_css_selector_descendant_for_region_foreach_matcher,
 | 
					  gtk_css_selector_descendant_for_region_foreach_matcher,
 | 
				
			||||||
  gtk_css_selector_default_match_one,
 | 
					  gtk_css_selector_default_match_one,
 | 
				
			||||||
  gtk_css_selector_descendant_for_region_get_change,
 | 
					  gtk_css_selector_descendant_for_region_get_change,
 | 
				
			||||||
  gtk_css_selector_descendant_for_region_tree_get_change,
 | 
					 | 
				
			||||||
  gtk_css_selector_default_add_specificity,
 | 
					  gtk_css_selector_default_add_specificity,
 | 
				
			||||||
  gtk_css_selector_default_hash_one,
 | 
					  gtk_css_selector_default_hash_one,
 | 
				
			||||||
  gtk_css_selector_default_compare_one,
 | 
					  gtk_css_selector_default_compare_one,
 | 
				
			||||||
@ -483,26 +387,6 @@ gtk_css_selector_child_foreach_matcher (const GtkCssSelector      *selector,
 | 
				
			|||||||
  return func (selector, &parent, data);
 | 
					  return func (selector, &parent, data);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static GtkCssChange
 | 
					 | 
				
			||||||
gtk_css_selector_child_tree_get_change (const GtkCssSelectorTree *tree,
 | 
					 | 
				
			||||||
					const GtkCssMatcher  *matcher)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  GtkCssMatcher parent;
 | 
					 | 
				
			||||||
  GtkCssChange change, previous_change;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  if (!_gtk_css_matcher_get_parent (&parent, matcher))
 | 
					 | 
				
			||||||
    return 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  change = 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  previous_change = gtk_css_selector_tree_get_previous_change (tree, &parent);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  if (previous_change != 0)
 | 
					 | 
				
			||||||
    change |= _gtk_css_change_for_child (previous_change) | GTK_CSS_CHANGE_GOT_MATCH;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  return change;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static GtkCssChange
 | 
					static GtkCssChange
 | 
				
			||||||
gtk_css_selector_child_get_change (const GtkCssSelector *selector, GtkCssChange previous_change)
 | 
					gtk_css_selector_child_get_change (const GtkCssSelector *selector, GtkCssChange previous_change)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@ -515,7 +399,6 @@ static const GtkCssSelectorClass GTK_CSS_SELECTOR_CHILD = {
 | 
				
			|||||||
  gtk_css_selector_child_foreach_matcher,
 | 
					  gtk_css_selector_child_foreach_matcher,
 | 
				
			||||||
  gtk_css_selector_default_match_one,
 | 
					  gtk_css_selector_default_match_one,
 | 
				
			||||||
  gtk_css_selector_child_get_change,
 | 
					  gtk_css_selector_child_get_change,
 | 
				
			||||||
  gtk_css_selector_child_tree_get_change,
 | 
					 | 
				
			||||||
  gtk_css_selector_default_add_specificity,
 | 
					  gtk_css_selector_default_add_specificity,
 | 
				
			||||||
  gtk_css_selector_default_hash_one,
 | 
					  gtk_css_selector_default_hash_one,
 | 
				
			||||||
  gtk_css_selector_default_compare_one,
 | 
					  gtk_css_selector_default_compare_one,
 | 
				
			||||||
@ -555,34 +438,6 @@ gtk_css_selector_sibling_foreach_matcher (const GtkCssSelector      *selector,
 | 
				
			|||||||
  return FALSE;
 | 
					  return FALSE;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static GtkCssChange
 | 
					 | 
				
			||||||
gtk_css_selector_sibling_tree_get_change (const GtkCssSelectorTree *tree,
 | 
					 | 
				
			||||||
					  const GtkCssMatcher  *matcher)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  GtkCssMatcher previous;
 | 
					 | 
				
			||||||
  GtkCssChange change, previous_change;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  change = 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  previous_change = 0;
 | 
					 | 
				
			||||||
  while (_gtk_css_matcher_get_previous (&previous, matcher))
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      matcher = &previous;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      previous_change |= gtk_css_selector_tree_get_previous_change (tree, matcher);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      /* any matchers are dangerous here, as we may loop forever, but
 | 
					 | 
				
			||||||
	 we can terminate now as all possible matches have already been added */
 | 
					 | 
				
			||||||
      if (_gtk_css_matcher_matches_any (matcher))
 | 
					 | 
				
			||||||
	break;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  if (previous_change != 0)
 | 
					 | 
				
			||||||
    change |= _gtk_css_change_for_sibling (previous_change) |  GTK_CSS_CHANGE_GOT_MATCH;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  return change;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static GtkCssChange
 | 
					static GtkCssChange
 | 
				
			||||||
gtk_css_selector_sibling_get_change (const GtkCssSelector *selector, GtkCssChange previous_change)
 | 
					gtk_css_selector_sibling_get_change (const GtkCssSelector *selector, GtkCssChange previous_change)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@ -595,7 +450,6 @@ static const GtkCssSelectorClass GTK_CSS_SELECTOR_SIBLING = {
 | 
				
			|||||||
  gtk_css_selector_sibling_foreach_matcher,
 | 
					  gtk_css_selector_sibling_foreach_matcher,
 | 
				
			||||||
  gtk_css_selector_default_match_one,
 | 
					  gtk_css_selector_default_match_one,
 | 
				
			||||||
  gtk_css_selector_sibling_get_change,
 | 
					  gtk_css_selector_sibling_get_change,
 | 
				
			||||||
  gtk_css_selector_sibling_tree_get_change,
 | 
					 | 
				
			||||||
  gtk_css_selector_default_add_specificity,
 | 
					  gtk_css_selector_default_add_specificity,
 | 
				
			||||||
  gtk_css_selector_default_hash_one,
 | 
					  gtk_css_selector_default_hash_one,
 | 
				
			||||||
  gtk_css_selector_default_compare_one,
 | 
					  gtk_css_selector_default_compare_one,
 | 
				
			||||||
@ -625,26 +479,6 @@ gtk_css_selector_adjacent_foreach_matcher (const GtkCssSelector      *selector,
 | 
				
			|||||||
  return func (selector, &previous, data);
 | 
					  return func (selector, &previous, data);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static GtkCssChange
 | 
					 | 
				
			||||||
gtk_css_selector_adjacent_tree_get_change (const GtkCssSelectorTree *tree,
 | 
					 | 
				
			||||||
					   const GtkCssMatcher  *matcher)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  GtkCssMatcher previous;
 | 
					 | 
				
			||||||
  GtkCssChange change, previous_change;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  if (!_gtk_css_matcher_get_previous (&previous, matcher))
 | 
					 | 
				
			||||||
    return 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  change = 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  previous_change = gtk_css_selector_tree_get_previous_change (tree, &previous);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  if (previous_change != 0)
 | 
					 | 
				
			||||||
    change |= _gtk_css_change_for_sibling (previous_change) |  GTK_CSS_CHANGE_GOT_MATCH;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  return change;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static GtkCssChange
 | 
					static GtkCssChange
 | 
				
			||||||
gtk_css_selector_adjacent_get_change (const GtkCssSelector *selector, GtkCssChange previous_change)
 | 
					gtk_css_selector_adjacent_get_change (const GtkCssSelector *selector, GtkCssChange previous_change)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@ -657,7 +491,6 @@ static const GtkCssSelectorClass GTK_CSS_SELECTOR_ADJACENT = {
 | 
				
			|||||||
  gtk_css_selector_adjacent_foreach_matcher,
 | 
					  gtk_css_selector_adjacent_foreach_matcher,
 | 
				
			||||||
  gtk_css_selector_default_match_one,
 | 
					  gtk_css_selector_default_match_one,
 | 
				
			||||||
  gtk_css_selector_adjacent_get_change,
 | 
					  gtk_css_selector_adjacent_get_change,
 | 
				
			||||||
  gtk_css_selector_adjacent_tree_get_change,
 | 
					 | 
				
			||||||
  gtk_css_selector_default_add_specificity,
 | 
					  gtk_css_selector_default_add_specificity,
 | 
				
			||||||
  gtk_css_selector_default_hash_one,
 | 
					  gtk_css_selector_default_hash_one,
 | 
				
			||||||
  gtk_css_selector_default_compare_one,
 | 
					  gtk_css_selector_default_compare_one,
 | 
				
			||||||
@ -699,28 +532,6 @@ gtk_css_selector_not_ ## n ## _match_one (const GtkCssSelector *selector, \
 | 
				
			|||||||
} \
 | 
					} \
 | 
				
			||||||
\
 | 
					\
 | 
				
			||||||
static GtkCssChange \
 | 
					static GtkCssChange \
 | 
				
			||||||
gtk_css_selector_ ## n ##_tree_get_change (const GtkCssSelectorTree *tree, \
 | 
					 | 
				
			||||||
			          	   const GtkCssMatcher      *matcher) \
 | 
					 | 
				
			||||||
{ \
 | 
					 | 
				
			||||||
  GtkCssChange change, previous_change; \
 | 
					 | 
				
			||||||
\
 | 
					 | 
				
			||||||
  if (!match_func (&tree->selector, matcher)) \
 | 
					 | 
				
			||||||
    return 0; \
 | 
					 | 
				
			||||||
\
 | 
					 | 
				
			||||||
  change = 0; \
 | 
					 | 
				
			||||||
\
 | 
					 | 
				
			||||||
  if (tree->matches_offset != GTK_CSS_SELECTOR_TREE_EMPTY_OFFSET) \
 | 
					 | 
				
			||||||
    change |= GTK_CSS_CHANGE_ ## c | GTK_CSS_CHANGE_GOT_MATCH; \
 | 
					 | 
				
			||||||
\
 | 
					 | 
				
			||||||
  previous_change = gtk_css_selector_tree_get_previous_change (tree, matcher); \
 | 
					 | 
				
			||||||
\
 | 
					 | 
				
			||||||
  if (previous_change) \
 | 
					 | 
				
			||||||
    change |= previous_change | GTK_CSS_CHANGE_ ## c | GTK_CSS_CHANGE_GOT_MATCH; \
 | 
					 | 
				
			||||||
\
 | 
					 | 
				
			||||||
  return change; \
 | 
					 | 
				
			||||||
} \
 | 
					 | 
				
			||||||
\
 | 
					 | 
				
			||||||
static GtkCssChange \
 | 
					 | 
				
			||||||
gtk_css_selector_ ## n ## _get_change (const GtkCssSelector *selector, GtkCssChange previous_change) \
 | 
					gtk_css_selector_ ## n ## _get_change (const GtkCssSelector *selector, GtkCssChange previous_change) \
 | 
				
			||||||
{ \
 | 
					{ \
 | 
				
			||||||
  return previous_change | GTK_CSS_CHANGE_ ## c; \
 | 
					  return previous_change | GTK_CSS_CHANGE_ ## c; \
 | 
				
			||||||
@ -746,7 +557,6 @@ static const GtkCssSelectorClass GTK_CSS_SELECTOR_ ## c = { \
 | 
				
			|||||||
  gtk_css_selector_default_foreach_matcher, \
 | 
					  gtk_css_selector_default_foreach_matcher, \
 | 
				
			||||||
  match_func, \
 | 
					  match_func, \
 | 
				
			||||||
  gtk_css_selector_ ## n ## _get_change, \
 | 
					  gtk_css_selector_ ## n ## _get_change, \
 | 
				
			||||||
  gtk_css_selector_ ## n ## _tree_get_change, \
 | 
					 | 
				
			||||||
  gtk_css_selector_ ## n ## _add_specificity, \
 | 
					  gtk_css_selector_ ## n ## _add_specificity, \
 | 
				
			||||||
  hash_func, \
 | 
					  hash_func, \
 | 
				
			||||||
  comp_func, \
 | 
					  comp_func, \
 | 
				
			||||||
@ -759,7 +569,6 @@ static const GtkCssSelectorClass GTK_CSS_SELECTOR_NOT_ ## c = { \
 | 
				
			|||||||
  gtk_css_selector_default_foreach_matcher, \
 | 
					  gtk_css_selector_default_foreach_matcher, \
 | 
				
			||||||
  gtk_css_selector_not_ ## n ## _match_one, \
 | 
					  gtk_css_selector_not_ ## n ## _match_one, \
 | 
				
			||||||
  gtk_css_selector_ ## n ## _get_change, \
 | 
					  gtk_css_selector_ ## n ## _get_change, \
 | 
				
			||||||
  gtk_css_selector_ ## n ## _tree_get_change, \
 | 
					 | 
				
			||||||
  gtk_css_selector_ ## n ## _add_specificity, \
 | 
					  gtk_css_selector_ ## n ## _add_specificity, \
 | 
				
			||||||
  hash_func, \
 | 
					  hash_func, \
 | 
				
			||||||
  comp_func, \
 | 
					  comp_func, \
 | 
				
			||||||
@ -910,28 +719,6 @@ gtk_css_selector_region_match_one (const GtkCssSelector *selector,
 | 
				
			|||||||
  return _gtk_css_matcher_has_region (matcher, selector->region.name, selector->region.flags);
 | 
					  return _gtk_css_matcher_has_region (matcher, selector->region.name, selector->region.flags);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static GtkCssChange
 | 
					 | 
				
			||||||
gtk_css_selector_region_tree_get_change (const GtkCssSelectorTree *tree,
 | 
					 | 
				
			||||||
					 const GtkCssMatcher  *matcher)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  GtkCssChange change, previous_change;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  if (!_gtk_css_matcher_has_region (matcher, tree->selector.region.name, tree->selector.region.flags))
 | 
					 | 
				
			||||||
    return 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  change = 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  if (tree->matches_offset != GTK_CSS_SELECTOR_TREE_EMPTY_OFFSET)
 | 
					 | 
				
			||||||
    change |= GTK_CSS_CHANGE_REGION | GTK_CSS_CHANGE_GOT_MATCH;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  previous_change = gtk_css_selector_tree_get_previous_change (tree, matcher);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  if (previous_change != 0)
 | 
					 | 
				
			||||||
    change |= previous_change | GTK_CSS_CHANGE_REGION | GTK_CSS_CHANGE_GOT_MATCH;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  return change;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static GtkCssChange
 | 
					static GtkCssChange
 | 
				
			||||||
gtk_css_selector_region_get_change (const GtkCssSelector *selector, GtkCssChange previous_change)
 | 
					gtk_css_selector_region_get_change (const GtkCssSelector *selector, GtkCssChange previous_change)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@ -985,7 +772,6 @@ static const GtkCssSelectorClass GTK_CSS_SELECTOR_REGION = {
 | 
				
			|||||||
  gtk_css_selector_default_foreach_matcher,
 | 
					  gtk_css_selector_default_foreach_matcher,
 | 
				
			||||||
  gtk_css_selector_region_match_one,
 | 
					  gtk_css_selector_region_match_one,
 | 
				
			||||||
  gtk_css_selector_region_get_change,
 | 
					  gtk_css_selector_region_get_change,
 | 
				
			||||||
  gtk_css_selector_region_tree_get_change,
 | 
					 | 
				
			||||||
  gtk_css_selector_region_add_specificity,
 | 
					  gtk_css_selector_region_add_specificity,
 | 
				
			||||||
  gtk_css_selector_region_hash_one,
 | 
					  gtk_css_selector_region_hash_one,
 | 
				
			||||||
  gtk_css_selector_region_compare_one,
 | 
					  gtk_css_selector_region_compare_one,
 | 
				
			||||||
@ -1968,6 +1754,45 @@ _gtk_css_selector_tree_match_all (const GtkCssSelectorTree *tree,
 | 
				
			|||||||
  return array;
 | 
					  return array;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static GtkCssChange
 | 
				
			||||||
 | 
					gtk_css_selector_tree_collect_change (const GtkCssSelectorTree *tree)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  GtkCssChange change = 0;
 | 
				
			||||||
 | 
					  const GtkCssSelectorTree *prev;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  for (prev = gtk_css_selector_tree_get_previous (tree);
 | 
				
			||||||
 | 
					       prev != NULL;
 | 
				
			||||||
 | 
					       prev = gtk_css_selector_tree_get_sibling (prev))
 | 
				
			||||||
 | 
					    change |= gtk_css_selector_tree_collect_change (prev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  change = tree->selector.class->get_change (&tree->selector, change);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return change;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static GtkCssChange
 | 
				
			||||||
 | 
					gtk_css_selector_tree_get_change (const GtkCssSelectorTree *tree,
 | 
				
			||||||
 | 
									  const GtkCssMatcher      *matcher)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  GtkCssChange change = 0;
 | 
				
			||||||
 | 
					  const GtkCssSelectorTree *prev;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (!gtk_css_selector_match (&tree->selector, matcher))
 | 
				
			||||||
 | 
					    return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (tree->selector.class->is_simple)
 | 
				
			||||||
 | 
					    return gtk_css_selector_tree_collect_change (tree);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  for (prev = gtk_css_selector_tree_get_previous (tree);
 | 
				
			||||||
 | 
					       prev != NULL;
 | 
				
			||||||
 | 
					       prev = gtk_css_selector_tree_get_sibling (prev))
 | 
				
			||||||
 | 
					    change |= gtk_css_selector_tree_get_change (prev, matcher);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  change = tree->selector.class->get_change (&tree->selector, change);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return change;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GtkCssChange
 | 
					GtkCssChange
 | 
				
			||||||
_gtk_css_selector_tree_get_change_all (const GtkCssSelectorTree *tree,
 | 
					_gtk_css_selector_tree_get_change_all (const GtkCssSelectorTree *tree,
 | 
				
			||||||
				       const GtkCssMatcher *matcher)
 | 
									       const GtkCssMatcher *matcher)
 | 
				
			||||||
@ -1976,12 +1801,13 @@ _gtk_css_selector_tree_get_change_all (const GtkCssSelectorTree *tree,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  change = 0;
 | 
					  change = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /* no need to foreach here because we abort for non-simple selectors */
 | 
				
			||||||
  for (; tree != NULL;
 | 
					  for (; tree != NULL;
 | 
				
			||||||
       tree = gtk_css_selector_tree_get_sibling (tree))
 | 
					       tree = gtk_css_selector_tree_get_sibling (tree))
 | 
				
			||||||
    change |= gtk_css_selector_tree_get_change (tree, matcher);
 | 
					    change |= gtk_css_selector_tree_get_change (tree, matcher);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /* Never return reserved bit set */
 | 
					  /* Never return reserved bit set */
 | 
				
			||||||
  return change & ~GTK_CSS_CHANGE_RESERVED_BIT;
 | 
					  return change;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef PRINT_TREE
 | 
					#ifdef PRINT_TREE
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user