summaryrefslogtreecommitdiff
path: root/gtk/gtkcssnode.c
diff options
context:
space:
mode:
authorBenjamin Otte <otte@redhat.com>2015-02-25 18:05:07 +0100
committerBenjamin Otte <otte@redhat.com>2015-03-18 15:23:32 +0100
commit68b8f792d6edb7e5e67dbbba0991ce7dc1a7a449 (patch)
tree16dcb9f0d51ad1e215b5a24ae1e2503b3f905a7c /gtk/gtkcssnode.c
parent776d99ac516ca9754647bb3a582c53c07cd5c3cf (diff)
downloadgtk+-68b8f792d6edb7e5e67dbbba0991ce7dc1a7a449.tar.gz
cssnode: Redo style changed tracking
We don't return a NULL style to mean "no changes" anymore, instead we check new_style == old_style to mean that. Make sure the code reflects this, otherwise we'll send GTK_CSS_CHANGE_PARENT_STYLE invalidations everywhere and screw up performance.
Diffstat (limited to 'gtk/gtkcssnode.c')
-rw-r--r--gtk/gtkcssnode.c20
1 files changed, 10 insertions, 10 deletions
diff --git a/gtk/gtkcssnode.c b/gtk/gtkcssnode.c
index 64e6a3722e..585ead7ea3 100644
--- a/gtk/gtkcssnode.c
+++ b/gtk/gtkcssnode.c
@@ -588,12 +588,12 @@ gtk_css_node_get_next_sibling (GtkCssNode *cssnode)
return cssnode->next_sibling;
}
-static void
+static gboolean
gtk_css_node_set_style (GtkCssNode *cssnode,
GtkCssStyle *style)
{
if (cssnode->style == style)
- return;
+ return FALSE;
if (style)
g_object_ref (style);
@@ -602,6 +602,8 @@ gtk_css_node_set_style (GtkCssNode *cssnode,
g_object_unref (cssnode->style);
cssnode->style = style;
+
+ return TRUE;
}
static void
@@ -645,6 +647,7 @@ gtk_css_node_ensure_style (GtkCssNode *cssnode,
gint64 current_time)
{
GtkCssStyle *new_style;
+ gboolean style_changed;
if (!gtk_css_node_needs_new_style (cssnode))
return;
@@ -660,15 +663,12 @@ gtk_css_node_ensure_style (GtkCssNode *cssnode,
current_time,
cssnode->style);
- gtk_css_node_propagate_pending_changes (cssnode, new_style != NULL);
+ style_changed = gtk_css_node_set_style (cssnode, new_style);
+ g_object_unref (new_style);
- if (new_style)
- {
- gtk_css_node_set_style (cssnode, new_style);
- g_object_unref (new_style);
- cssnode->pending_changes = 0;
- }
-
+ gtk_css_node_propagate_pending_changes (cssnode, style_changed);
+
+ cssnode->pending_changes = 0;
cssnode->style_is_invalid = FALSE;
}