summaryrefslogtreecommitdiff
path: root/gtk
diff options
context:
space:
mode:
authorBenjamin Otte <otte@redhat.com>2011-05-25 20:05:55 +0200
committerBenjamin Otte <otte@redhat.com>2011-06-02 02:03:51 +0200
commit0d69d9558e17913aef203768881060c07c3dbc20 (patch)
tree43b4cbfb1ba0b96c947004607dcaef4baca48c6e /gtk
parentcd838480eb01ad8a9185cb1d407088b7eb34d926 (diff)
downloadgtk+-0d69d9558e17913aef203768881060c07c3dbc20.tar.gz
css: Match pseudo-classes for siblings
Diffstat (limited to 'gtk')
-rw-r--r--gtk/gtkcssselector.c35
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;