diff options
author | Benjamin Otte <otte@redhat.com> | 2011-05-25 20:05:55 +0200 |
---|---|---|
committer | Benjamin Otte <otte@redhat.com> | 2011-06-02 02:03:51 +0200 |
commit | 0d69d9558e17913aef203768881060c07c3dbc20 (patch) | |
tree | 43b4cbfb1ba0b96c947004607dcaef4baca48c6e /gtk | |
parent | cd838480eb01ad8a9185cb1d407088b7eb34d926 (diff) | |
download | gtk+-0d69d9558e17913aef203768881060c07c3dbc20.tar.gz |
css: Match pseudo-classes for siblings
Diffstat (limited to 'gtk')
-rw-r--r-- | gtk/gtkcssselector.c | 35 |
1 files changed, 32 insertions, 3 deletions
diff --git a/gtk/gtkcssselector.c b/gtk/gtkcssselector.c index d0397a66d8..d300d41baa 100644 --- a/gtk/gtkcssselector.c +++ b/gtk/gtkcssselector.c @@ -181,17 +181,46 @@ _gtk_css_selector_to_string (const GtkCssSelector *selector) return g_string_free (string, FALSE); } +static GtkRegionFlags +compute_region_flags_for_index (const GtkWidgetPath *path, + guint id) +{ + const GtkWidgetPath *siblings; + guint sibling_id, n_siblings; + GtkRegionFlags flags; + + siblings = gtk_widget_path_iter_get_siblings (path, id); + if (siblings == NULL) + return 0; + + sibling_id = gtk_widget_path_iter_get_sibling_index (path, id); + n_siblings = gtk_widget_path_length (siblings); + + flags = (sibling_id % 2) ? GTK_REGION_EVEN : GTK_REGION_ODD; + if (sibling_id == 0) + flags |= GTK_REGION_FIRST; + if (sibling_id + 1 == n_siblings) + flags |= GTK_REGION_LAST; + + return flags; +} + static gboolean gtk_css_selector_matches_type (const GtkCssSelector *selector, const GtkWidgetPath *path, guint id) { + if (selector->pseudo_classes) + { + GtkRegionFlags flags = compute_region_flags_for_index (path, id); + + if ((selector->pseudo_classes & flags) != selector->pseudo_classes) + return FALSE; + } + if (selector->name == NULL) return TRUE; - if (selector->pseudo_classes) - return FALSE; - if (selector->type == G_TYPE_NONE) return FALSE; |