diff --git a/gtk/gtkcssnode.c b/gtk/gtkcssnode.c index ec8a74a237..43a4be5231 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_RADICAL_CHANGE; + 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 e702953ba0..0aed811829 100644 --- a/gtk/gtkcssstaticstyle.c +++ b/gtk/gtkcssstaticstyle.c @@ -159,7 +159,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); } @@ -170,7 +171,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; @@ -182,7 +184,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,