[gtk+/wip/css-optimize: 1/6] CSS: Join multiple adjacent pseudoclass selectors
- From: Alexander Larsson <alexl src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+/wip/css-optimize: 1/6] CSS: Join multiple adjacent pseudoclass selectors
- Date: Fri, 23 Nov 2012 15:27:19 +0000 (UTC)
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 (>K_CSS_SELECTOR_PSEUDOCLASS_STATE,
- selector,
- GUINT_TO_POINTER (pseudo_classes[i].state_flag));
+ {
+ /* Piggy back on previous pseudoclass if any */
+ if (selector && selector->class == >K_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 (>K_CSS_SELECTOR_PSEUDOCLASS_STATE,
+ selector,
+ GUINT_TO_POINTER (pseudo_classes[i].state_flag));
+ }
else
selector = gtk_css_selector_new (>K_CSS_SELECTOR_PSEUDOCLASS_POSITION,
selector,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]