guint increase_class_specificity :1;
guint increase_element_specificity :1;
guint is_simple :1;
+ guint must_keep_order :1; /* Due to region weirdness these must be kept before a DESCENDANT, so don't reorder */
};
struct _GtkCssSelector
gtk_css_selector_descendant_match,
gtk_css_selector_descendant_tree_match,
gtk_css_selector_descendant_get_change,
- FALSE, FALSE, FALSE, FALSE
+ FALSE, FALSE, FALSE, FALSE, FALSE
};
/* CHILD */
gtk_css_selector_child_match,
gtk_css_selector_child_tree_match,
gtk_css_selector_child_get_change,
- FALSE, FALSE, FALSE, FALSE
+ FALSE, FALSE, FALSE, FALSE, FALSE
};
/* SIBLING */
gtk_css_selector_sibling_match,
gtk_css_selector_sibling_tree_match,
gtk_css_selector_sibling_get_change,
- FALSE, FALSE, FALSE, FALSE
+ FALSE, FALSE, FALSE, FALSE, FALSE
};
/* ADJACENT */
gtk_css_selector_adjacent_match,
gtk_css_selector_adjacent_tree_match,
gtk_css_selector_adjacent_get_change,
- FALSE, FALSE, FALSE, FALSE
+ FALSE, FALSE, FALSE, FALSE, FALSE
};
/* ANY */
gtk_css_selector_any_match,
gtk_css_selector_any_tree_match,
gtk_css_selector_any_get_change,
- FALSE, FALSE, FALSE, TRUE
+ FALSE, FALSE, FALSE, TRUE, TRUE
};
/* NAME */
gtk_css_selector_name_match,
gtk_css_selector_name_tree_match,
gtk_css_selector_name_get_change,
- FALSE, FALSE, TRUE, TRUE
+ FALSE, FALSE, TRUE, TRUE, FALSE
};
/* REGION */
gtk_css_selector_region_match,
gtk_css_selector_region_tree_match,
gtk_css_selector_region_get_change,
- FALSE, FALSE, TRUE, TRUE
+ FALSE, FALSE, TRUE, TRUE, TRUE
};
/* CLASS */
gtk_css_selector_class_match,
gtk_css_selector_class_tree_match,
gtk_css_selector_class_get_change,
- FALSE, TRUE, FALSE, TRUE
+ FALSE, TRUE, FALSE, TRUE, FALSE
};
/* ID */
gtk_css_selector_id_match,
gtk_css_selector_id_tree_match,
gtk_css_selector_id_get_change,
- TRUE, FALSE, FALSE, TRUE
+ TRUE, FALSE, FALSE, TRUE, FALSE
};
/* PSEUDOCLASS FOR STATE */
gtk_css_selector_pseudoclass_state_match,
gtk_css_selector_pseudoclass_state_tree_match,
gtk_css_selector_pseudoclass_state_get_change,
- FALSE, TRUE, FALSE, TRUE
+ FALSE, TRUE, FALSE, TRUE, FALSE
};
/* PSEUDOCLASS FOR POSITION */
gtk_css_selector_pseudoclass_position_match,
gtk_css_selector_pseudoclass_position_tree_match,
gtk_css_selector_pseudoclass_position_get_change,
- FALSE, TRUE, FALSE, TRUE
+ FALSE, TRUE, FALSE, TRUE, TRUE
};
/* API */
static void
gtk_css_selectors_count_initial (const GtkCssSelector *selector, GHashTable *hash)
{
- if (!selector->class->is_simple)
+ if (!selector->class->is_simple || selector->class->must_keep_order)
{
guint count = GPOINTER_TO_INT (g_hash_table_lookup (hash, selector));
g_hash_table_replace (hash, (gpointer)selector, GUINT_TO_POINTER (count + 1));
return;
}
- for (; selector && selector->class->is_simple; selector = gtk_css_selector_previous (selector))
+ for (;
+ selector && selector->class->is_simple && !selector->class->must_keep_order;
+ selector = gtk_css_selector_previous (selector))
{
guint count = GPOINTER_TO_INT (g_hash_table_lookup (hash, selector));
g_hash_table_replace (hash, (gpointer)selector, GUINT_TO_POINTER (count + 1));
static gboolean
gtk_css_selectors_has_initial_selector (const GtkCssSelector *selector, const GtkCssSelector *initial)
{
- if (!selector->class->is_simple)
+ if (!selector->class->is_simple || selector->class->must_keep_order)
return gtk_css_selector_equal (selector, initial);
- for (; selector && selector->class->is_simple; selector = gtk_css_selector_previous (selector))
+ for (;
+ selector && selector->class->is_simple && !selector->class->must_keep_order;
+ selector = gtk_css_selector_previous (selector))
{
if (gtk_css_selector_equal (selector, initial))
return TRUE;