Compare commits
5 Commits
css-variab
...
redo-super
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e16a3b6232 | ||
|
|
20dddd83d6 | ||
|
|
6cc5331e6b | ||
|
|
ee2b1601ff | ||
|
|
2c317b99a2 |
@@ -398,173 +398,3 @@ _gtk_css_matcher_node_init (GtkCssMatcher *matcher,
|
|||||||
matcher->node.classes = gtk_css_node_declaration_get_classes (gtk_css_node_get_declaration (node),
|
matcher->node.classes = gtk_css_node_declaration_get_classes (gtk_css_node_get_declaration (node),
|
||||||
&matcher->node.n_classes);
|
&matcher->node.n_classes);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* GTK_CSS_MATCHER_ANY */
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
gtk_css_matcher_any_get_parent (GtkCssMatcher *matcher,
|
|
||||||
const GtkCssMatcher *child)
|
|
||||||
{
|
|
||||||
_gtk_css_matcher_any_init (matcher);
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
gtk_css_matcher_any_get_previous (GtkCssMatcher *matcher,
|
|
||||||
const GtkCssMatcher *next)
|
|
||||||
{
|
|
||||||
_gtk_css_matcher_any_init (matcher);
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
gtk_css_matcher_any_has_state (const GtkCssMatcher *matcher,
|
|
||||||
GtkStateFlags state)
|
|
||||||
{
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
gtk_css_matcher_any_has_name (const GtkCssMatcher *matcher,
|
|
||||||
/*interned*/ const char *name)
|
|
||||||
{
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
gtk_css_matcher_any_has_class (const GtkCssMatcher *matcher,
|
|
||||||
GQuark class_name)
|
|
||||||
{
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
gtk_css_matcher_any_has_id (const GtkCssMatcher *matcher,
|
|
||||||
const char *id)
|
|
||||||
{
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
gtk_css_matcher_any_has_position (const GtkCssMatcher *matcher,
|
|
||||||
gboolean forward,
|
|
||||||
int a,
|
|
||||||
int b)
|
|
||||||
{
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
gtk_css_matcher_any_print (const GtkCssMatcher *matcher,
|
|
||||||
GString *string)
|
|
||||||
{
|
|
||||||
g_string_append (string, "ANY");
|
|
||||||
}
|
|
||||||
|
|
||||||
static const GtkCssMatcherClass GTK_CSS_MATCHER_ANY = {
|
|
||||||
GTK_CSS_MATCHER_TYPE_ANY,
|
|
||||||
gtk_css_matcher_any_get_parent,
|
|
||||||
gtk_css_matcher_any_get_previous,
|
|
||||||
gtk_css_matcher_any_has_state,
|
|
||||||
gtk_css_matcher_any_has_name,
|
|
||||||
gtk_css_matcher_any_has_class,
|
|
||||||
gtk_css_matcher_any_has_id,
|
|
||||||
gtk_css_matcher_any_has_position,
|
|
||||||
gtk_css_matcher_any_print
|
|
||||||
};
|
|
||||||
|
|
||||||
void
|
|
||||||
_gtk_css_matcher_any_init (GtkCssMatcher *matcher)
|
|
||||||
{
|
|
||||||
matcher->klass = >K_CSS_MATCHER_ANY;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* GTK_CSS_MATCHER_SUPERSET */
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
gtk_css_matcher_superset_get_parent (GtkCssMatcher *matcher,
|
|
||||||
const GtkCssMatcher *child)
|
|
||||||
{
|
|
||||||
_gtk_css_matcher_any_init (matcher);
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
gtk_css_matcher_superset_get_previous (GtkCssMatcher *matcher,
|
|
||||||
const GtkCssMatcher *next)
|
|
||||||
{
|
|
||||||
_gtk_css_matcher_any_init (matcher);
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
gtk_css_matcher_superset_has_state (const GtkCssMatcher *matcher,
|
|
||||||
GtkStateFlags state)
|
|
||||||
{
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
gtk_css_matcher_superset_has_name (const GtkCssMatcher *matcher,
|
|
||||||
/*interned*/ const char *name)
|
|
||||||
{
|
|
||||||
return _gtk_css_matcher_has_name (matcher->superset.subset, name);
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
gtk_css_matcher_superset_has_class (const GtkCssMatcher *matcher,
|
|
||||||
GQuark class_name)
|
|
||||||
{
|
|
||||||
return _gtk_css_matcher_has_class (matcher->superset.subset, class_name);
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
gtk_css_matcher_superset_has_id (const GtkCssMatcher *matcher,
|
|
||||||
const char *id)
|
|
||||||
{
|
|
||||||
return _gtk_css_matcher_has_id (matcher->superset.subset, id);
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
gtk_css_matcher_superset_has_position (const GtkCssMatcher *matcher,
|
|
||||||
gboolean forward,
|
|
||||||
int a,
|
|
||||||
int b)
|
|
||||||
{
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
gtk_css_matcher_superset_print (const GtkCssMatcher *matcher,
|
|
||||||
GString *string)
|
|
||||||
{
|
|
||||||
g_string_append (string, "SUPERSET(");
|
|
||||||
gtk_css_matcher_print (matcher->superset.subset, string);
|
|
||||||
g_string_append (string, ")");
|
|
||||||
}
|
|
||||||
|
|
||||||
static const GtkCssMatcherClass GTK_CSS_MATCHER_SUPERSET = {
|
|
||||||
GTK_CSS_MATCHER_TYPE_SUPERSET,
|
|
||||||
gtk_css_matcher_superset_get_parent,
|
|
||||||
gtk_css_matcher_superset_get_previous,
|
|
||||||
gtk_css_matcher_superset_has_state,
|
|
||||||
gtk_css_matcher_superset_has_name,
|
|
||||||
gtk_css_matcher_superset_has_class,
|
|
||||||
gtk_css_matcher_superset_has_id,
|
|
||||||
gtk_css_matcher_superset_has_position,
|
|
||||||
gtk_css_matcher_superset_print
|
|
||||||
};
|
|
||||||
|
|
||||||
void
|
|
||||||
_gtk_css_matcher_superset_init (GtkCssMatcher *matcher,
|
|
||||||
const GtkCssMatcher *subset)
|
|
||||||
{
|
|
||||||
g_return_if_fail (subset != NULL);
|
|
||||||
|
|
||||||
matcher->superset.klass = >K_CSS_MATCHER_SUPERSET;
|
|
||||||
matcher->superset.subset = subset;
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -31,9 +31,7 @@ typedef struct _GtkCssMatcherClass GtkCssMatcherClass;
|
|||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
GTK_CSS_MATCHER_TYPE_NODE,
|
GTK_CSS_MATCHER_TYPE_NODE,
|
||||||
GTK_CSS_MATCHER_TYPE_WIDGET_PATH,
|
GTK_CSS_MATCHER_TYPE_WIDGET_PATH
|
||||||
GTK_CSS_MATCHER_TYPE_ANY,
|
|
||||||
GTK_CSS_MATCHER_TYPE_SUPERSET
|
|
||||||
} GtkCssMatcherType;
|
} GtkCssMatcherType;
|
||||||
|
|
||||||
struct _GtkCssMatcherClass {
|
struct _GtkCssMatcherClass {
|
||||||
@@ -77,16 +75,10 @@ struct _GtkCssMatcherNode {
|
|||||||
guint n_classes;
|
guint n_classes;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _GtkCssMatcherSuperset {
|
|
||||||
const GtkCssMatcherClass *klass;
|
|
||||||
const GtkCssMatcher *subset;
|
|
||||||
};
|
|
||||||
|
|
||||||
union _GtkCssMatcher {
|
union _GtkCssMatcher {
|
||||||
const GtkCssMatcherClass *klass;
|
const GtkCssMatcherClass *klass;
|
||||||
GtkCssMatcherWidgetPath path;
|
GtkCssMatcherWidgetPath path;
|
||||||
GtkCssMatcherNode node;
|
GtkCssMatcherNode node;
|
||||||
GtkCssMatcherSuperset superset;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
gboolean _gtk_css_matcher_init (GtkCssMatcher *matcher,
|
gboolean _gtk_css_matcher_init (GtkCssMatcher *matcher,
|
||||||
@@ -94,9 +86,6 @@ gboolean _gtk_css_matcher_init (GtkCssMatcher *match
|
|||||||
const GtkCssNodeDeclaration *decl) G_GNUC_WARN_UNUSED_RESULT;
|
const GtkCssNodeDeclaration *decl) G_GNUC_WARN_UNUSED_RESULT;
|
||||||
void _gtk_css_matcher_node_init (GtkCssMatcher *matcher,
|
void _gtk_css_matcher_node_init (GtkCssMatcher *matcher,
|
||||||
GtkCssNode *node);
|
GtkCssNode *node);
|
||||||
void _gtk_css_matcher_any_init (GtkCssMatcher *matcher);
|
|
||||||
void _gtk_css_matcher_superset_init (GtkCssMatcher *matcher,
|
|
||||||
const GtkCssMatcher *subset);
|
|
||||||
|
|
||||||
void gtk_css_matcher_print (const GtkCssMatcher *matcher,
|
void gtk_css_matcher_print (const GtkCssMatcher *matcher,
|
||||||
GString *string);
|
GString *string);
|
||||||
@@ -154,12 +143,6 @@ _gtk_css_matcher_has_position (const GtkCssMatcher *matcher,
|
|||||||
return matcher->klass->has_position (matcher, forward, a, b);
|
return matcher->klass->has_position (matcher, forward, a, b);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline gboolean
|
|
||||||
_gtk_css_matcher_matches_any (const GtkCssMatcher *matcher)
|
|
||||||
{
|
|
||||||
return matcher->klass->type == GTK_CSS_MATCHER_TYPE_ANY;
|
|
||||||
}
|
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
#endif /* __GTK_CSS_MATCHER_PRIVATE_H__ */
|
#endif /* __GTK_CSS_MATCHER_PRIVATE_H__ */
|
||||||
|
|||||||
@@ -425,41 +425,6 @@ verify_tree_match_results (GtkCssProvider *provider,
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Compute the change flags for a given matcher.
|
|
||||||
* We assume that name, id and classes stay unchanged, and look for all rules
|
|
||||||
* that can be matched if anything else changes. We collect the change masks
|
|
||||||
* from the selectors of these rules.
|
|
||||||
*/
|
|
||||||
static GtkCssChange
|
|
||||||
compute_change (GtkCssProvider *provider,
|
|
||||||
const GtkCssMatcher *matcher)
|
|
||||||
{
|
|
||||||
GtkCssProviderPrivate *priv = gtk_css_provider_get_instance_private (provider);
|
|
||||||
GtkCssChange change = 0;
|
|
||||||
GPtrArray *tree_rules;
|
|
||||||
int i;
|
|
||||||
GtkCssMatcher change_matcher;
|
|
||||||
|
|
||||||
_gtk_css_matcher_superset_init (&change_matcher, matcher);
|
|
||||||
|
|
||||||
tree_rules = _gtk_css_selector_tree_match_all (priv->tree, &change_matcher);
|
|
||||||
if (tree_rules)
|
|
||||||
{
|
|
||||||
for (i = tree_rules->len - 1; i >= 0; i--)
|
|
||||||
{
|
|
||||||
GtkCssRuleset *ruleset;
|
|
||||||
|
|
||||||
ruleset = tree_rules->pdata[i];
|
|
||||||
|
|
||||||
change |= _gtk_css_selector_get_change (ruleset->selector);
|
|
||||||
}
|
|
||||||
|
|
||||||
g_ptr_array_free (tree_rules, TRUE);
|
|
||||||
}
|
|
||||||
|
|
||||||
return change;
|
|
||||||
}
|
|
||||||
|
|
||||||
static GtkCssValue *
|
static GtkCssValue *
|
||||||
gtk_css_style_provider_get_color (GtkStyleProvider *provider,
|
gtk_css_style_provider_get_color (GtkStyleProvider *provider,
|
||||||
const char *name)
|
const char *name)
|
||||||
@@ -530,7 +495,7 @@ gtk_css_style_provider_lookup (GtkStyleProvider *provider,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (change)
|
if (change)
|
||||||
*change = compute_change (css_provider, matcher);
|
*change = _gtk_css_selector_tree_get_change_all (priv->tree, matcher);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|||||||
@@ -62,7 +62,8 @@ struct _GtkCssSelectorClass {
|
|||||||
int (* compare_one) (const GtkCssSelector *a,
|
int (* compare_one) (const GtkCssSelector *a,
|
||||||
const GtkCssSelector *b);
|
const GtkCssSelector *b);
|
||||||
|
|
||||||
guint is_simple :1;
|
guint is_simple : 1;
|
||||||
|
guint ignore_for_change : 1;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
@@ -294,11 +295,6 @@ gtk_css_selector_descendant_foreach_matcher (const GtkCssSelector *selector
|
|||||||
|
|
||||||
if (func (selector, &ancestor, data))
|
if (func (selector, &ancestor, data))
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
/* any matchers are dangerous here, as we may loop forever, but
|
|
||||||
we can terminate now as all possible matches have already been added */
|
|
||||||
if (_gtk_css_matcher_matches_any (matcher))
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
@@ -319,7 +315,8 @@ static const GtkCssSelectorClass GTK_CSS_SELECTOR_DESCENDANT = {
|
|||||||
gtk_css_selector_default_add_specificity,
|
gtk_css_selector_default_add_specificity,
|
||||||
gtk_css_selector_default_hash_one,
|
gtk_css_selector_default_hash_one,
|
||||||
gtk_css_selector_default_compare_one,
|
gtk_css_selector_default_compare_one,
|
||||||
FALSE
|
FALSE,
|
||||||
|
TRUE
|
||||||
};
|
};
|
||||||
|
|
||||||
/* CHILD */
|
/* CHILD */
|
||||||
@@ -360,7 +357,8 @@ static const GtkCssSelectorClass GTK_CSS_SELECTOR_CHILD = {
|
|||||||
gtk_css_selector_default_add_specificity,
|
gtk_css_selector_default_add_specificity,
|
||||||
gtk_css_selector_default_hash_one,
|
gtk_css_selector_default_hash_one,
|
||||||
gtk_css_selector_default_compare_one,
|
gtk_css_selector_default_compare_one,
|
||||||
FALSE
|
FALSE,
|
||||||
|
TRUE
|
||||||
};
|
};
|
||||||
|
|
||||||
/* SIBLING */
|
/* SIBLING */
|
||||||
@@ -386,11 +384,6 @@ gtk_css_selector_sibling_foreach_matcher (const GtkCssSelector *selector,
|
|||||||
|
|
||||||
if (func (selector, matcher, data))
|
if (func (selector, matcher, data))
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
/* any matchers are dangerous here, as we may loop forever, but
|
|
||||||
we can terminate now as all possible matches have already been added */
|
|
||||||
if (_gtk_css_matcher_matches_any (matcher))
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
@@ -411,7 +404,8 @@ static const GtkCssSelectorClass GTK_CSS_SELECTOR_SIBLING = {
|
|||||||
gtk_css_selector_default_add_specificity,
|
gtk_css_selector_default_add_specificity,
|
||||||
gtk_css_selector_default_hash_one,
|
gtk_css_selector_default_hash_one,
|
||||||
gtk_css_selector_default_compare_one,
|
gtk_css_selector_default_compare_one,
|
||||||
FALSE
|
FALSE,
|
||||||
|
TRUE
|
||||||
};
|
};
|
||||||
|
|
||||||
/* ADJACENT */
|
/* ADJACENT */
|
||||||
@@ -452,7 +446,8 @@ static const GtkCssSelectorClass GTK_CSS_SELECTOR_ADJACENT = {
|
|||||||
gtk_css_selector_default_add_specificity,
|
gtk_css_selector_default_add_specificity,
|
||||||
gtk_css_selector_default_hash_one,
|
gtk_css_selector_default_hash_one,
|
||||||
gtk_css_selector_default_compare_one,
|
gtk_css_selector_default_compare_one,
|
||||||
FALSE
|
FALSE,
|
||||||
|
TRUE
|
||||||
};
|
};
|
||||||
|
|
||||||
/* SIMPLE SELECTOR DEFINE */
|
/* SIMPLE SELECTOR DEFINE */
|
||||||
@@ -465,7 +460,8 @@ static const GtkCssSelectorClass GTK_CSS_SELECTOR_ADJACENT = {
|
|||||||
comp_func, \
|
comp_func, \
|
||||||
increase_id_specificity, \
|
increase_id_specificity, \
|
||||||
increase_class_specificity, \
|
increase_class_specificity, \
|
||||||
increase_element_specificity) \
|
increase_element_specificity, \
|
||||||
|
ignore_for_change) \
|
||||||
static void \
|
static void \
|
||||||
gtk_css_selector_ ## n ## _print (const GtkCssSelector *selector, \
|
gtk_css_selector_ ## n ## _print (const GtkCssSelector *selector, \
|
||||||
GString *string) \
|
GString *string) \
|
||||||
@@ -524,7 +520,8 @@ static const GtkCssSelectorClass GTK_CSS_SELECTOR_ ## c = { \
|
|||||||
gtk_css_selector_ ## n ## _add_specificity, \
|
gtk_css_selector_ ## n ## _add_specificity, \
|
||||||
hash_func, \
|
hash_func, \
|
||||||
comp_func, \
|
comp_func, \
|
||||||
TRUE \
|
TRUE, \
|
||||||
|
ignore_for_change \
|
||||||
};\
|
};\
|
||||||
\
|
\
|
||||||
static const GtkCssSelectorClass GTK_CSS_SELECTOR_NOT_ ## c = { \
|
static const GtkCssSelectorClass GTK_CSS_SELECTOR_NOT_ ## c = { \
|
||||||
@@ -536,7 +533,8 @@ static const GtkCssSelectorClass GTK_CSS_SELECTOR_NOT_ ## c = { \
|
|||||||
gtk_css_selector_ ## n ## _add_specificity, \
|
gtk_css_selector_ ## n ## _add_specificity, \
|
||||||
hash_func, \
|
hash_func, \
|
||||||
comp_func, \
|
comp_func, \
|
||||||
TRUE \
|
TRUE, \
|
||||||
|
ignore_for_change \
|
||||||
};
|
};
|
||||||
|
|
||||||
/* ANY */
|
/* ANY */
|
||||||
@@ -559,7 +557,7 @@ match_any (const GtkCssSelector *selector,
|
|||||||
#define GTK_CSS_CHANGE_ANY 0
|
#define GTK_CSS_CHANGE_ANY 0
|
||||||
DEFINE_SIMPLE_SELECTOR(any, ANY, print_any, match_any,
|
DEFINE_SIMPLE_SELECTOR(any, ANY, print_any, match_any,
|
||||||
gtk_css_selector_default_hash_one, gtk_css_selector_default_compare_one,
|
gtk_css_selector_default_hash_one, gtk_css_selector_default_compare_one,
|
||||||
FALSE, FALSE, FALSE)
|
FALSE, FALSE, FALSE, TRUE)
|
||||||
#undef GTK_CSS_CHANGE_ANY
|
#undef GTK_CSS_CHANGE_ANY
|
||||||
|
|
||||||
/* NAME */
|
/* NAME */
|
||||||
@@ -592,7 +590,7 @@ comp_name (const GtkCssSelector *a,
|
|||||||
b->name.name);
|
b->name.name);
|
||||||
}
|
}
|
||||||
|
|
||||||
DEFINE_SIMPLE_SELECTOR(name, NAME, print_name, match_name, hash_name, comp_name, FALSE, FALSE, TRUE)
|
DEFINE_SIMPLE_SELECTOR(name, NAME, print_name, match_name, hash_name, comp_name, FALSE, FALSE, TRUE, FALSE)
|
||||||
|
|
||||||
/* CLASS */
|
/* CLASS */
|
||||||
|
|
||||||
@@ -629,7 +627,7 @@ comp_class (const GtkCssSelector *a,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
DEFINE_SIMPLE_SELECTOR(class, CLASS, print_class, match_class, hash_class, comp_class, FALSE, TRUE, FALSE)
|
DEFINE_SIMPLE_SELECTOR(class, CLASS, print_class, match_class, hash_class, comp_class, FALSE, TRUE, FALSE, FALSE)
|
||||||
|
|
||||||
/* ID */
|
/* ID */
|
||||||
|
|
||||||
@@ -666,7 +664,7 @@ comp_id (const GtkCssSelector *a,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
DEFINE_SIMPLE_SELECTOR(id, ID, print_id, match_id, hash_id, comp_id, TRUE, FALSE, FALSE)
|
DEFINE_SIMPLE_SELECTOR(id, ID, print_id, match_id, hash_id, comp_id, TRUE, FALSE, FALSE, FALSE)
|
||||||
|
|
||||||
const gchar *
|
const gchar *
|
||||||
gtk_css_pseudoclass_name (GtkStateFlags state)
|
gtk_css_pseudoclass_name (GtkStateFlags state)
|
||||||
@@ -731,31 +729,31 @@ comp_pseudoclass_state (const GtkCssSelector *a,
|
|||||||
#define GTK_CSS_CHANGE_PSEUDOCLASS_HOVER GTK_CSS_CHANGE_HOVER
|
#define GTK_CSS_CHANGE_PSEUDOCLASS_HOVER GTK_CSS_CHANGE_HOVER
|
||||||
DEFINE_SIMPLE_SELECTOR(pseudoclass_hover, PSEUDOCLASS_HOVER, print_pseudoclass_state,
|
DEFINE_SIMPLE_SELECTOR(pseudoclass_hover, PSEUDOCLASS_HOVER, print_pseudoclass_state,
|
||||||
match_pseudoclass_state, hash_pseudoclass_state, comp_pseudoclass_state,
|
match_pseudoclass_state, hash_pseudoclass_state, comp_pseudoclass_state,
|
||||||
FALSE, TRUE, FALSE)
|
FALSE, TRUE, FALSE, TRUE)
|
||||||
#undef GTK_CSS_CHANGE_PSEUDOCLASS_HOVER
|
#undef GTK_CSS_CHANGE_PSEUDOCLASS_HOVER
|
||||||
|
|
||||||
#define GTK_CSS_CHANGE_PSEUDOCLASS_DISABLED GTK_CSS_CHANGE_DISABLED
|
#define GTK_CSS_CHANGE_PSEUDOCLASS_DISABLED GTK_CSS_CHANGE_DISABLED
|
||||||
DEFINE_SIMPLE_SELECTOR(pseudoclass_disabled, PSEUDOCLASS_DISABLED, print_pseudoclass_state,
|
DEFINE_SIMPLE_SELECTOR(pseudoclass_disabled, PSEUDOCLASS_DISABLED, print_pseudoclass_state,
|
||||||
match_pseudoclass_state, hash_pseudoclass_state, comp_pseudoclass_state,
|
match_pseudoclass_state, hash_pseudoclass_state, comp_pseudoclass_state,
|
||||||
FALSE, TRUE, FALSE)
|
FALSE, TRUE, FALSE, TRUE)
|
||||||
#undef GTK_CSS_CHANGE_PSEUDOCLASS_DISABLED
|
#undef GTK_CSS_CHANGE_PSEUDOCLASS_DISABLED
|
||||||
|
|
||||||
#define GTK_CSS_CHANGE_PSEUDOCLASS_BACKDROP GTK_CSS_CHANGE_BACKDROP
|
#define GTK_CSS_CHANGE_PSEUDOCLASS_BACKDROP GTK_CSS_CHANGE_BACKDROP
|
||||||
DEFINE_SIMPLE_SELECTOR(pseudoclass_backdrop, PSEUDOCLASS_BACKDROP, print_pseudoclass_state,
|
DEFINE_SIMPLE_SELECTOR(pseudoclass_backdrop, PSEUDOCLASS_BACKDROP, print_pseudoclass_state,
|
||||||
match_pseudoclass_state, hash_pseudoclass_state, comp_pseudoclass_state,
|
match_pseudoclass_state, hash_pseudoclass_state, comp_pseudoclass_state,
|
||||||
FALSE, TRUE, FALSE)
|
FALSE, TRUE, FALSE, TRUE)
|
||||||
#undef GTK_CSS_CHANGE_PSEUDOCLASS_BACKDROP
|
#undef GTK_CSS_CHANGE_PSEUDOCLASS_BACKDROP
|
||||||
|
|
||||||
#define GTK_CSS_CHANGE_PSEUDOCLASS_SELECTED GTK_CSS_CHANGE_SELECTED
|
#define GTK_CSS_CHANGE_PSEUDOCLASS_SELECTED GTK_CSS_CHANGE_SELECTED
|
||||||
DEFINE_SIMPLE_SELECTOR(pseudoclass_selected, PSEUDOCLASS_SELECTED, print_pseudoclass_state,
|
DEFINE_SIMPLE_SELECTOR(pseudoclass_selected, PSEUDOCLASS_SELECTED, print_pseudoclass_state,
|
||||||
match_pseudoclass_state, hash_pseudoclass_state, comp_pseudoclass_state,
|
match_pseudoclass_state, hash_pseudoclass_state, comp_pseudoclass_state,
|
||||||
FALSE, TRUE, FALSE)
|
FALSE, TRUE, FALSE, TRUE)
|
||||||
#undef GTK_CSS_CHANGE_PSEUDOCLASS_SELECTED
|
#undef GTK_CSS_CHANGE_PSEUDOCLASS_SELECTED
|
||||||
|
|
||||||
#define GTK_CSS_CHANGE_PSEUDOCLASS_STATE GTK_CSS_CHANGE_STATE
|
#define GTK_CSS_CHANGE_PSEUDOCLASS_STATE GTK_CSS_CHANGE_STATE
|
||||||
DEFINE_SIMPLE_SELECTOR(pseudoclass_state, PSEUDOCLASS_STATE, print_pseudoclass_state,
|
DEFINE_SIMPLE_SELECTOR(pseudoclass_state, PSEUDOCLASS_STATE, print_pseudoclass_state,
|
||||||
match_pseudoclass_state, hash_pseudoclass_state, comp_pseudoclass_state,
|
match_pseudoclass_state, hash_pseudoclass_state, comp_pseudoclass_state,
|
||||||
FALSE, TRUE, FALSE)
|
FALSE, TRUE, FALSE, TRUE)
|
||||||
#undef GTK_CSS_CHANGE_PSEUDOCLASS_STATE
|
#undef GTK_CSS_CHANGE_PSEUDOCLASS_STATE
|
||||||
|
|
||||||
/* PSEUDOCLASS FOR POSITION */
|
/* PSEUDOCLASS FOR POSITION */
|
||||||
@@ -909,7 +907,7 @@ change_pseudoclass_position (const GtkCssSelector *selector)
|
|||||||
#define GTK_CSS_CHANGE_PSEUDOCLASS_POSITION change_pseudoclass_position(selector)
|
#define GTK_CSS_CHANGE_PSEUDOCLASS_POSITION change_pseudoclass_position(selector)
|
||||||
DEFINE_SIMPLE_SELECTOR(pseudoclass_position, PSEUDOCLASS_POSITION, print_pseudoclass_position,
|
DEFINE_SIMPLE_SELECTOR(pseudoclass_position, PSEUDOCLASS_POSITION, print_pseudoclass_position,
|
||||||
match_pseudoclass_position, hash_pseudoclass_position, comp_pseudoclass_position,
|
match_pseudoclass_position, hash_pseudoclass_position, comp_pseudoclass_position,
|
||||||
FALSE, TRUE, FALSE)
|
FALSE, TRUE, FALSE, TRUE)
|
||||||
#undef GTK_CSS_CHANGE_PSEUDOCLASS_POSITION
|
#undef GTK_CSS_CHANGE_PSEUDOCLASS_POSITION
|
||||||
/* API */
|
/* API */
|
||||||
|
|
||||||
@@ -1728,6 +1726,16 @@ _gtk_css_selector_matches (const GtkCssSelector *selector,
|
|||||||
return gtk_css_selector_foreach (selector, matcher, gtk_css_selector_foreach_match, NULL);
|
return gtk_css_selector_foreach (selector, matcher, gtk_css_selector_foreach_match, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
gtk_css_selector_match_for_change (const GtkCssSelector *selector,
|
||||||
|
const GtkCssMatcher *matcher)
|
||||||
|
{
|
||||||
|
if (selector->class->ignore_for_change)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
return selector->class->match_one (selector, matcher);
|
||||||
|
}
|
||||||
|
|
||||||
/* Computes specificity according to CSS 2.1.
|
/* Computes specificity according to CSS 2.1.
|
||||||
* The arguments must be initialized to 0 */
|
* The arguments must be initialized to 0 */
|
||||||
static void
|
static void
|
||||||
@@ -1877,12 +1885,80 @@ _gtk_css_selector_tree_match_all (const GtkCssSelectorTree *tree,
|
|||||||
return array;
|
return array;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* When checking for changes via the tree we need to know if a rule further
|
||||||
|
down the tree matched, because if so we need to add "our bit" to the
|
||||||
|
Change. For instance in a match like *.class:active we'll
|
||||||
|
get a tree that first checks :active, if that matches we continue down
|
||||||
|
to the tree, and if we get a match we add CHANGE_CLASS. However, the
|
||||||
|
end of the tree where we have a match is an ANY which doesn't actually
|
||||||
|
modify the change, so we don't know if we have a match or not. We fix
|
||||||
|
this by setting GTK_CSS_CHANGE_GOT_MATCH which lets us guarantee
|
||||||
|
that change != 0 on any match. */
|
||||||
|
#define GTK_CSS_CHANGE_GOT_MATCH GTK_CSS_CHANGE_RESERVED_BIT
|
||||||
|
|
||||||
|
static GtkCssChange
|
||||||
|
gtk_css_selector_tree_collect_change (const GtkCssSelectorTree *tree)
|
||||||
|
{
|
||||||
|
GtkCssChange change = 0;
|
||||||
|
const GtkCssSelectorTree *prev;
|
||||||
|
|
||||||
|
for (prev = gtk_css_selector_tree_get_previous (tree);
|
||||||
|
prev != NULL;
|
||||||
|
prev = gtk_css_selector_tree_get_sibling (prev))
|
||||||
|
change |= gtk_css_selector_tree_collect_change (prev);
|
||||||
|
|
||||||
|
change = tree->selector.class->get_change (&tree->selector, change);
|
||||||
|
|
||||||
|
return change;
|
||||||
|
}
|
||||||
|
|
||||||
|
static GtkCssChange
|
||||||
|
gtk_css_selector_tree_get_change (const GtkCssSelectorTree *tree,
|
||||||
|
const GtkCssMatcher *matcher)
|
||||||
|
{
|
||||||
|
GtkCssChange change = 0;
|
||||||
|
const GtkCssSelectorTree *prev;
|
||||||
|
|
||||||
|
if (!gtk_css_selector_match_for_change (&tree->selector, matcher))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (!tree->selector.class->is_simple)
|
||||||
|
return gtk_css_selector_tree_collect_change (tree) | GTK_CSS_CHANGE_GOT_MATCH;
|
||||||
|
|
||||||
|
for (prev = gtk_css_selector_tree_get_previous (tree);
|
||||||
|
prev != NULL;
|
||||||
|
prev = gtk_css_selector_tree_get_sibling (prev))
|
||||||
|
change |= gtk_css_selector_tree_get_change (prev, matcher);
|
||||||
|
|
||||||
|
if (change || gtk_css_selector_tree_get_matches (tree))
|
||||||
|
change = tree->selector.class->get_change (&tree->selector, change & ~GTK_CSS_CHANGE_GOT_MATCH) | GTK_CSS_CHANGE_GOT_MATCH;
|
||||||
|
|
||||||
|
return change;
|
||||||
|
}
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
_gtk_css_selector_tree_is_empty (const GtkCssSelectorTree *tree)
|
_gtk_css_selector_tree_is_empty (const GtkCssSelectorTree *tree)
|
||||||
{
|
{
|
||||||
return tree == NULL;
|
return tree == NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GtkCssChange
|
||||||
|
_gtk_css_selector_tree_get_change_all (const GtkCssSelectorTree *tree,
|
||||||
|
const GtkCssMatcher *matcher)
|
||||||
|
{
|
||||||
|
GtkCssChange change;
|
||||||
|
|
||||||
|
change = 0;
|
||||||
|
|
||||||
|
/* no need to foreach here because we abort for non-simple selectors */
|
||||||
|
for (; tree != NULL;
|
||||||
|
tree = gtk_css_selector_tree_get_sibling (tree))
|
||||||
|
change |= gtk_css_selector_tree_get_change (tree, matcher);
|
||||||
|
|
||||||
|
/* Never return reserved bit set */
|
||||||
|
return change & ~GTK_CSS_CHANGE_RESERVED_BIT;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef PRINT_TREE
|
#ifdef PRINT_TREE
|
||||||
static void
|
static void
|
||||||
_gtk_css_selector_tree_print (const GtkCssSelectorTree *tree, GString *str, char *prefix)
|
_gtk_css_selector_tree_print (const GtkCssSelectorTree *tree, GString *str, char *prefix)
|
||||||
|
|||||||
@@ -43,6 +43,8 @@ int _gtk_css_selector_compare (const GtkCssSelector *a,
|
|||||||
void _gtk_css_selector_tree_free (GtkCssSelectorTree *tree);
|
void _gtk_css_selector_tree_free (GtkCssSelectorTree *tree);
|
||||||
GPtrArray * _gtk_css_selector_tree_match_all (const GtkCssSelectorTree *tree,
|
GPtrArray * _gtk_css_selector_tree_match_all (const GtkCssSelectorTree *tree,
|
||||||
const GtkCssMatcher *matcher);
|
const GtkCssMatcher *matcher);
|
||||||
|
GtkCssChange _gtk_css_selector_tree_get_change_all (const GtkCssSelectorTree *tree,
|
||||||
|
const GtkCssMatcher *matcher);
|
||||||
void _gtk_css_selector_tree_match_print (const GtkCssSelectorTree *tree,
|
void _gtk_css_selector_tree_match_print (const GtkCssSelectorTree *tree,
|
||||||
GString *str);
|
GString *str);
|
||||||
gboolean _gtk_css_selector_tree_is_empty (const GtkCssSelectorTree *tree) G_GNUC_CONST;
|
gboolean _gtk_css_selector_tree_is_empty (const GtkCssSelectorTree *tree) G_GNUC_CONST;
|
||||||
|
|||||||
@@ -93,6 +93,7 @@ typedef struct _GtkCssStaticStyle GtkCssStaticStyle;
|
|||||||
#define GTK_CSS_CHANGE_TIMESTAMP (1ULL << 50)
|
#define GTK_CSS_CHANGE_TIMESTAMP (1ULL << 50)
|
||||||
#define GTK_CSS_CHANGE_ANIMATIONS (1ULL << 51)
|
#define GTK_CSS_CHANGE_ANIMATIONS (1ULL << 51)
|
||||||
|
|
||||||
|
#define GTK_CSS_CHANGE_RESERVED_BIT (1ULL << 62)
|
||||||
|
|
||||||
typedef guint64 GtkCssChange;
|
typedef guint64 GtkCssChange;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user