css: Track backdrop state separately

Like the previous change, this reduces the number of
css nodes reacting to parent-state changes.

Before (numbers from widget-factory with Adwaita):
2247 nodes
class 612
name 2246
id 2
first-child 148
last-child 156
state 2247
hover 562
disabled 859
sibling-name 63
sibling-disabled 51
parent-class 586
parent-name 788
parent-id 2
parent-first-child 78
parent-last-child 78
parent-state 236
parent-hover 5
parent-disabled 91

After:
2247 nodes
class 612
name 2246
id 2
first-child 148
last-child 156
state 2245
hover 562
disabled 859
backdrop 1080
sibling-name 63
sibling-disabled 51
parent-class 586
parent-name 788
parent-id 2
parent-first-child 78
parent-last-child 78
parent-state 236
parent-hover 5
parent-disabled 91
parent-backdrop 4
This commit is contained in:
Matthias Clasen 2020-01-15 20:05:44 -05:00
parent 64848aebf4
commit 2426b9e23a
5 changed files with 64 additions and 39 deletions

View File

@ -529,7 +529,7 @@ _gtk_css_matcher_superset_init (GtkCssMatcher *matcher,
GtkCssChange relevant)
{
g_return_if_fail (subset != NULL);
g_return_if_fail ((relevant & ~(GTK_CSS_CHANGE_CLASS | GTK_CSS_CHANGE_NAME | GTK_CSS_CHANGE_POSITION | GTK_CSS_CHANGE_STATE | GTK_CSS_CHANGE_HOVER | GTK_CSS_CHANGE_DISABLED)) == 0);
g_return_if_fail ((relevant & ~(GTK_CSS_CHANGE_CLASS | GTK_CSS_CHANGE_NAME | GTK_CSS_CHANGE_POSITION | GTK_CSS_CHANGE_STATE | GTK_CSS_CHANGE_HOVER | GTK_CSS_CHANGE_DISABLED | GTK_CSS_CHANGE_BACKDROP)) == 0);
matcher->superset.klass = &GTK_CSS_MATCHER_SUPERSET;
matcher->superset.subset = subset;

View File

@ -1151,8 +1151,11 @@ gtk_css_node_set_state (GtkCssNode *cssnode,
change |= GTK_CSS_CHANGE_HOVER;
if (states & GTK_STATE_FLAG_INSENSITIVE)
change |= GTK_CSS_CHANGE_DISABLED;
if (states & GTK_STATE_FLAG_BACKDROP)
change |= GTK_CSS_CHANGE_BACKDROP;
if (states & ~(GTK_STATE_FLAG_PRELIGHT |
GTK_STATE_FLAG_INSENSITIVE))
GTK_STATE_FLAG_INSENSITIVE |
GTK_STATE_FLAG_BACKDROP))
change |= GTK_CSS_CHANGE_STATE;
gtk_css_node_invalidate (cssnode, change);

View File

