From 305fbd2a5d3147d3d3b44ecc4ee6a20fe865a722 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Wed, 15 Jan 2020 02:35:21 -0500 Subject: [PATCH] css: Avoid computing change too often Most of the time when styles need to be recreated, the name and classes of the css node haven't changed. In this case, the change value will not either, since we are computing change under the assumption that name and classes are unchanged, so there is no need to recompute the change. --- gtk/gtkcssnode.c | 20 ++++++++++++++++---- gtk/gtkcssstaticstyle.c | 8 +++++--- gtk/gtkcssstaticstyleprivate.h | 3 ++- 3 files changed, 23 insertions(+), 8 deletions(-) diff --git a/gtk/gtkcssnode.c b/gtk/gtkcssnode.c index ec8a74a237..69cc3db7c9 100644 --- a/gtk/gtkcssnode.c +++ b/gtk/gtkcssnode.c @@ -349,12 +349,14 @@ store_in_global_parent_cache (GtkCssNode *node, } static GtkCssStyle * -gtk_css_node_create_style (GtkCssNode *cssnode) +gtk_css_node_create_style (GtkCssNode *cssnode, + GtkCssChange change) { const GtkCssNodeDeclaration *decl; GtkCssMatcher matcher; GtkCssStyle *parent; GtkCssStyle *style; + gboolean compute_change; decl = gtk_css_node_get_declaration (cssnode); @@ -364,14 +366,24 @@ gtk_css_node_create_style (GtkCssNode *cssnode) parent = cssnode->parent ? cssnode->parent->style : NULL; + compute_change = change & (GTK_CSS_CHANGE_ID | GTK_CSS_CHANGE_NAME | GTK_CSS_CHANGE_CLASS | GTK_CSS_CHANGE_SOURCE); + if (gtk_css_node_init_matcher (cssnode, &matcher)) style = gtk_css_static_style_new_compute (gtk_css_node_get_style_provider (cssnode), &matcher, - parent); + parent, + compute_change); else style = gtk_css_static_style_new_compute (gtk_css_node_get_style_provider (cssnode), NULL, - parent); + parent, + compute_change); + + if (!compute_change) + { + GtkCssStyle *old_style = gtk_css_style_get_static_style (cssnode->style); + ((GtkCssStaticStyle *)style)->change = ((GtkCssStaticStyle *)old_style)->change; + } store_in_global_parent_cache (cssnode, decl, style); @@ -411,7 +423,7 @@ gtk_css_node_real_update_style (GtkCssNode *cssnode, static_style = gtk_css_style_get_static_style (style); if (gtk_css_style_needs_recreation (static_style, change)) - new_static_style = gtk_css_node_create_style (cssnode); + new_static_style = gtk_css_node_create_style (cssnode, change); else new_static_style = g_object_ref (static_style); diff --git a/gtk/gtkcssstaticstyle.c b/gtk/gtkcssstaticstyle.c index 6cb835d6e2..1e1943f455 100644 --- a/gtk/gtkcssstaticstyle.c +++ b/gtk/gtkcssstaticstyle.c @@ -158,7 +158,8 @@ gtk_css_static_style_get_default (void) settings = gtk_settings_get_default (); default_style = gtk_css_static_style_new_compute (GTK_STYLE_PROVIDER (settings), NULL, - NULL); + NULL, + TRUE); g_object_set_data_full (G_OBJECT (settings), I_("gtk-default-style"), default_style, clear_default_style); } @@ -169,7 +170,8 @@ gtk_css_static_style_get_default (void) GtkCssStyle * gtk_css_static_style_new_compute (GtkStyleProvider *provider, const GtkCssMatcher *matcher, - GtkCssStyle *parent) + GtkCssStyle *parent, + gboolean compute_change) { GtkCssStaticStyle *result; GtkCssLookup lookup; @@ -181,7 +183,7 @@ gtk_css_static_style_new_compute (GtkStyleProvider *provider, gtk_style_provider_lookup (provider, matcher, &lookup, - &change); + compute_change ? &change : NULL); result = g_object_new (GTK_TYPE_CSS_STATIC_STYLE, NULL); diff --git a/gtk/gtkcssstaticstyleprivate.h b/gtk/gtkcssstaticstyleprivate.h index 2a00dd0372..aae6dcd056 100644 --- a/gtk/gtkcssstaticstyleprivate.h +++ b/gtk/gtkcssstaticstyleprivate.h @@ -55,7 +55,8 @@ GType gtk_css_static_style_get_type (void) G_GNUC_CO GtkCssStyle * gtk_css_static_style_get_default (void); GtkCssStyle * gtk_css_static_style_new_compute (GtkStyleProvider *provider, const GtkCssMatcher *matcher, - GtkCssStyle *parent); + GtkCssStyle *parent, + gboolean compute_change); void gtk_css_static_style_compute_value (GtkCssStaticStyle *style, GtkStyleProvider *provider,