diff options
author | Matthias Clasen <mclasen@redhat.com> | 2020-01-15 15:10:06 -0500 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2020-01-15 15:56:05 -0500 |
commit | 13e2445adb42cfeca254a46f6bd07c9f4e6a0cc8 (patch) | |
tree | 2f571932be6f17629aef32fe48c10daa9e3d63d7 /gtk/gtkcssselector.c | |
parent | 67fd975d77443d7fc61eac571edf523e9449716d (diff) | |
download | gtk+-wip/matthiasc/css-change.tar.gz |
css: Track hover and active state changes separatelywip/matthiasc/css-change
The idea is that this reduce the amount of frequently
changing state that css nodes are sensitive to.
This is going to reduce the amount of style recomputation.
Diffstat (limited to 'gtk/gtkcssselector.c')
-rw-r--r-- | gtk/gtkcssselector.c | 34 |
1 files changed, 32 insertions, 2 deletions
diff --git a/gtk/gtkcssselector.c b/gtk/gtkcssselector.c index 6ea0ed6dc0..6576fd8586 100644 --- a/gtk/gtkcssselector.c +++ b/gtk/gtkcssselector.c @@ -731,6 +731,18 @@ comp_pseudoclass_state (const GtkCssSelector *a, return a->state.state - b->state.state; } +#define GTK_CSS_CHANGE_PSEUDOCLASS_HOVER GTK_CSS_CHANGE_HOVER +DEFINE_SIMPLE_SELECTOR(pseudoclass_hover, PSEUDOCLASS_HOVER, print_pseudoclass_state, + match_pseudoclass_state, hash_pseudoclass_state, comp_pseudoclass_state, + FALSE, TRUE, FALSE) +#undef GTK_CSS_CHANGE_PSEUDOCLASS_HOVER + +#define GTK_CSS_CHANGE_PSEUDOCLASS_ACTIVE GTK_CSS_CHANGE_ACTIVE +DEFINE_SIMPLE_SELECTOR(pseudoclass_active, PSEUDOCLASS_ACTIVE, print_pseudoclass_state, + match_pseudoclass_state, hash_pseudoclass_state, comp_pseudoclass_state, + FALSE, TRUE, FALSE) +#undef GTK_CSS_CHANGE_PSEUDOCLASS_ACTIVE + #define GTK_CSS_CHANGE_PSEUDOCLASS_STATE GTK_CSS_CHANGE_STATE DEFINE_SIMPLE_SELECTOR(pseudoclass_state, PSEUDOCLASS_STATE, print_pseudoclass_state, match_pseudoclass_state, hash_pseudoclass_state, comp_pseudoclass_state, @@ -1272,8 +1284,6 @@ gtk_css_selector_parse_selector_pseudo_class (GtkCssParser *parser, { "first-child", 0, POSITION_FORWARD, 0, 1 }, { "last-child", 0, POSITION_BACKWARD, 0, 1 }, { "only-child", 0, POSITION_ONLY, 0, 0 }, - { "active", GTK_STATE_FLAG_ACTIVE, }, - { "hover", GTK_STATE_FLAG_PRELIGHT, }, { "selected", GTK_STATE_FLAG_SELECTED, }, { "disabled", GTK_STATE_FLAG_INSENSITIVE, }, { "indeterminate", GTK_STATE_FLAG_INCONSISTENT, }, @@ -1309,6 +1319,26 @@ gtk_css_selector_parse_selector_pseudo_class (GtkCssParser *parser, return selector; } } + + if (g_ascii_strcasecmp ("hover", token->string.string) == 0) + { + selector = gtk_css_selector_new (negate ? >K_CSS_SELECTOR_NOT_PSEUDOCLASS_HOVER + : >K_CSS_SELECTOR_PSEUDOCLASS_HOVER, + selector); + selector->state.state = GTK_STATE_FLAG_PRELIGHT; + gtk_css_parser_consume_token (parser); + return selector; + } + + if (g_ascii_strcasecmp ("active", token->string.string) == 0) + { + selector = gtk_css_selector_new (negate ? >K_CSS_SELECTOR_NOT_PSEUDOCLASS_ACTIVE + : >K_CSS_SELECTOR_PSEUDOCLASS_ACTIVE, + selector); + selector->state.state = GTK_STATE_FLAG_ACTIVE; + gtk_css_parser_consume_token (parser); + return selector; + } gtk_css_parser_error (parser, GTK_CSS_PARSER_ERROR_UNKNOWN_VALUE, |