@ -740,6 +740,12 @@ DEFINE_SIMPLE_SELECTOR(pseudoclass_disabled, PSEUDOCLASS_DISABLED, print_pseudoc
FALSE, TRUE, FALSE)
#undef GTK_CSS_CHANGE_PSEUDOCLASS_DISABLED
#define GTK_CSS_CHANGE_PSEUDOCLASS_BACKDROP GTK_CSS_CHANGE_BACKDROP
DEFINE_SIMPLE_SELECTOR(pseudoclass_backdrop, PSEUDOCLASS_BACKDROP, print_pseudoclass_state,
match_pseudoclass_state, hash_pseudoclass_state, comp_pseudoclass_state,
FALSE, TRUE, FALSE)
#undef GTK_CSS_CHANGE_PSEUDOCLASS_BACKDROP
#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,
@ -1308,6 +1314,10 @@ gtk_css_selector_parse_selector_pseudo_class (GtkCssParser *parser,
selector = gtk_css_selector_new (negate ? &GTK_CSS_SELECTOR_NOT_PSEUDOCLASS_DISABLED
: &GTK_CSS_SELECTOR_PSEUDOCLASS_DISABLED,
selector);
else if (pseudo_classes[i].state_flag == GTK_STATE_FLAG_BACKDROP)
selector = gtk_css_selector_new (negate ? &GTK_CSS_SELECTOR_NOT_PSEUDOCLASS_BACKDROP
: &GTK_CSS_SELECTOR_PSEUDOCLASS_BACKDROP,
selector);
else
selector = gtk_css_selector_new (negate ? &GTK_CSS_SELECTOR_NOT_PSEUDOCLASS_STATE
: &GTK_CSS_SELECTOR_PSEUDOCLASS_STATE,

View File

@ -76,7 +76,8 @@ _gtk_css_change_for_sibling (GtkCssChange match)
| GTK_CSS_CHANGE_NTH_LAST_CHILD \
| GTK_CSS_CHANGE_STATE \
| GTK_CSS_CHANGE_HOVER \
| GTK_CSS_CHANGE_DISABLED)
| GTK_CSS_CHANGE_DISABLED \
| GTK_CSS_CHANGE_BACKDROP)
#define KEEP_STATES ( ~(BASE_STATES|GTK_CSS_CHANGE_SOURCE|GTK_CSS_CHANGE_PARENT_STYLE) \
| GTK_CSS_CHANGE_NTH_CHILD \
@ -101,6 +102,7 @@ _gtk_css_change_for_child (GtkCssChange match)
| GTK_CSS_CHANGE_STATE \
| GTK_CSS_CHANGE_HOVER \
| GTK_CSS_CHANGE_DISABLED \
| GTK_CSS_CHANGE_BACKDROP \
| GTK_CSS_CHANGE_SIBLING_CLASS \
| GTK_CSS_CHANGE_SIBLING_NAME \
| GTK_CSS_CHANGE_SIBLING_ID \
@ -110,7 +112,8 @@ _gtk_css_change_for_child (GtkCssChange match)
| GTK_CSS_CHANGE_SIBLING_NTH_LAST_CHILD \
| GTK_CSS_CHANGE_SIBLING_STATE \
| GTK_CSS_CHANGE_SIBLING_HOVER \
| GTK_CSS_CHANGE_SIBLING_DISABLED)
| GTK_CSS_CHANGE_SIBLING_DISABLED \
| GTK_CSS_CHANGE_SIBLING_BACKDROP)
#define KEEP_STATES (~(BASE_STATES|GTK_CSS_CHANGE_SOURCE|GTK_CSS_CHANGE_PARENT_STYLE))
@ -138,6 +141,7 @@ gtk_css_change_print (GtkCssChange change,
{ GTK_CSS_CHANGE_STATE, "state" },
{ GTK_CSS_CHANGE_HOVER, "hover" },
{ GTK_CSS_CHANGE_DISABLED, "disabled" },
{ GTK_CSS_CHANGE_BACKDROP, "backdrop" },
{ GTK_CSS_CHANGE_SIBLING_CLASS, "sibling-class" },
{ GTK_CSS_CHANGE_SIBLING_NAME, "sibling-name" },
@ -149,6 +153,7 @@ gtk_css_change_print (GtkCssChange change,
{ GTK_CSS_CHANGE_SIBLING_STATE, "sibling-state" },
{ GTK_CSS_CHANGE_SIBLING_HOVER, "sibling-hover" },
{ GTK_CSS_CHANGE_SIBLING_DISABLED, "sibling-disabled" },
{ GTK_CSS_CHANGE_SIBLING_BACKDROP, "sibling-backdrop" },
{ GTK_CSS_CHANGE_PARENT_CLASS, "parent-class" },
{ GTK_CSS_CHANGE_PARENT_NAME, "parent-name" },
@ -160,6 +165,7 @@ gtk_css_change_print (GtkCssChange change,
{ GTK_CSS_CHANGE_PARENT_STATE, "parent-state" },
{ GTK_CSS_CHANGE_PARENT_HOVER, "parent-hover" },
{ GTK_CSS_CHANGE_PARENT_DISABLED, "parent-disabled" },
{ GTK_CSS_CHANGE_PARENT_BACKDROP, "parent-backdrop" },
{ GTK_CSS_CHANGE_PARENT_SIBLING_CLASS, "parent-sibling-" },
{ GTK_CSS_CHANGE_PARENT_SIBLING_NAME, "parent-sibling-name" },
@ -171,6 +177,7 @@ gtk_css_change_print (GtkCssChange change,
{ GTK_CSS_CHANGE_PARENT_SIBLING_STATE, "parent-sibling-state" },
{ GTK_CSS_CHANGE_PARENT_SIBLING_HOVER, "parent-sibling-hover" },
{ GTK_CSS_CHANGE_PARENT_SIBLING_DISABLED, "parent-sibling-disabled" },
{ GTK_CSS_CHANGE_PARENT_SIBLING_BACKDROP, "parent-sibling-backdrop" },
{ GTK_CSS_CHANGE_SOURCE, "source" },
{ GTK_CSS_CHANGE_PARENT_STYLE, "parent-style" },

View File

@ -38,51 +38,55 @@ typedef struct _GtkCssStyle GtkCssStyle;
#define GTK_CSS_CHANGE_STATE (1ULL << 7)
#define GTK_CSS_CHANGE_HOVER (1ULL << 8)
#define GTK_CSS_CHANGE_DISABLED (1ULL << 9)
#define GTK_CSS_CHANGE_BACKDROP (1ULL << 10)
#define GTK_CSS_CHANGE_SIBLING_SHIFT 10
#define GTK_CSS_CHANGE_SIBLING_SHIFT 11
#define GTK_CSS_CHANGE_SIBLING_CLASS (1ULL << 10)
#define GTK_CSS_CHANGE_SIBLING_NAME (1ULL << 11)
#define GTK_CSS_CHANGE_SIBLING_ID (1ULL << 12)
#define GTK_CSS_CHANGE_SIBLING_FIRST_CHILD (1ULL << 13)
#define GTK_CSS_CHANGE_SIBLING_LAST_CHILD (1ULL << 14)
#define GTK_CSS_CHANGE_SIBLING_NTH_CHILD (1ULL << 15)
#define GTK_CSS_CHANGE_SIBLING_NTH_LAST_CHILD (1ULL << 16)
#define GTK_CSS_CHANGE_SIBLING_STATE (1ULL << 17)
#define GTK_CSS_CHANGE_SIBLING_HOVER (1ULL << 18)
#define GTK_CSS_CHANGE_SIBLING_DISABLED (1ULL << 19)
#define GTK_CSS_CHANGE_SIBLING_CLASS (1ULL << 11)
#define GTK_CSS_CHANGE_SIBLING_NAME (1ULL << 12)
#define GTK_CSS_CHANGE_SIBLING_ID (1ULL << 13)
#define GTK_CSS_CHANGE_SIBLING_FIRST_CHILD (1ULL << 14)
#define GTK_CSS_CHANGE_SIBLING_LAST_CHILD (1ULL << 15)
#define GTK_CSS_CHANGE_SIBLING_NTH_CHILD (1ULL << 16)
#define GTK_CSS_CHANGE_SIBLING_NTH_LAST_CHILD (1ULL << 17)
#define GTK_CSS_CHANGE_SIBLING_STATE (1ULL << 18)
#define GTK_CSS_CHANGE_SIBLING_HOVER (1ULL << 19)
#define GTK_CSS_CHANGE_SIBLING_DISABLED (1ULL << 20)
#define GTK_CSS_CHANGE_SIBLING_BACKDROP (1ULL << 21)
#define GTK_CSS_CHANGE_PARENT_SHIFT (GTK_CSS_CHANGE_SIBLING_SHIFT + GTK_CSS_CHANGE_SIBLING_SHIFT)
#define GTK_CSS_CHANGE_PARENT_CLASS (1ULL << 20)
#define GTK_CSS_CHANGE_PARENT_NAME (1ULL << 21)
#define GTK_CSS_CHANGE_PARENT_ID (1ULL << 22)
#define GTK_CSS_CHANGE_PARENT_FIRST_CHILD (1ULL << 23)
#define GTK_CSS_CHANGE_PARENT_LAST_CHILD (1ULL << 24)
#define GTK_CSS_CHANGE_PARENT_NTH_CHILD (1ULL << 25)
#define GTK_CSS_CHANGE_PARENT_NTH_LAST_CHILD (1ULL << 26)
#define GTK_CSS_CHANGE_PARENT_STATE (1ULL << 27)
#define GTK_CSS_CHANGE_PARENT_HOVER (1ULL << 28)
#define GTK_CSS_CHANGE_PARENT_DISABLED (1ULL << 29)
#define GTK_CSS_CHANGE_PARENT_CLASS (1ULL << 22)
#define GTK_CSS_CHANGE_PARENT_NAME (1ULL << 23)
#define GTK_CSS_CHANGE_PARENT_ID (1ULL << 24)
#define GTK_CSS_CHANGE_PARENT_FIRST_CHILD (1ULL << 25)
#define GTK_CSS_CHANGE_PARENT_LAST_CHILD (1ULL << 26)
#define GTK_CSS_CHANGE_PARENT_NTH_CHILD (1ULL << 27)
#define GTK_CSS_CHANGE_PARENT_NTH_LAST_CHILD (1ULL << 28)
#define GTK_CSS_CHANGE_PARENT_STATE (1ULL << 29)
#define GTK_CSS_CHANGE_PARENT_HOVER (1ULL << 30)
#define GTK_CSS_CHANGE_PARENT_DISABLED (1ULL << 31)
#define GTK_CSS_CHANGE_PARENT_BACKDROP (1ULL << 32)
#define GTK_CSS_CHANGE_PARENT_SIBLING_SHIFT (GTK_CSS_CHANGE_PARENT_SHIFT + GTK_CSS_CHANGE_SIBLING_SHIFT)
#define GTK_CSS_CHANGE_PARENT_SIBLING_CLASS (1ULL << 30)
#define GTK_CSS_CHANGE_PARENT_SIBLING_ID (1ULL << 31)
#define GTK_CSS_CHANGE_PARENT_SIBLING_NAME (1ULL << 32)
#define GTK_CSS_CHANGE_PARENT_SIBLING_FIRST_CHILD (1ULL << 33)
#define GTK_CSS_CHANGE_PARENT_SIBLING_LAST_CHILD (1ULL << 34)
#define GTK_CSS_CHANGE_PARENT_SIBLING_NTH_CHILD (1ULL << 35)
#define GTK_CSS_CHANGE_PARENT_SIBLING_NTH_LAST_CHILD (1ULL << 36)
#define GTK_CSS_CHANGE_PARENT_SIBLING_STATE (1ULL << 37)
#define GTK_CSS_CHANGE_PARENT_SIBLING_HOVER (1ULL << 38)
#define GTK_CSS_CHANGE_PARENT_SIBLING_DISABLED (1ULL << 39)
#define GTK_CSS_CHANGE_PARENT_SIBLING_CLASS (1ULL << 33)
#define GTK_CSS_CHANGE_PARENT_SIBLING_ID (1ULL << 34)
#define GTK_CSS_CHANGE_PARENT_SIBLING_NAME (1ULL << 35)
#define GTK_CSS_CHANGE_PARENT_SIBLING_FIRST_CHILD (1ULL << 36)
#define GTK_CSS_CHANGE_PARENT_SIBLING_LAST_CHILD (1ULL << 37)
#define GTK_CSS_CHANGE_PARENT_SIBLING_NTH_CHILD (1ULL << 38)
#define GTK_CSS_CHANGE_PARENT_SIBLING_NTH_LAST_CHILD (1ULL << 39)
#define GTK_CSS_CHANGE_PARENT_SIBLING_STATE (1ULL << 40)
#define GTK_CSS_CHANGE_PARENT_SIBLING_HOVER (1ULL << 41)
#define GTK_CSS_CHANGE_PARENT_SIBLING_DISABLED (1ULL << 42)
#define GTK_CSS_CHANGE_PARENT_SIBLING_BACKDROP (1ULL << 43)
/* add more */
#define GTK_CSS_CHANGE_SOURCE (1ULL << 40)
#define GTK_CSS_CHANGE_PARENT_STYLE (1ULL << 41)
#define GTK_CSS_CHANGE_TIMESTAMP (1ULL << 42)
#define GTK_CSS_CHANGE_ANIMATIONS (1ULL << 43)
#define GTK_CSS_CHANGE_SOURCE (1ULL << 44)
#define GTK_CSS_CHANGE_PARENT_STYLE (1ULL << 45)
#define GTK_CSS_CHANGE_TIMESTAMP (1ULL << 46)
#define GTK_CSS_CHANGE_ANIMATIONS (1ULL << 47)
#define GTK_CSS_CHANGE_RESERVED_BIT (1ULL << 62) /* Used internally in gtkcssselector.c */
@ -100,6 +104,7 @@ typedef guint64 GtkCssChange;
GTK_CSS_CHANGE_POSITION | \
GTK_CSS_CHANGE_STATE | \
GTK_CSS_CHANGE_DISABLED | \
GTK_CSS_CHANGE_BACKDROP | \
GTK_CSS_CHANGE_HOVER)
#define GTK_CSS_CHANGE_ANY_SIBLING (GTK_CSS_CHANGE_ANY_SELF << GTK_CSS_CHANGE_SIBLING_SHIFT)
#define GTK_CSS_CHANGE_ANY_PARENT (GTK_CSS_CHANGE_ANY_SELF << GTK_CSS_CHANGE_PARENT_SHIFT)