[gtk/matthiasc/css-change-tracking: 2/2] css: Avoid computing change too often
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/matthiasc/css-change-tracking: 2/2] css: Avoid computing change too often
- Date: Thu, 16 Jan 2020 17:24:59 +0000 (UTC)
commit e077e81d380f983c6291857069e7f3beca287846
Author: Matthias Clasen <mclasen redhat com>
Date: Wed Jan 15 02:35:21 2020 -0500
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
change either, since we are computing change under the assumption that
name and classes are unchanged.
So don't recompute the change. This avoids the second match we do to
find the superset, cutting down the number of times we consult the
selector tree.
gtk/gtkcssnode.c | 23 +++++++++++++++++++----
gtk/gtkcssstaticstyle.c | 9 +++++----
gtk/gtkcssstaticstyleprivate.h | 3 ++-
3 files changed, 26 insertions(+), 9 deletions(-)
---
diff --git a/gtk/gtkcssnode.c b/gtk/gtkcssnode.c
index 3dfb8e5a83..58189c069b 100644
--- a/gtk/gtkcssnode.c
+++ b/gtk/gtkcssnode.c
@@ -348,12 +348,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;
+ GtkCssChange change_flags;
decl = gtk_css_node_get_declaration (cssnode);
@@ -363,14 +365,27 @@ gtk_css_node_create_style (GtkCssNode *cssnode)
parent = cssnode->parent ? cssnode->parent->style : NULL;
+ if (change & (GTK_CSS_CHANGE_ID | GTK_CSS_CHANGE_NAME | GTK_CSS_CHANGE_CLASS | GTK_CSS_CHANGE_SOURCE))
+ {
+ /* Need to recompute the change flags */
+ change_flags = 0;
+ }
+ else
+ {
+ style = gtk_css_style_get_static_style (cssnode->style);
+ change_flags = gtk_css_static_style_get_change (GTK_CSS_STATIC_STYLE (style));
+ }
+
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,
+ change_flags);
else
style = gtk_css_static_style_new_compute (gtk_css_node_get_style_provider (cssnode),
NULL,
- parent);
+ parent,
+ change_flags);
store_in_global_parent_cache (cssnode, decl, style);
@@ -410,7 +425,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..96fb3200cf 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,11 +170,11 @@ gtk_css_static_style_get_default (void)
GtkCssStyle *
gtk_css_static_style_new_compute (GtkStyleProvider *provider,
const GtkCssMatcher *matcher,
- GtkCssStyle *parent)
+ GtkCssStyle *parent,
+ GtkCssChange change)
{
GtkCssStaticStyle *result;
GtkCssLookup lookup;
- GtkCssChange change = GTK_CSS_CHANGE_ANY_SELF | GTK_CSS_CHANGE_ANY_SIBLING | GTK_CSS_CHANGE_ANY_PARENT;
_gtk_css_lookup_init (&lookup);
@@ -181,7 +182,7 @@ gtk_css_static_style_new_compute (GtkStyleProvider *provider,
gtk_style_provider_lookup (provider,
matcher,
&lookup,
- &change);
+ change == 0 ? &change : NULL);
result = g_object_new (GTK_TYPE_CSS_STATIC_STYLE, NULL);
diff --git a/gtk/gtkcssstaticstyleprivate.h b/gtk/gtkcssstaticstyleprivate.h
index 2a00dd0372..5ae07cd4f3 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,
+ GtkCssChange change_flags);
void gtk_css_static_style_compute_value (GtkCssStaticStyle *style,
GtkStyleProvider *provider,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]