From 192a24fa1fc93f4b09e9f51397153f0becd60aa5 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Wed, 15 Jan 2020 20:27:12 -0500 Subject: [PATCH] css: Track selected state separately Like the previous change, this reduces the number of css nodes reacting to parent-state changes. The remaining parent-state cases here are due to :link. Before (numbers from widget-factory with Adwaita): 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 After: 2247 nodes class 612 name 2246 id 2 first-child 148 last-child 156 state 2245 hover 562 disabled 859 backdrop 1080 selected 579 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 115 parent-hover 5 parent-disabled 91 parent-backdrop 4 parent-selected 144 --- gtk/gtkcssmatcher.c | 2 +- gtk/gtkcssnode.c | 5 ++- gtk/gtkcssselector.c | 10 +++++ gtk/gtkcsstypes.c | 9 ++++- gtk/gtkcsstypesprivate.h | 85 +++++++++++++++++++++------------------- 5 files changed, 68 insertions(+), 43 deletions(-) diff --git a/gtk/gtkcssmatcher.c b/gtk/gtkcssmatcher.c index 00cddb6f96..fb80c3ef80 100644 --- a/gtk/gtkcssmatcher.c +++ b/gtk/gtkcssmatcher.c @@ -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 | GTK_CSS_CHANGE_BACKDROP)) == 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 | GTK_CSS_CHANGE_SELECTED)) == 0); matcher->superset.klass = >K_CSS_MATCHER_SUPERSET; matcher->superset.subset = subset; diff --git a/gtk/gtkcssnode.c b/gtk/gtkcssnode.c index dc535e6332..7af6c7ab93 100644 --- a/gtk/gtkcssnode.c +++ b/gtk/gtkcssnode.c @@ -1153,9 +1153,12 @@ gtk_css_node_set_state (GtkCssNode *cssnode, change |= GTK_CSS_CHANGE_DISABLED; if (states & GTK_STATE_FLAG_BACKDROP) change |= GTK_CSS_CHANGE_BACKDROP; + if (states & GTK_STATE_FLAG_SELECTED) + change |= GTK_CSS_CHANGE_SELECTED; if (states & ~(GTK_STATE_FLAG_PRELIGHT | GTK_STATE_FLAG_INSENSITIVE | - GTK_STATE_FLAG_BACKDROP)) + GTK_STATE_FLAG_BACKDROP | + GTK_STATE_FLAG_SELECTED)) change |= GTK_CSS_CHANGE_STATE; gtk_css_node_invalidate (cssnode, change); diff --git a/gtk/gtkcssselector.c b/gtk/gtkcssselector.c index bd91856f9c..8b10e5935e 100644 --- a/gtk/gtkcssselector.c +++ b/gtk/gtkcssselector.c @@ -746,6 +746,12 @@ DEFINE_SIMPLE_SELECTOR(pseudoclass_backdrop, PSEUDOCLASS_BACKDROP, print_pseudoc FALSE, TRUE, FALSE) #undef GTK_CSS_CHANGE_PSEUDOCLASS_BACKDROP +#define GTK_CSS_CHANGE_PSEUDOCLASS_SELECTED GTK_CSS_CHANGE_SELECTED +DEFINE_SIMPLE_SELECTOR(pseudoclass_selected, PSEUDOCLASS_SELECTED, print_pseudoclass_state, + match_pseudoclass_state, hash_pseudoclass_state, comp_pseudoclass_state, + FALSE, TRUE, FALSE) +#undef GTK_CSS_CHANGE_PSEUDOCLASS_SELECTED + #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, @@ -1318,6 +1324,10 @@ gtk_css_selector_parse_selector_pseudo_class (GtkCssParser *parser, selector = gtk_css_selector_new (negate ? >K_CSS_SELECTOR_NOT_PSEUDOCLASS_BACKDROP : >K_CSS_SELECTOR_PSEUDOCLASS_BACKDROP, selector); + else if (pseudo_classes[i].state_flag == GTK_STATE_FLAG_SELECTED) + selector = gtk_css_selector_new (negate ? >K_CSS_SELECTOR_NOT_PSEUDOCLASS_SELECTED + : >K_CSS_SELECTOR_PSEUDOCLASS_SELECTED, + selector); else selector = gtk_css_selector_new (negate ? >K_CSS_SELECTOR_NOT_PSEUDOCLASS_STATE : >K_CSS_SELECTOR_PSEUDOCLASS_STATE, diff --git a/gtk/gtkcsstypes.c b/gtk/gtkcsstypes.c index 0406a7c837..eead8842d9 100644 --- a/gtk/gtkcsstypes.c +++ b/gtk/gtkcsstypes.c @@ -77,6 +77,7 @@ _gtk_css_change_for_sibling (GtkCssChange match) | GTK_CSS_CHANGE_STATE \ | GTK_CSS_CHANGE_HOVER \ | GTK_CSS_CHANGE_DISABLED \ + | GTK_CSS_CHANGE_SELECTED \ | GTK_CSS_CHANGE_BACKDROP) #define KEEP_STATES ( ~(BASE_STATES|GTK_CSS_CHANGE_SOURCE|GTK_CSS_CHANGE_PARENT_STYLE) \ @@ -103,6 +104,7 @@ _gtk_css_change_for_child (GtkCssChange match) | GTK_CSS_CHANGE_HOVER \ | GTK_CSS_CHANGE_DISABLED \ | GTK_CSS_CHANGE_BACKDROP \ + | GTK_CSS_CHANGE_SELECTED \ | GTK_CSS_CHANGE_SIBLING_CLASS \ | GTK_CSS_CHANGE_SIBLING_NAME \ | GTK_CSS_CHANGE_SIBLING_ID \ @@ -113,7 +115,8 @@ _gtk_css_change_for_child (GtkCssChange match) | GTK_CSS_CHANGE_SIBLING_STATE \ | GTK_CSS_CHANGE_SIBLING_HOVER \ | GTK_CSS_CHANGE_SIBLING_DISABLED \ - | GTK_CSS_CHANGE_SIBLING_BACKDROP) + | GTK_CSS_CHANGE_SIBLING_BACKDROP \ + | GTK_CSS_CHANGE_SIBLING_SELECTED) #define KEEP_STATES (~(BASE_STATES|GTK_CSS_CHANGE_SOURCE|GTK_CSS_CHANGE_PARENT_STYLE)) @@ -142,6 +145,7 @@ gtk_css_change_print (GtkCssChange change, { GTK_CSS_CHANGE_HOVER, "hover" }, { GTK_CSS_CHANGE_DISABLED, "disabled" }, { GTK_CSS_CHANGE_BACKDROP, "backdrop" }, + { GTK_CSS_CHANGE_SELECTED, "selected" }, { GTK_CSS_CHANGE_SIBLING_CLASS, "sibling-class" }, { GTK_CSS_CHANGE_SIBLING_NAME, "sibling-name" }, @@ -154,6 +158,7 @@ gtk_css_change_print (GtkCssChange change, { GTK_CSS_CHANGE_SIBLING_HOVER, "sibling-hover" }, { GTK_CSS_CHANGE_SIBLING_DISABLED, "sibling-disabled" }, { GTK_CSS_CHANGE_SIBLING_BACKDROP, "sibling-backdrop" }, + { GTK_CSS_CHANGE_SIBLING_SELECTED, "sibling-selected" }, { GTK_CSS_CHANGE_PARENT_CLASS, "parent-class" }, { GTK_CSS_CHANGE_PARENT_NAME, "parent-name" }, @@ -166,6 +171,7 @@ gtk_css_change_print (GtkCssChange change, { 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_SELECTED, "parent-selected" }, { GTK_CSS_CHANGE_PARENT_SIBLING_CLASS, "parent-sibling-" }, { GTK_CSS_CHANGE_PARENT_SIBLING_NAME, "parent-sibling-name" }, @@ -178,6 +184,7 @@ gtk_css_change_print (GtkCssChange change, { 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_PARENT_SIBLING_SELECTED, "parent-sibling-selected" }, { GTK_CSS_CHANGE_SOURCE, "source" }, { GTK_CSS_CHANGE_PARENT_STYLE, "parent-style" }, diff --git a/gtk/gtkcsstypesprivate.h b/gtk/gtkcsstypesprivate.h index 0c5fca945b..ee1c5b815d 100644 --- a/gtk/gtkcsstypesprivate.h +++ b/gtk/gtkcsstypesprivate.h @@ -39,54 +39,58 @@ typedef struct _GtkCssStyle GtkCssStyle; #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 11 - -#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_SELECTED (1ULL << 11) + +#define GTK_CSS_CHANGE_SIBLING_SHIFT 12 + +#define GTK_CSS_CHANGE_SIBLING_CLASS (1ULL << 12) +#define GTK_CSS_CHANGE_SIBLING_NAME (1ULL << 13) +#define GTK_CSS_CHANGE_SIBLING_ID (1ULL << 14) +#define GTK_CSS_CHANGE_SIBLING_FIRST_CHILD (1ULL << 15) +#define GTK_CSS_CHANGE_SIBLING_LAST_CHILD (1ULL << 16) +#define GTK_CSS_CHANGE_SIBLING_NTH_CHILD (1ULL << 17) +#define GTK_CSS_CHANGE_SIBLING_NTH_LAST_CHILD (1ULL << 18) +#define GTK_CSS_CHANGE_SIBLING_STATE (1ULL << 19) +#define GTK_CSS_CHANGE_SIBLING_HOVER (1ULL << 20) +#define GTK_CSS_CHANGE_SIBLING_DISABLED (1ULL << 21) +#define GTK_CSS_CHANGE_SIBLING_BACKDROP (1ULL << 22) +#define GTK_CSS_CHANGE_SIBLING_SELECTED (1ULL << 23) #define GTK_CSS_CHANGE_PARENT_SHIFT (GTK_CSS_CHANGE_SIBLING_SHIFT + GTK_CSS_CHANGE_SIBLING_SHIFT) -#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_CLASS (1ULL << 24) +#define GTK_CSS_CHANGE_PARENT_NAME (1ULL << 25) +#define GTK_CSS_CHANGE_PARENT_ID (1ULL << 26) +#define GTK_CSS_CHANGE_PARENT_FIRST_CHILD (1ULL << 27) +#define GTK_CSS_CHANGE_PARENT_LAST_CHILD (1ULL << 28) +#define GTK_CSS_CHANGE_PARENT_NTH_CHILD (1ULL << 29) +#define GTK_CSS_CHANGE_PARENT_NTH_LAST_CHILD (1ULL << 30) +#define GTK_CSS_CHANGE_PARENT_STATE (1ULL << 31) +#define GTK_CSS_CHANGE_PARENT_HOVER (1ULL << 32) +#define GTK_CSS_CHANGE_PARENT_DISABLED (1ULL << 33) +#define GTK_CSS_CHANGE_PARENT_BACKDROP (1ULL << 34) +#define GTK_CSS_CHANGE_PARENT_SELECTED (1ULL << 35) #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 << 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) +#define GTK_CSS_CHANGE_PARENT_SIBLING_CLASS (1ULL << 36) +#define GTK_CSS_CHANGE_PARENT_SIBLING_ID (1ULL << 37) +#define GTK_CSS_CHANGE_PARENT_SIBLING_NAME (1ULL << 38) +#define GTK_CSS_CHANGE_PARENT_SIBLING_FIRST_CHILD (1ULL << 39) +#define GTK_CSS_CHANGE_PARENT_SIBLING_LAST_CHILD (1ULL << 40) +#define GTK_CSS_CHANGE_PARENT_SIBLING_NTH_CHILD (1ULL << 41) +#define GTK_CSS_CHANGE_PARENT_SIBLING_NTH_LAST_CHILD (1ULL << 42) +#define GTK_CSS_CHANGE_PARENT_SIBLING_STATE (1ULL << 43) +#define GTK_CSS_CHANGE_PARENT_SIBLING_HOVER (1ULL << 44) +#define GTK_CSS_CHANGE_PARENT_SIBLING_DISABLED (1ULL << 45) +#define GTK_CSS_CHANGE_PARENT_SIBLING_BACKDROP (1ULL << 46) +#define GTK_CSS_CHANGE_PARENT_SIBLING_SELECTED (1ULL << 47) /* add more */ -#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_SOURCE (1ULL << 48) +#define GTK_CSS_CHANGE_PARENT_STYLE (1ULL << 49) +#define GTK_CSS_CHANGE_TIMESTAMP (1ULL << 50) +#define GTK_CSS_CHANGE_ANIMATIONS (1ULL << 51) #define GTK_CSS_CHANGE_RESERVED_BIT (1ULL << 62) /* Used internally in gtkcssselector.c */ @@ -105,6 +109,7 @@ typedef guint64 GtkCssChange; GTK_CSS_CHANGE_STATE | \ GTK_CSS_CHANGE_DISABLED | \ GTK_CSS_CHANGE_BACKDROP | \ + GTK_CSS_CHANGE_SELECTED | \ 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) -- 2.30.2