From 0d69d9558e17913aef203768881060c07c3dbc20 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Wed, 25 May 2011 20:05:55 +0200 Subject: [PATCH] css: Match pseudo-classes for siblings --- gtk/gtkcssselector.c | 35 ++++++++++++++++++++++++++++++++--- 1 file 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;