[gtk/matthiasc/css-split-states: 3/4] css: Track backdrop state separately



commit 2426b9e23a300dfb45b806365547a49e52a0760a
Author: Matthias Clasen <mclasen redhat com>
Date:   Wed Jan 15 20:05:44 2020 -0500

    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

 gtk/gtkcssmatcher.c      |  2 +-
 gtk/gtkcssnode.c         |  5 ++-
 gtk/gtkcssselector.c     | 10 ++++++
 gtk/gtkcsstypes.c        | 11 +++++--
 gtk/gtkcsstypesprivate.h | 79 +++++++++++++++++++++++++-----------------------
 5 files changed, 66 insertions(+), 41 deletions(-)
---
diff --git a/gtk/gtkcssmatcher.c b/gtk/gtkcssmatcher.c
index b63875e1b2..00cddb6f96 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)) == 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;
diff --git a/gtk/gtkcssnode.c b/gtk/gtkcssnode.c
index 0f65796729..dc535e6332 100644
--- a/gtk/gtkcssnode.c
+++ b/gtk/gtkcssnode.c
@@ -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);
diff --git a/gtk/gtkcssselector.c b/gtk/gtkcssselector.c
index 690b2d0109..bd91856f9c 100644
--- a/gtk/gtkcssselector.c
+++ b/gtk/gtkcssselector.c
@@ -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,
diff --git a/gtk/gtkcsstypes.c b/gtk/gtkcsstypes.c
index 636bdd83bd..0406a7c837 100644
--- a/gtk/gtkcsstypes.c
+++ b/gtk/gtkcsstypes.c
@@ -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" },
diff --git a/gtk/gtkcsstypesprivate.h b/gtk/gtkcsstypesprivate.h
index 323b4f77a3..0c5fca945b 100644
--- a/gtk/gtkcsstypesprivate.h
+++ b/gtk/gtkcsstypesprivate.h
@@ -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_SIBLING_SHIFT 10 
-
-#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_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_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)


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]