[gtk+/nth-child: 23/33] css: Match pseudo-classes for siblings



commit 33ad90c875dfb8521993818adebafb8212727aef
Author: Benjamin Otte <otte redhat com>
Date:   Wed May 25 20:05:55 2011 +0200

    css: Match pseudo-classes for siblings

 gtk/gtkcssselector.c |   35 ++++++++++++++++++++++++++++++++---
 1 files changed, 32 insertions(+), 3 deletions(-)
---
diff --git a/gtk/gtkcssselector.c b/gtk/gtkcssselector.c
index d0397a6..d300d41 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;
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]