From ad199e4cf96592fb57d0a58861270d82b0a453d3 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Sun, 21 Dec 2014 21:30:51 +0100 Subject: [PATCH] stylecontext: Use correct parent style for lookups After 3a337156d11a86c7a88f1f30a09276fdf6f63008 style lookups still used the parent context's style as the parent style, even though after a gtk_style_context_save() the root style of the style context is the proper parent. Testcase attached. --- gtk/gtkstylecontext.c | 26 ++++++++++++------- testsuite/reftests/Makefile.am | 3 +++ .../style-context-save-inheritance.css | 18 +++++++++++++ .../style-context-save-inheritance.ref.ui | 19 ++++++++++++++ .../style-context-save-inheritance.ui | 18 +++++++++++++ 5 files changed, 75 insertions(+), 9 deletions(-) create mode 100644 testsuite/reftests/style-context-save-inheritance.css create mode 100644 testsuite/reftests/style-context-save-inheritance.ref.ui create mode 100644 testsuite/reftests/style-context-save-inheritance.ui diff --git a/gtk/gtkstylecontext.c b/gtk/gtkstylecontext.c index 2b34d0d2e7..c7c39f8653 100644 --- a/gtk/gtkstylecontext.c +++ b/gtk/gtkstylecontext.c @@ -652,8 +652,9 @@ gtk_style_context_is_saved (GtkStyleContext *context) } static GtkWidgetPath * -create_query_path (GtkStyleContext *context, - const GtkCssNodeDeclaration *decl) +create_query_path (GtkStyleContext *context, + const GtkCssNodeDeclaration *decl, + GtkCssStyle **out_parent) { GtkStyleContextPrivate *priv; GtkWidgetPath *path; @@ -671,11 +672,13 @@ create_query_path (GtkStyleContext *context, gtk_widget_path_append_type (path, length > 0 ? gtk_widget_path_iter_get_object_type (path, length - 1) : G_TYPE_NONE); gtk_css_node_declaration_add_to_widget_path (decl, path, length); + *out_parent = root->values; } else { if (length > 0) gtk_css_node_declaration_add_to_widget_path (decl, path, length - 1); + *out_parent = priv->parent ? style_values_lookup (priv->parent) : NULL; } return path; @@ -690,11 +693,11 @@ update_properties (GtkStyleContext *context, GtkStyleContextPrivate *priv; GtkCssMatcher matcher; GtkWidgetPath *path; - GtkCssStyle *result; + GtkCssStyle *result, *parent; priv = context->priv; - path = create_query_path (context, decl); + path = create_query_path (context, decl, &parent); if (!_gtk_css_matcher_init (&matcher, path)) { @@ -706,7 +709,7 @@ update_properties (GtkStyleContext *context, GTK_STYLE_PROVIDER_PRIVATE (priv->cascade), &matcher, priv->scale, - priv->parent ? style_values_lookup (priv->parent) : NULL); + parent); gtk_widget_path_free (path); @@ -721,23 +724,23 @@ build_properties (GtkStyleContext *context, GtkStyleContextPrivate *priv; GtkCssMatcher matcher; GtkWidgetPath *path; - GtkCssStyle *style; + GtkCssStyle *style, *parent; priv = context->priv; - path = create_query_path (context, decl); + path = create_query_path (context, decl, &parent); if (_gtk_css_matcher_init (&matcher, path)) style = gtk_css_static_style_new_compute (GTK_STYLE_PROVIDER_PRIVATE (priv->cascade), &matcher, priv->scale, - priv->parent ? style_values_lookup (priv->parent) : NULL, + parent, out_change); else style = gtk_css_static_style_new_compute (GTK_STYLE_PROVIDER_PRIVATE (priv->cascade), NULL, priv->scale, - priv->parent ? style_values_lookup (priv->parent) : NULL, + parent, out_change); gtk_widget_path_free (path); @@ -1500,6 +1503,11 @@ gtk_style_context_save (GtkStyleContext *context) priv = context->priv; + /* Make sure we have the style existing. It is the + * parent of the new saved node after all. */ + if (!gtk_style_context_is_saved (context)) + style_values_lookup (context); + priv->saved_nodes = g_slist_prepend (priv->saved_nodes, priv->info); priv->info = style_info_copy (priv->info); diff --git a/testsuite/reftests/Makefile.am b/testsuite/reftests/Makefile.am index b4b2bc89f7..1577dade4b 100644 --- a/testsuite/reftests/Makefile.am +++ b/testsuite/reftests/Makefile.am @@ -397,6 +397,9 @@ testdata = \ sizegroups-get-preferred-null.ref.ui \ statusbar-remove-all.ref.ui \ statusbar-remove-all.ui \ + style-context-save-inheritance.css \ + style-context-save-inheritance.ref.ui \ + style-context-save-inheritance.ui \ style-properties-nth-child.css \ style-properties-nth-child.ref.ui \ style-properties-nth-child.ui \ diff --git a/testsuite/reftests/style-context-save-inheritance.css b/testsuite/reftests/style-context-save-inheritance.css new file mode 100644 index 0000000000..3f3630c06e --- /dev/null +++ b/testsuite/reftests/style-context-save-inheritance.css @@ -0,0 +1,18 @@ +@import "reset-to-defaults.css"; + +.background { + color: red; +} + +GtkLabel { + color: green; +} + +GtkLabel:link, +GtkLabel:visited { + color: inherit; +} + +#reference, #reference * { + color: green; +} diff --git a/testsuite/reftests/style-context-save-inheritance.ref.ui b/testsuite/reftests/style-context-save-inheritance.ref.ui new file mode 100644 index 0000000000..09b5af581a --- /dev/null +++ b/testsuite/reftests/style-context-save-inheritance.ref.ui @@ -0,0 +1,19 @@ + + + + + + False + popup + + + reference + True + False + GREEN +<a href="http://www.gtk.org">GREEN</a> + True + + + + diff --git a/testsuite/reftests/style-context-save-inheritance.ui b/testsuite/reftests/style-context-save-inheritance.ui new file mode 100644 index 0000000000..022033b22c --- /dev/null +++ b/testsuite/reftests/style-context-save-inheritance.ui @@ -0,0 +1,18 @@ + + + + + + False + popup + + + True + False + GREEN +<a href="http://www.gtk.org">GREEN</a> + True + + + +