Compare commits
22 Commits
install-fr
...
wip/css-tr
Author | SHA1 | Date | |
---|---|---|---|
|
0542d5461f | ||
|
28033a25dd | ||
|
536e38aef6 | ||
|
867f70586c | ||
|
8e461c2ecd | ||
|
e3930f2342 | ||
|
24f5412b3d | ||
|
36200036db | ||
|
67c62fff13 | ||
|
55f8bb5279 | ||
|
736d1bccf6 | ||
|
ef1dbc7c36 | ||
|
f11013e80a | ||
|
d40d532067 | ||
|
64d8034164 | ||
|
d9357402ed | ||
|
6702974e32 | ||
|
18536fc044 | ||
|
fa2f5eee64 | ||
|
b70bac8b76 | ||
|
b786ccc6d9 | ||
|
af7c38c60c |
@@ -185,6 +185,7 @@ static const GtkCssMatcherClass GTK_CSS_MATCHER_WIDGET_PATH = {
|
|||||||
gtk_css_matcher_widget_path_has_regions,
|
gtk_css_matcher_widget_path_has_regions,
|
||||||
gtk_css_matcher_widget_path_has_region,
|
gtk_css_matcher_widget_path_has_region,
|
||||||
gtk_css_matcher_widget_path_has_position,
|
gtk_css_matcher_widget_path_has_position,
|
||||||
|
FALSE
|
||||||
};
|
};
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
@@ -288,6 +289,7 @@ static const GtkCssMatcherClass GTK_CSS_MATCHER_ANY = {
|
|||||||
gtk_css_matcher_any_has_regions,
|
gtk_css_matcher_any_has_regions,
|
||||||
gtk_css_matcher_any_has_region,
|
gtk_css_matcher_any_has_region,
|
||||||
gtk_css_matcher_any_has_position,
|
gtk_css_matcher_any_has_position,
|
||||||
|
TRUE
|
||||||
};
|
};
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -406,6 +408,7 @@ static const GtkCssMatcherClass GTK_CSS_MATCHER_SUPERSET = {
|
|||||||
gtk_css_matcher_superset_has_regions,
|
gtk_css_matcher_superset_has_regions,
|
||||||
gtk_css_matcher_superset_has_region,
|
gtk_css_matcher_superset_has_region,
|
||||||
gtk_css_matcher_superset_has_position,
|
gtk_css_matcher_superset_has_position,
|
||||||
|
FALSE
|
||||||
};
|
};
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@@ -50,6 +50,7 @@ struct _GtkCssMatcherClass {
|
|||||||
gboolean forward,
|
gboolean forward,
|
||||||
int a,
|
int a,
|
||||||
int b);
|
int b);
|
||||||
|
gboolean is_any;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _GtkCssMatcherWidgetPath {
|
struct _GtkCssMatcherWidgetPath {
|
||||||
@@ -146,6 +147,12 @@ _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->is_any;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
|
@@ -986,6 +986,7 @@ struct _WidgetPropertyValue {
|
|||||||
struct GtkCssRuleset
|
struct GtkCssRuleset
|
||||||
{
|
{
|
||||||
GtkCssSelector *selector;
|
GtkCssSelector *selector;
|
||||||
|
GtkCssSelectorTree *selector_match;
|
||||||
WidgetPropertyValue *widget_style;
|
WidgetPropertyValue *widget_style;
|
||||||
PropertyValue *styles;
|
PropertyValue *styles;
|
||||||
GtkBitmask *set_styles;
|
GtkBitmask *set_styles;
|
||||||
@@ -1011,6 +1012,7 @@ struct _GtkCssProviderPrivate
|
|||||||
GHashTable *keyframes;
|
GHashTable *keyframes;
|
||||||
|
|
||||||
GArray *rulesets;
|
GArray *rulesets;
|
||||||
|
GtkCssSelectorTree *tree;
|
||||||
GResource *resource;
|
GResource *resource;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1271,17 +1273,10 @@ gtk_css_ruleset_add (GtkCssRuleset *ruleset,
|
|||||||
ruleset->styles[i].section = NULL;
|
ruleset->styles[i].section = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
|
||||||
gtk_css_ruleset_matches (GtkCssRuleset *ruleset,
|
|
||||||
const GtkCssMatcher *matcher)
|
|
||||||
{
|
|
||||||
return _gtk_css_selector_matches (ruleset->selector, matcher);
|
|
||||||
}
|
|
||||||
|
|
||||||
static GtkCssChange
|
static GtkCssChange
|
||||||
gtk_css_ruleset_get_change (GtkCssRuleset *ruleset)
|
gtk_css_ruleset_get_change (GtkCssRuleset *ruleset)
|
||||||
{
|
{
|
||||||
return _gtk_css_selector_get_change (ruleset->selector);
|
return _gtk_css_selector_tree_match_get_change (ruleset->selector_match);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -1409,6 +1404,43 @@ gtk_css_provider_init (GtkCssProvider *css_provider)
|
|||||||
(GDestroyNotify) _gtk_css_value_unref);
|
(GDestroyNotify) _gtk_css_value_unref);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
verify_tree_match_results (GtkCssProvider *provider,
|
||||||
|
const GtkCssMatcher *matcher,
|
||||||
|
GPtrArray *tree_rules)
|
||||||
|
{
|
||||||
|
#ifdef VERIFY_TREE
|
||||||
|
GtkCssProviderPrivate *priv = provider->priv;
|
||||||
|
GtkCssRuleset *ruleset;
|
||||||
|
gboolean should_match;
|
||||||
|
int i, j;
|
||||||
|
|
||||||
|
for (i = 0; i < priv->rulesets->len; i++)
|
||||||
|
{
|
||||||
|
gboolean found = FALSE;
|
||||||
|
|
||||||
|
ruleset = &g_array_index (priv->rulesets, GtkCssRuleset, i);
|
||||||
|
|
||||||
|
for (j = 0; j < tree_rules->len; j++)
|
||||||
|
{
|
||||||
|
if (ruleset == tree_rules->pdata[j])
|
||||||
|
{
|
||||||
|
found = TRUE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
should_match = _gtk_css_selector_matches (ruleset->selector, matcher);
|
||||||
|
if (found != !!should_match)
|
||||||
|
{
|
||||||
|
g_error ("expected rule '%s' to %s, but it %s\n",
|
||||||
|
_gtk_css_selector_to_string (ruleset->selector),
|
||||||
|
should_match ? "match" : "not match",
|
||||||
|
found ? "matched" : "didn't match");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
gtk_css_provider_get_style_property (GtkStyleProvider *provider,
|
gtk_css_provider_get_style_property (GtkStyleProvider *provider,
|
||||||
GtkWidgetPath *path,
|
GtkWidgetPath *path,
|
||||||
@@ -1419,6 +1451,7 @@ gtk_css_provider_get_style_property (GtkStyleProvider *provider,
|
|||||||
GtkCssProvider *css_provider = GTK_CSS_PROVIDER (provider);
|
GtkCssProvider *css_provider = GTK_CSS_PROVIDER (provider);
|
||||||
GtkCssProviderPrivate *priv = css_provider->priv;
|
GtkCssProviderPrivate *priv = css_provider->priv;
|
||||||
WidgetPropertyValue *val;
|
WidgetPropertyValue *val;
|
||||||
|
GPtrArray *tree_rules;
|
||||||
GtkCssMatcher matcher;
|
GtkCssMatcher matcher;
|
||||||
gboolean found = FALSE;
|
gboolean found = FALSE;
|
||||||
gchar *prop_name;
|
gchar *prop_name;
|
||||||
@@ -1427,22 +1460,20 @@ gtk_css_provider_get_style_property (GtkStyleProvider *provider,
|
|||||||
if (!_gtk_css_matcher_init (&matcher, path, state))
|
if (!_gtk_css_matcher_init (&matcher, path, state))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
|
tree_rules = _gtk_css_selector_tree_match_all (priv->tree, &matcher);
|
||||||
|
verify_tree_match_results (css_provider, &matcher, tree_rules);
|
||||||
|
|
||||||
prop_name = g_strdup_printf ("-%s-%s",
|
prop_name = g_strdup_printf ("-%s-%s",
|
||||||
g_type_name (pspec->owner_type),
|
g_type_name (pspec->owner_type),
|
||||||
pspec->name);
|
pspec->name);
|
||||||
|
|
||||||
for (i = priv->rulesets->len - 1; i >= 0; i--)
|
for (i = tree_rules->len - 1; i >= 0; i--)
|
||||||
{
|
{
|
||||||
GtkCssRuleset *ruleset;
|
GtkCssRuleset *ruleset = tree_rules->pdata[i];
|
||||||
|
|
||||||
ruleset = &g_array_index (priv->rulesets, GtkCssRuleset, i);
|
|
||||||
|
|
||||||
if (ruleset->widget_style == NULL)
|
if (ruleset->widget_style == NULL)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (!gtk_css_ruleset_matches (ruleset, &matcher))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
for (val = ruleset->widget_style; val != NULL; val = val->next)
|
for (val = ruleset->widget_style; val != NULL; val = val->next)
|
||||||
{
|
{
|
||||||
if (strcmp (val->name, prop_name) == 0)
|
if (strcmp (val->name, prop_name) == 0)
|
||||||
@@ -1469,6 +1500,7 @@ gtk_css_provider_get_style_property (GtkStyleProvider *provider,
|
|||||||
}
|
}
|
||||||
|
|
||||||
g_free (prop_name);
|
g_free (prop_name);
|
||||||
|
g_ptr_array_free (tree_rules, TRUE);
|
||||||
|
|
||||||
return found;
|
return found;
|
||||||
}
|
}
|
||||||
@@ -1506,17 +1538,19 @@ gtk_css_style_provider_lookup (GtkStyleProviderPrivate *provider,
|
|||||||
GtkCssProviderPrivate *priv;
|
GtkCssProviderPrivate *priv;
|
||||||
GtkCssRuleset *ruleset;
|
GtkCssRuleset *ruleset;
|
||||||
guint j;
|
guint j;
|
||||||
|
int i;
|
||||||
|
GPtrArray *tree_rules;
|
||||||
|
|
||||||
css_provider = GTK_CSS_PROVIDER (provider);
|
css_provider = GTK_CSS_PROVIDER (provider);
|
||||||
priv = css_provider->priv;
|
priv = css_provider->priv;
|
||||||
|
|
||||||
if (priv->rulesets->len == 0)
|
tree_rules = _gtk_css_selector_tree_match_all (priv->tree, matcher);
|
||||||
return;
|
verify_tree_match_results (css_provider, matcher, tree_rules);
|
||||||
|
|
||||||
for (ruleset = &g_array_index (priv->rulesets, GtkCssRuleset, priv->rulesets->len - 1);
|
for (i = tree_rules->len - 1; i >= 0; i--)
|
||||||
ruleset >= &g_array_index (priv->rulesets, GtkCssRuleset, 0);
|
|
||||||
ruleset--)
|
|
||||||
{
|
{
|
||||||
|
ruleset = tree_rules->pdata[i];
|
||||||
|
|
||||||
if (ruleset->styles == NULL)
|
if (ruleset->styles == NULL)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
@@ -1524,9 +1558,6 @@ gtk_css_style_provider_lookup (GtkStyleProviderPrivate *provider,
|
|||||||
ruleset->set_styles))
|
ruleset->set_styles))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (!gtk_css_ruleset_matches (ruleset, matcher))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
for (j = 0; j < ruleset->n_styles; j++)
|
for (j = 0; j < ruleset->n_styles; j++)
|
||||||
{
|
{
|
||||||
GtkCssStyleProperty *prop = ruleset->styles[j].property;
|
GtkCssStyleProperty *prop = ruleset->styles[j].property;
|
||||||
@@ -1544,6 +1575,8 @@ gtk_css_style_provider_lookup (GtkStyleProviderPrivate *provider,
|
|||||||
if (_gtk_bitmask_is_empty (_gtk_css_lookup_get_missing (lookup)))
|
if (_gtk_bitmask_is_empty (_gtk_css_lookup_get_missing (lookup)))
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
g_ptr_array_free (tree_rules, TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
static GtkCssChange
|
static GtkCssChange
|
||||||
@@ -1553,26 +1586,29 @@ gtk_css_style_provider_get_change (GtkStyleProviderPrivate *provider,
|
|||||||
GtkCssProvider *css_provider;
|
GtkCssProvider *css_provider;
|
||||||
GtkCssProviderPrivate *priv;
|
GtkCssProviderPrivate *priv;
|
||||||
GtkCssChange change = 0;
|
GtkCssChange change = 0;
|
||||||
|
GPtrArray *tree_rules;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
css_provider = GTK_CSS_PROVIDER (provider);
|
css_provider = GTK_CSS_PROVIDER (provider);
|
||||||
priv = css_provider->priv;
|
priv = css_provider->priv;
|
||||||
|
|
||||||
for (i = priv->rulesets->len - 1; i >= 0; i--)
|
tree_rules = _gtk_css_selector_tree_match_all (priv->tree, matcher);
|
||||||
|
verify_tree_match_results (css_provider, matcher, tree_rules);
|
||||||
|
|
||||||
|
for (i = tree_rules->len - 1; i >= 0; i--)
|
||||||
{
|
{
|
||||||
GtkCssRuleset *ruleset;
|
GtkCssRuleset *ruleset;
|
||||||
|
|
||||||
ruleset = &g_array_index (priv->rulesets, GtkCssRuleset, i);
|
ruleset = tree_rules->pdata[i];
|
||||||
|
|
||||||
if (ruleset->styles == NULL)
|
if (ruleset->styles == NULL)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (!gtk_css_ruleset_matches (ruleset, matcher))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
change |= gtk_css_ruleset_get_change (ruleset);
|
change |= gtk_css_ruleset_get_change (ruleset);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
g_ptr_array_free (tree_rules, TRUE);
|
||||||
|
|
||||||
return change;
|
return change;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1599,6 +1635,7 @@ gtk_css_provider_finalize (GObject *object)
|
|||||||
gtk_css_ruleset_clear (&g_array_index (priv->rulesets, GtkCssRuleset, i));
|
gtk_css_ruleset_clear (&g_array_index (priv->rulesets, GtkCssRuleset, i));
|
||||||
|
|
||||||
g_array_free (priv->rulesets, TRUE);
|
g_array_free (priv->rulesets, TRUE);
|
||||||
|
_gtk_css_selector_tree_free (priv->tree);
|
||||||
|
|
||||||
g_hash_table_destroy (priv->symbolic_colors);
|
g_hash_table_destroy (priv->symbolic_colors);
|
||||||
g_hash_table_destroy (priv->keyframes);
|
g_hash_table_destroy (priv->keyframes);
|
||||||
@@ -1736,6 +1773,9 @@ gtk_css_provider_reset (GtkCssProvider *css_provider)
|
|||||||
for (i = 0; i < priv->rulesets->len; i++)
|
for (i = 0; i < priv->rulesets->len; i++)
|
||||||
gtk_css_ruleset_clear (&g_array_index (priv->rulesets, GtkCssRuleset, i));
|
gtk_css_ruleset_clear (&g_array_index (priv->rulesets, GtkCssRuleset, i));
|
||||||
g_array_set_size (priv->rulesets, 0);
|
g_array_set_size (priv->rulesets, 0);
|
||||||
|
_gtk_css_selector_tree_free (priv->tree);
|
||||||
|
priv->tree = NULL;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -2370,8 +2410,38 @@ static void
|
|||||||
gtk_css_provider_postprocess (GtkCssProvider *css_provider)
|
gtk_css_provider_postprocess (GtkCssProvider *css_provider)
|
||||||
{
|
{
|
||||||
GtkCssProviderPrivate *priv = css_provider->priv;
|
GtkCssProviderPrivate *priv = css_provider->priv;
|
||||||
|
GtkCssSelectorTreeBuilder *builder;
|
||||||
|
guint i;
|
||||||
|
|
||||||
g_array_sort (priv->rulesets, gtk_css_provider_compare_rule);
|
g_array_sort (priv->rulesets, gtk_css_provider_compare_rule);
|
||||||
|
|
||||||
|
builder = _gtk_css_selector_tree_builder_new ();
|
||||||
|
for (i = 0; i < priv->rulesets->len; i++)
|
||||||
|
{
|
||||||
|
GtkCssRuleset *ruleset;
|
||||||
|
|
||||||
|
ruleset = &g_array_index (priv->rulesets, GtkCssRuleset, i);
|
||||||
|
|
||||||
|
_gtk_css_selector_tree_builder_add (builder,
|
||||||
|
ruleset->selector,
|
||||||
|
&ruleset->selector_match,
|
||||||
|
ruleset);
|
||||||
|
}
|
||||||
|
|
||||||
|
priv->tree = _gtk_css_selector_tree_builder_build (builder);
|
||||||
|
_gtk_css_selector_tree_builder_free (builder);
|
||||||
|
|
||||||
|
#ifndef VERIFY_TREE
|
||||||
|
for (i = 0; i < priv->rulesets->len; i++)
|
||||||
|
{
|
||||||
|
GtkCssRuleset *ruleset;
|
||||||
|
|
||||||
|
ruleset = &g_array_index (priv->rulesets, GtkCssRuleset, i);
|
||||||
|
|
||||||
|
_gtk_css_selector_free (ruleset->selector);
|
||||||
|
ruleset->selector = NULL;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
@@ -2820,7 +2890,7 @@ gtk_css_ruleset_print (const GtkCssRuleset *ruleset,
|
|||||||
WidgetPropertyValue *widget_value;
|
WidgetPropertyValue *widget_value;
|
||||||
guint i;
|
guint i;
|
||||||
|
|
||||||
_gtk_css_selector_print (ruleset->selector, str);
|
_gtk_css_selector_tree_match_print (ruleset->selector_match, str);
|
||||||
|
|
||||||
g_string_append (str, " {\n");
|
g_string_append (str, " {\n");
|
||||||
|
|
||||||
|
1043
gtk/gtkcssselector.c
1043
gtk/gtkcssselector.c
File diff suppressed because it is too large
Load Diff
@@ -24,6 +24,8 @@
|
|||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|
||||||
typedef struct _GtkCssSelector GtkCssSelector;
|
typedef struct _GtkCssSelector GtkCssSelector;
|
||||||
|
typedef struct _GtkCssSelectorTree GtkCssSelectorTree;
|
||||||
|
typedef struct _GtkCssSelectorTreeBuilder GtkCssSelectorTreeBuilder;
|
||||||
|
|
||||||
GtkCssSelector * _gtk_css_selector_parse (GtkCssParser *parser);
|
GtkCssSelector * _gtk_css_selector_parse (GtkCssParser *parser);
|
||||||
void _gtk_css_selector_free (GtkCssSelector *selector);
|
void _gtk_css_selector_free (GtkCssSelector *selector);
|
||||||
@@ -32,12 +34,27 @@ char * _gtk_css_selector_to_string (const GtkCssSelector *sel
|
|||||||
void _gtk_css_selector_print (const GtkCssSelector *selector,
|
void _gtk_css_selector_print (const GtkCssSelector *selector,
|
||||||
GString *str);
|
GString *str);
|
||||||
|
|
||||||
GtkCssChange _gtk_css_selector_get_change (const GtkCssSelector *selector);
|
|
||||||
gboolean _gtk_css_selector_matches (const GtkCssSelector *selector,
|
gboolean _gtk_css_selector_matches (const GtkCssSelector *selector,
|
||||||
const GtkCssMatcher *matcher);
|
const GtkCssMatcher *matcher);
|
||||||
int _gtk_css_selector_compare (const GtkCssSelector *a,
|
int _gtk_css_selector_compare (const GtkCssSelector *a,
|
||||||
const GtkCssSelector *b);
|
const GtkCssSelector *b);
|
||||||
|
|
||||||
|
void _gtk_css_selector_tree_free (GtkCssSelectorTree *tree);
|
||||||
|
GPtrArray * _gtk_css_selector_tree_match_all (const GtkCssSelectorTree *tree,
|
||||||
|
const GtkCssMatcher *matcher);
|
||||||
|
void _gtk_css_selector_tree_match_print (const GtkCssSelectorTree *tree,
|
||||||
|
GString *str);
|
||||||
|
GtkCssChange _gtk_css_selector_tree_match_get_change (const GtkCssSelectorTree *tree);
|
||||||
|
|
||||||
|
|
||||||
|
GtkCssSelectorTreeBuilder *_gtk_css_selector_tree_builder_new (void);
|
||||||
|
void _gtk_css_selector_tree_builder_add (GtkCssSelectorTreeBuilder *builder,
|
||||||
|
GtkCssSelector *selectors,
|
||||||
|
GtkCssSelectorTree **selector_match,
|
||||||
|
gpointer match);
|
||||||
|
GtkCssSelectorTree * _gtk_css_selector_tree_builder_build (GtkCssSelectorTreeBuilder *builder);
|
||||||
|
void _gtk_css_selector_tree_builder_free (GtkCssSelectorTreeBuilder *builder);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
#endif /* __GTK_CSS_SELECTOR_PRIVATE_H__ */
|
#endif /* __GTK_CSS_SELECTOR_PRIVATE_H__ */
|
||||||
|
@@ -262,7 +262,7 @@ a ~ :hover {
|
|||||||
int-property: 42;
|
int-property: 42;
|
||||||
}
|
}
|
||||||
|
|
||||||
:hover.b {
|
.b:hover {
|
||||||
int-property: 42;
|
int-property: 42;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -398,7 +398,7 @@ a ~ #b {
|
|||||||
int-property: 42;
|
int-property: 42;
|
||||||
}
|
}
|
||||||
|
|
||||||
:hover#b {
|
#b:hover {
|
||||||
int-property: 42;
|
int-property: 42;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user