[gtk+] stylecontext: Don't crah when invalidate() is called on saved context
- From: Benjamin Otte <otte src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] stylecontext: Don't crah when invalidate() is called on saved context
- Date: Wed, 4 Feb 2015 20:20:56 +0000 (UTC)
commit edec64cda3d4518b4e87d5ea5d287d4570ba9933
Author: Benjamin Otte <otte redhat com>
Date: Wed Feb 4 21:08:54 2015 +0100
stylecontext: Don't crah when invalidate() is called on saved context
We need to invalidate the root node, not the current one.
Fixes crashes on startup of eclipse.
Testcase included.
https://bugzilla.redhat.com/show_bug.cgi?id=1185828
gtk/gtkstylecontext.c | 12 +++++++-----
testsuite/gtk/stylecontext.c | 19 +++++++++++++++++++
2 files changed, 26 insertions(+), 5 deletions(-)
---
diff --git a/gtk/gtkstylecontext.c b/gtk/gtkstylecontext.c
index 941410f..959857d 100644
--- a/gtk/gtkstylecontext.c
+++ b/gtk/gtkstylecontext.c
@@ -3108,17 +3108,19 @@ gtk_style_context_invalidate (GtkStyleContext *context)
{
GtkBitmask *changes;
GtkCssStyle *style;
+ GtkCssNode *root;
g_return_if_fail (GTK_IS_STYLE_CONTEXT (context));
gtk_style_context_clear_cache (context);
+ gtk_css_node_set_values (context->priv->cssnode, NULL);
- /* insta-recalculate the new style here */
+ root = gtk_style_context_get_root (context);
style = build_properties (context,
- context->priv->cssnode->decl,
- !gtk_style_context_is_saved (context),
- gtk_css_node_get_parent_style (context, context->priv->cssnode));
- gtk_css_node_set_values (context->priv->cssnode, style);
+ root->decl,
+ TRUE,
+ gtk_css_node_get_parent_style (context, root));
+ gtk_css_node_set_values (root, style);
g_object_unref (style);
if (!gtk_style_context_is_saved (context))
diff --git a/testsuite/gtk/stylecontext.c b/testsuite/gtk/stylecontext.c
index 55bd2c7..9ed3b58 100644
--- a/testsuite/gtk/stylecontext.c
+++ b/testsuite/gtk/stylecontext.c
@@ -289,6 +289,24 @@ test_basic_properties (void)
g_object_unref (context);
}
+void
+test_invalidate_saved (void)
+{
+ GtkWidget *window;
+ GtkStyleContext *context;
+
+ window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+
+ context = gtk_widget_get_style_context (window);
+ gtk_style_context_save (context);
+G_GNUC_BEGIN_IGNORE_DEPRECATIONS
+ gtk_style_context_invalidate (context);
+G_GNUC_END_IGNORE_DEPRECATIONS
+ gtk_style_context_restore (context);
+
+ gtk_widget_destroy (window);
+}
+
int
main (int argc, char *argv[])
{
@@ -299,6 +317,7 @@ main (int argc, char *argv[])
g_test_add_func ("/style/path", test_path);
g_test_add_func ("/style/match", test_match);
g_test_add_func ("/style/basic", test_basic_properties);
+ g_test_add_func ("/style/invalidate-saved", test_invalidate_saved);
return g_test_run ();
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]