diff options
author | Alexander Larsson <alexl@redhat.com> | 2012-12-07 18:55:49 +0100 |
---|---|---|
committer | Alexander Larsson <alexl@redhat.com> | 2012-12-10 12:11:02 +0100 |
commit | 03c626bb15277c41c11aaee5a6ac6f220a2c4be7 (patch) | |
tree | a282c6b4904cb15475f89aadb4eae9d6c1725b8d /gtk | |
parent | 57e1e0de94823145f9287a7f66c34d229e97e70e (diff) | |
download | gtk+-03c626bb15277c41c11aaee5a6ac6f220a2c4be7.tar.gz |
css: Factor out some of the position matching code
Diffstat (limited to 'gtk')
-rw-r--r-- | gtk/gtkcssselector.c | 115 |
1 files changed, 43 insertions, 72 deletions
diff --git a/gtk/gtkcssselector.c b/gtk/gtkcssselector.c index 8b2b43bdc8..72f1eadd92 100644 --- a/gtk/gtkcssselector.c +++ b/gtk/gtkcssselector.c @@ -1012,11 +1012,8 @@ gtk_css_selector_pseudoclass_position_print (const GtkCssSelector *selector, } static gboolean -gtk_css_selector_pseudoclass_position_match_for_region (const GtkCssSelector *selector, - const GtkCssMatcher *matcher) +get_selector_flags_for_position_region_match (const GtkCssSelector *selector, GtkRegionFlags *selector_flags) { - GtkRegionFlags selector_flags; - const GtkCssSelector *previous; PositionType type; int a, b; @@ -1025,30 +1022,44 @@ gtk_css_selector_pseudoclass_position_match_for_region (const GtkCssSelector *se { case POSITION_FORWARD: if (a == 0 && b == 1) - selector_flags = GTK_REGION_FIRST; + *selector_flags = GTK_REGION_FIRST; else if (a == 2 && b == 0) - selector_flags = GTK_REGION_EVEN; + *selector_flags = GTK_REGION_EVEN; else if (a == 2 && b == 1) - selector_flags = GTK_REGION_ODD; + *selector_flags = GTK_REGION_ODD; else return FALSE; break; case POSITION_BACKWARD: if (a == 0 && b == 1) - selector_flags = GTK_REGION_LAST; + *selector_flags = GTK_REGION_LAST; else return FALSE; break; case POSITION_ONLY: - selector_flags = GTK_REGION_ONLY; + *selector_flags = GTK_REGION_ONLY; break; case POSITION_SORTED: - selector_flags = GTK_REGION_SORTED; + *selector_flags = GTK_REGION_SORTED; break; default: g_assert_not_reached (); break; } + + return TRUE; +} + +static gboolean +gtk_css_selector_pseudoclass_position_match_for_region (const GtkCssSelector *selector, + const GtkCssMatcher *matcher) +{ + GtkRegionFlags selector_flags; + const GtkCssSelector *previous; + + if (!get_selector_flags_for_position_region_match (selector, &selector_flags)) + return FALSE; + selector = gtk_css_selector_previous (selector); if (!_gtk_css_matcher_has_region (matcher, selector->data, selector_flags)) @@ -1063,17 +1074,12 @@ gtk_css_selector_pseudoclass_position_match_for_region (const GtkCssSelector *se } static gboolean -gtk_css_selector_pseudoclass_position_match (const GtkCssSelector *selector, - const GtkCssMatcher *matcher) +get_position_match (const GtkCssSelector *selector, + const GtkCssMatcher *matcher) { - const GtkCssSelector *previous; PositionType type; int a, b; - previous = gtk_css_selector_previous (selector); - if (previous && previous->class == >K_CSS_SELECTOR_REGION) - return gtk_css_selector_pseudoclass_position_match_for_region (selector, matcher); - decode_position (selector, &type, &a, &b); switch (type) { @@ -1097,6 +1103,22 @@ gtk_css_selector_pseudoclass_position_match (const GtkCssSelector *selector, return FALSE; } + return TRUE; +} + +static gboolean +gtk_css_selector_pseudoclass_position_match (const GtkCssSelector *selector, + const GtkCssMatcher *matcher) +{ + const GtkCssSelector *previous; + + previous = gtk_css_selector_previous (selector); + if (previous && previous->class == >K_CSS_SELECTOR_REGION) + return gtk_css_selector_pseudoclass_position_match_for_region (selector, matcher); + + if (!get_position_match (selector, matcher)) + return FALSE; + return gtk_css_selector_match (previous, matcher); } @@ -1108,38 +1130,9 @@ gtk_css_selector_pseudoclass_position_tree_match_for_region (const GtkCssSelecto { const GtkCssSelectorTree *prev2; GtkRegionFlags selector_flags; - PositionType type; - int a, b; - decode_position (&tree->selector, &type, &a, &b); - switch (type) - { - case POSITION_FORWARD: - if (a == 0 && b == 1) - selector_flags = GTK_REGION_FIRST; - else if (a == 2 && b == 0) - selector_flags = GTK_REGION_EVEN; - else if (a == 2 && b == 1) - selector_flags = GTK_REGION_ODD; - else - return; - break; - case POSITION_BACKWARD: - if (a == 0 && b == 1) - selector_flags = GTK_REGION_LAST; - else - return; - break; - case POSITION_ONLY: - selector_flags = GTK_REGION_ONLY; - break; - case POSITION_SORTED: - selector_flags = GTK_REGION_SORTED; - break; - default: - g_assert_not_reached (); - break; - } + if (!get_selector_flags_for_position_region_match (&tree->selector, &selector_flags)) + return; if (!_gtk_css_matcher_has_region (matcher, prev->selector.data, selector_flags)) return; @@ -1162,8 +1155,6 @@ gtk_css_selector_pseudoclass_position_tree_match (const GtkCssSelectorTree *tree GHashTable *res) { const GtkCssSelectorTree *prev; - PositionType type; - int a, b; for (prev = gtk_css_selector_tree_get_previous (tree); prev != NULL; @@ -1173,28 +1164,8 @@ gtk_css_selector_pseudoclass_position_tree_match (const GtkCssSelectorTree *tree gtk_css_selector_pseudoclass_position_tree_match_for_region (tree, prev, matcher, res); } - decode_position (&tree->selector, &type, &a, &b); - switch (type) - { - case POSITION_FORWARD: - if (!_gtk_css_matcher_has_position (matcher, TRUE, a, b)) - return; - break; - case POSITION_BACKWARD: - if (!_gtk_css_matcher_has_position (matcher, FALSE, a, b)) - return; - break; - case POSITION_ONLY: - if (!_gtk_css_matcher_has_position (matcher, TRUE, 0, 1) || - !_gtk_css_matcher_has_position (matcher, FALSE, 0, 1)) - return; - break; - case POSITION_SORTED: - return; - default: - g_assert_not_reached (); - return; - } + if (!get_position_match (&tree->selector, matcher)) + return; gtk_css_selector_tree_found_match (tree, res); |