Commit 9b989a14 authored by Alexander Larsson's avatar Alexander Larsson

css: Implement ruleset_get_change() with the tree

We traverse the tree on the matches instead of using
the linear selectors.
parent 146b6f3a
...@@ -1283,7 +1283,7 @@ gtk_css_ruleset_matches (GtkCssRuleset *ruleset, ...@@ -1283,7 +1283,7 @@ gtk_css_ruleset_matches (GtkCssRuleset *ruleset,
static GtkCssChange static GtkCssChange
gtk_css_ruleset_get_change (GtkCssRuleset *ruleset) gtk_css_ruleset_get_change (GtkCssRuleset *ruleset)
{ {
return _gtk_css_selector_get_change (ruleset->selector); return _gtk_css_selector_tree_match_get_change (ruleset->selector_match);
} }
static void static void
......
...@@ -37,7 +37,8 @@ struct _GtkCssSelectorClass { ...@@ -37,7 +37,8 @@ struct _GtkCssSelectorClass {
void (* tree_match) (const GtkCssSelectorTree *tree, void (* tree_match) (const GtkCssSelectorTree *tree,
const GtkCssMatcher *matcher, const GtkCssMatcher *matcher,
GHashTable *res); GHashTable *res);
GtkCssChange (* get_change) (const GtkCssSelector *selector); GtkCssChange (* get_change) (const GtkCssSelector *selector,
GtkCssChange previous_change);
int (* compare_one) (const GtkCssSelector *a, int (* compare_one) (const GtkCssSelector *a,
const GtkCssSelector *b); const GtkCssSelector *b);
...@@ -114,15 +115,6 @@ gtk_css_selector_match (const GtkCssSelector *selector, ...@@ -114,15 +115,6 @@ gtk_css_selector_match (const GtkCssSelector *selector,
return selector->class->match (selector, matcher); return selector->class->match (selector, matcher);
} }
static GtkCssChange
gtk_css_selector_get_change (const GtkCssSelector *selector)
{
if (selector == NULL)
return 0;
return selector->class->get_change (selector);
}
static int static int
gtk_css_selector_compare_one (const GtkCssSelector *a, const GtkCssSelector *b) gtk_css_selector_compare_one (const GtkCssSelector *a, const GtkCssSelector *b)
{ {
...@@ -196,9 +188,9 @@ gtk_css_selector_descendant_compare_one (const GtkCssSelector *a, ...@@ -196,9 +188,9 @@ gtk_css_selector_descendant_compare_one (const GtkCssSelector *a,
} }
static GtkCssChange static GtkCssChange
gtk_css_selector_descendant_get_change (const GtkCssSelector *selector) gtk_css_selector_descendant_get_change (const GtkCssSelector *selector, GtkCssChange previous_change)
{ {
return _gtk_css_change_for_child (gtk_css_selector_get_change (gtk_css_selector_previous (selector))); return _gtk_css_change_for_child (previous_change);
} }
static const GtkCssSelectorClass GTK_CSS_SELECTOR_DESCENDANT = { static const GtkCssSelectorClass GTK_CSS_SELECTOR_DESCENDANT = {
...@@ -248,9 +240,9 @@ gtk_css_selector_child_tree_match (const GtkCssSelectorTree *tree, ...@@ -248,9 +240,9 @@ gtk_css_selector_child_tree_match (const GtkCssSelectorTree *tree,
} }
static GtkCssChange static GtkCssChange
gtk_css_selector_child_get_change (const GtkCssSelector *selector) gtk_css_selector_child_get_change (const GtkCssSelector *selector, GtkCssChange previous_change)
{ {
return _gtk_css_change_for_child (gtk_css_selector_get_change (gtk_css_selector_previous (selector))); return _gtk_css_change_for_child (previous_change);
} }
static int static int
...@@ -319,9 +311,9 @@ gtk_css_selector_sibling_tree_match (const GtkCssSelectorTree *tree, ...@@ -319,9 +311,9 @@ gtk_css_selector_sibling_tree_match (const GtkCssSelectorTree *tree,
} }
static GtkCssChange static GtkCssChange
gtk_css_selector_sibling_get_change (const GtkCssSelector *selector) gtk_css_selector_sibling_get_change (const GtkCssSelector *selector, GtkCssChange previous_change)
{ {
return _gtk_css_change_for_sibling (gtk_css_selector_get_change (gtk_css_selector_previous (selector))); return _gtk_css_change_for_sibling (previous_change);
} }
static int static int
...@@ -381,9 +373,9 @@ gtk_css_selector_adjacent_tree_match (const GtkCssSelectorTree *tree, ...@@ -381,9 +373,9 @@ gtk_css_selector_adjacent_tree_match (const GtkCssSelectorTree *tree,
} }
static GtkCssChange static GtkCssChange
gtk_css_selector_adjacent_get_change (const GtkCssSelector *selector) gtk_css_selector_adjacent_get_change (const GtkCssSelector *selector, GtkCssChange previous_change)
{ {
return _gtk_css_change_for_sibling (gtk_css_selector_get_change (gtk_css_selector_previous (selector))); return _gtk_css_change_for_sibling (previous_change);
} }
static int static int
...@@ -452,9 +444,9 @@ gtk_css_selector_any_tree_match (const GtkCssSelectorTree *tree, ...@@ -452,9 +444,9 @@ gtk_css_selector_any_tree_match (const GtkCssSelectorTree *tree,
} }
static GtkCssChange static GtkCssChange
gtk_css_selector_any_get_change (const GtkCssSelector *selector) gtk_css_selector_any_get_change (const GtkCssSelector *selector, GtkCssChange previous_change)
{ {
return gtk_css_selector_get_change (gtk_css_selector_previous (selector)); return previous_change;
} }
static int static int
...@@ -511,9 +503,9 @@ gtk_css_selector_name_tree_match (const GtkCssSelectorTree *tree, ...@@ -511,9 +503,9 @@ gtk_css_selector_name_tree_match (const GtkCssSelectorTree *tree,
static GtkCssChange static GtkCssChange
gtk_css_selector_name_get_change (const GtkCssSelector *selector) gtk_css_selector_name_get_change (const GtkCssSelector *selector, GtkCssChange previous_change)
{ {
return gtk_css_selector_get_change (gtk_css_selector_previous (selector)) | GTK_CSS_CHANGE_NAME; return previous_change | GTK_CSS_CHANGE_NAME;
} }
static int static int
...@@ -584,11 +576,11 @@ gtk_css_selector_region_tree_match (const GtkCssSelectorTree *tree, ...@@ -584,11 +576,11 @@ gtk_css_selector_region_tree_match (const GtkCssSelectorTree *tree,
} }
static GtkCssChange static GtkCssChange
gtk_css_selector_region_get_change (const GtkCssSelector *selector) gtk_css_selector_region_get_change (const GtkCssSelector *selector, GtkCssChange previous_change)
{ {
GtkCssChange change; GtkCssChange change;
change = gtk_css_selector_get_change (gtk_css_selector_previous (selector)); change = previous_change;
change |= GTK_CSS_CHANGE_REGION; change |= GTK_CSS_CHANGE_REGION;
change |= _gtk_css_change_for_child (change); change |= _gtk_css_change_for_child (change);
...@@ -649,9 +641,9 @@ gtk_css_selector_class_tree_match (const GtkCssSelectorTree *tree, ...@@ -649,9 +641,9 @@ gtk_css_selector_class_tree_match (const GtkCssSelectorTree *tree,
} }
static GtkCssChange static GtkCssChange
gtk_css_selector_class_get_change (const GtkCssSelector *selector) gtk_css_selector_class_get_change (const GtkCssSelector *selector, GtkCssChange previous_change)
{ {
return gtk_css_selector_get_change (gtk_css_selector_previous (selector)) | GTK_CSS_CHANGE_CLASS; return previous_change | GTK_CSS_CHANGE_CLASS;
} }
static int static int
...@@ -709,9 +701,9 @@ gtk_css_selector_id_tree_match (const GtkCssSelectorTree *tree, ...@@ -709,9 +701,9 @@ gtk_css_selector_id_tree_match (const GtkCssSelectorTree *tree,
} }
static GtkCssChange static GtkCssChange
gtk_css_selector_id_get_change (const GtkCssSelector *selector) gtk_css_selector_id_get_change (const GtkCssSelector *selector, GtkCssChange previous_change)
{ {
return gtk_css_selector_get_change (gtk_css_selector_previous (selector)) | GTK_CSS_CHANGE_ID; return previous_change | GTK_CSS_CHANGE_ID;
} }
...@@ -795,9 +787,9 @@ gtk_css_selector_pseudoclass_state_tree_match (const GtkCssSelectorTree *tree, ...@@ -795,9 +787,9 @@ gtk_css_selector_pseudoclass_state_tree_match (const GtkCssSelectorTree *tree,
static GtkCssChange static GtkCssChange
gtk_css_selector_pseudoclass_state_get_change (const GtkCssSelector *selector) gtk_css_selector_pseudoclass_state_get_change (const GtkCssSelector *selector, GtkCssChange previous_change)
{ {
return gtk_css_selector_get_change (gtk_css_selector_previous (selector)) | GTK_CSS_CHANGE_STATE; return previous_change | GTK_CSS_CHANGE_STATE;
} }
static int static int
...@@ -1146,9 +1138,9 @@ gtk_css_selector_pseudoclass_position_tree_match (const GtkCssSelectorTree *tree ...@@ -1146,9 +1138,9 @@ gtk_css_selector_pseudoclass_position_tree_match (const GtkCssSelectorTree *tree
} }
static GtkCssChange static GtkCssChange
gtk_css_selector_pseudoclass_position_get_change (const GtkCssSelector *selector) gtk_css_selector_pseudoclass_position_get_change (const GtkCssSelector *selector, GtkCssChange previous_change)
{ {
return gtk_css_selector_get_change (gtk_css_selector_previous (selector)) | GTK_CSS_CHANGE_POSITION; return previous_change | GTK_CSS_CHANGE_POSITION;
} }
static int static int
...@@ -1540,12 +1532,19 @@ _gtk_css_selector_to_string (const GtkCssSelector *selector) ...@@ -1540,12 +1532,19 @@ _gtk_css_selector_to_string (const GtkCssSelector *selector)
return g_string_free (string, FALSE); return g_string_free (string, FALSE);
} }
GtkCssChange GtkCssChange
_gtk_css_selector_get_change (const GtkCssSelector *selector) _gtk_css_selector_tree_match_get_change (const GtkCssSelectorTree *tree)
{ {
g_return_val_if_fail (selector != NULL, 0); GtkCssChange change = 0;
while (tree)
{
change = tree->selector.class->get_change (&tree->selector, change);
tree = tree->parent;
}
return gtk_css_selector_get_change (selector); return change;
} }
/** /**
......
...@@ -34,17 +34,18 @@ char * _gtk_css_selector_to_string (const GtkCssSelector *sel ...@@ -34,17 +34,18 @@ char * _gtk_css_selector_to_string (const GtkCssSelector *sel
void _gtk_css_selector_print (const GtkCssSelector *selector, void _gtk_css_selector_print (const GtkCssSelector *selector,
GString *str); GString *str);
GtkCssChange _gtk_css_selector_get_change (const GtkCssSelector *selector);
gboolean _gtk_css_selector_matches (const GtkCssSelector *selector, gboolean _gtk_css_selector_matches (const GtkCssSelector *selector,
const GtkCssMatcher *matcher); const GtkCssMatcher *matcher);
int _gtk_css_selector_compare (const GtkCssSelector *a, int _gtk_css_selector_compare (const GtkCssSelector *a,
const GtkCssSelector *b); const GtkCssSelector *b);
void _gtk_css_selector_tree_free (GtkCssSelectorTree *tree); void _gtk_css_selector_tree_free (GtkCssSelectorTree *tree);
GPtrArray *_gtk_css_selector_tree_match_all (GtkCssSelectorTree *tree, GPtrArray * _gtk_css_selector_tree_match_all (GtkCssSelectorTree *tree,
const GtkCssMatcher *matcher); const GtkCssMatcher *matcher);
void _gtk_css_selector_tree_match_print (const GtkCssSelectorTree *tree, void _gtk_css_selector_tree_match_print (const GtkCssSelectorTree *tree,
GString *str); GString *str);
GtkCssChange _gtk_css_selector_tree_match_get_change (const GtkCssSelectorTree *tree);
GtkCssSelectorTreeBuilder *_gtk_css_selector_tree_builder_new (void); GtkCssSelectorTreeBuilder *_gtk_css_selector_tree_builder_new (void);
void _gtk_css_selector_tree_builder_add (GtkCssSelectorTreeBuilder *builder, void _gtk_css_selector_tree_builder_add (GtkCssSelectorTreeBuilder *builder,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment