[gtk+/wip/css-optimize: 1/6] CSS: Join multiple adjacent pseudoclass selectors



commit b70d8c477d389d6f4a83e429b981a9794ddfe1a5
Author: Alexander Larsson <alexl redhat com>
Date:   Fri Nov 23 09:42:10 2012 +0100

    CSS: Join multiple adjacent pseudoclass selectors
    
    Its pretty common to have a selector like :selected:active where
    two or more state flags appear in a row. Right now we save
    these as multiple GtkCssSelectors, but as state is a bitfield we
    can easily join them. We do this in the simple case where the
    state matchers are directly adjacent by just piggybacking on
    a previous pseudoclass if there is one.

 gtk/gtkcssselector.c |   18 +++++++++++-------
 1 files changed, 11 insertions(+), 7 deletions(-)
---
diff --git a/gtk/gtkcssselector.c b/gtk/gtkcssselector.c
index c124bcf..999d3b5 100644
--- a/gtk/gtkcssselector.c
+++ b/gtk/gtkcssselector.c
@@ -430,18 +430,15 @@ gtk_css_selector_pseudoclass_state_print (const GtkCssSelector *selector,
   guint i, state;
 
   state = GPOINTER_TO_UINT (selector->data);
-  g_string_append_c (string, ':');
 
   for (i = 0; i < G_N_ELEMENTS (state_names); i++)
     {
       if (state == (1 << i))
         {
+	  g_string_append_c (string, ':');
           g_string_append (string, state_names[i]);
-          return;
         }
     }
-
-  g_assert_not_reached ();
 }
 
 static gboolean
@@ -950,9 +947,16 @@ parse_selector_pseudo_class (GtkCssParser   *parser,
       if (_gtk_css_parser_try (parser, pseudo_classes[i].name, FALSE))
         {
           if (pseudo_classes[i].state_flag)
-            selector = gtk_css_selector_new (&GTK_CSS_SELECTOR_PSEUDOCLASS_STATE,
-                                             selector,
-                                             GUINT_TO_POINTER (pseudo_classes[i].state_flag));
+	    {
+	      /* Piggy back on previous pseudoclass if any */
+	      if (selector && selector->class == &GTK_CSS_SELECTOR_PSEUDOCLASS_STATE)
+		selector->data = GUINT_TO_POINTER (GPOINTER_TO_UINT (selector->data) |
+						   pseudo_classes[i].state_flag);
+	      else
+		selector = gtk_css_selector_new (&GTK_CSS_SELECTOR_PSEUDOCLASS_STATE,
+						 selector,
+						 GUINT_TO_POINTER (pseudo_classes[i].state_flag));
+	    }
           else
             selector = gtk_css_selector_new (&GTK_CSS_SELECTOR_PSEUDOCLASS_POSITION,
                                              selector,



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