cssnode: Refactor gtk_css_widget_node_validate()

Makes it clearer what actually happens in that function.
This commit is contained in:
Benjamin Otte 2015-02-07 10:30:27 +01:00
parent caf2fc9a10
commit 5f19f09ac3
2 changed files with 64 additions and 58 deletions

View File

@ -23,6 +23,17 @@
G_DEFINE_TYPE (GtkCssPathNode, gtk_css_path_node, GTK_TYPE_CSS_NODE) G_DEFINE_TYPE (GtkCssPathNode, gtk_css_path_node, GTK_TYPE_CSS_NODE)
static void
gtk_css_path_node_finalize (GObject *object)
{
GtkCssPathNode *node = GTK_CSS_PATH_NODE (object);
if (node->path)
gtk_widget_path_unref (node->path);
G_OBJECT_CLASS (gtk_css_path_node_parent_class)->finalize (object);
}
static void static void
gtk_css_path_node_invalidate (GtkCssNode *node) gtk_css_path_node_invalidate (GtkCssNode *node)
{ {
@ -89,6 +100,9 @@ static void
gtk_css_path_node_class_init (GtkCssPathNodeClass *klass) gtk_css_path_node_class_init (GtkCssPathNodeClass *klass)
{ {
GtkCssNodeClass *node_class = GTK_CSS_NODE_CLASS (klass); GtkCssNodeClass *node_class = GTK_CSS_NODE_CLASS (klass);
GObjectClass *object_class = G_OBJECT_CLASS (klass);
object_class->finalize = gtk_css_path_node_finalize;
node_class->invalidate = gtk_css_path_node_invalidate; node_class->invalidate = gtk_css_path_node_invalidate;
node_class->set_invalid = gtk_css_path_node_set_invalid; node_class->set_invalid = gtk_css_path_node_set_invalid;

View File

@ -58,22 +58,41 @@ gtk_css_widget_node_set_invalid (GtkCssNode *node,
} }
static gboolean static gboolean
gtk_css_style_needs_full_revalidate (GtkCssStyle *style, gtk_css_static_style_needs_revalidate (GtkCssStaticStyle *style,
GtkCssChange change) GtkCssChange change)
{ {
/* Try to avoid invalidating if we can */ /* Try to avoid invalidating if we can */
if (change & GTK_CSS_RADICAL_CHANGE) if (change & GTK_CSS_RADICAL_CHANGE)
return TRUE; return TRUE;
if (GTK_IS_CSS_ANIMATED_STYLE (style)) if (gtk_css_static_style_get_change (style) & change)
style = GTK_CSS_ANIMATED_STYLE (style)->style;
if (gtk_css_static_style_get_change (GTK_CSS_STATIC_STYLE (style)) & change)
return TRUE; return TRUE;
else else
return FALSE; return FALSE;
} }
static GtkCssStyle *
validate_static_style (GtkCssNode *node,
GtkCssStyle *style,
GtkCssChange change,
const GtkBitmask *parent_changes)
{
if (gtk_css_static_style_needs_revalidate (GTK_CSS_STATIC_STYLE (style), change))
{
return gtk_css_node_create_style (node);
}
else if (!_gtk_bitmask_is_empty (parent_changes))
{
return gtk_css_node_update_style (node,
style,
parent_changes);
}
else
{
return g_object_ref (style);
}
}
static GtkBitmask * static GtkBitmask *
gtk_css_widget_node_validate (GtkCssNode *node, gtk_css_widget_node_validate (GtkCssNode *node,
gint64 timestamp, gint64 timestamp,
@ -83,7 +102,8 @@ gtk_css_widget_node_validate (GtkCssNode *node,
GtkCssWidgetNode *widget_node = GTK_CSS_WIDGET_NODE (node); GtkCssWidgetNode *widget_node = GTK_CSS_WIDGET_NODE (node);
GtkStyleContext *context; GtkStyleContext *context;
GtkBitmask *changes; GtkBitmask *changes;
GtkCssStyle *style; GtkCssStyle *style, *static_style;
GtkCssStyle *new_style, *new_static_style;
if (widget_node->widget == NULL) if (widget_node->widget == NULL)
return _gtk_bitmask_new (); return _gtk_bitmask_new ();
@ -92,72 +112,44 @@ gtk_css_widget_node_validate (GtkCssNode *node,
style = gtk_css_node_get_style (node); style = gtk_css_node_get_style (node);
if (style == NULL) if (style == NULL)
style = gtk_css_static_style_get_default (); style = gtk_css_static_style_get_default ();
g_object_ref (style);
/* Try to avoid invalidating if we can */ if (GTK_IS_CSS_ANIMATED_STYLE (style))
if (gtk_css_style_needs_full_revalidate (style, change))
{ {
GtkCssStyle *new_style, *static_style; static_style = GTK_CSS_ANIMATED_STYLE (style)->style;
GtkCssNode *parent; }
else
{
static_style = style;
}
parent = gtk_css_node_get_parent (node); new_static_style = validate_static_style (node, static_style, change, parent_changes);
static_style = gtk_css_node_create_style (node); if (new_static_style != static_style)
new_style = gtk_css_animated_style_new (static_style, {
GtkCssNode *parent = gtk_css_node_get_parent (node);
new_style = gtk_css_animated_style_new (new_static_style,
parent ? gtk_css_node_get_style (parent) : NULL, parent ? gtk_css_node_get_style (parent) : NULL,
timestamp, timestamp,
gtk_css_node_get_style_provider (node), gtk_css_node_get_style_provider (node),
gtk_style_context_should_create_transitions (context, style) ? style : NULL); gtk_style_context_should_create_transitions (context, style) ? style : NULL);
g_object_unref (new_static_style);
}
else if (GTK_IS_CSS_ANIMATED_STYLE (style))
{
new_style = gtk_css_animated_style_new_advance (GTK_CSS_ANIMATED_STYLE (style),
static_style,
timestamp);
}
else
{
new_style = g_object_ref (style);
}
changes = gtk_css_style_get_difference (new_style, style);
gtk_css_node_set_style (node, new_style); gtk_css_node_set_style (node, new_style);
g_object_unref (static_style);
g_object_unref (new_style); g_object_unref (new_style);
}
else
{
if (!_gtk_bitmask_is_empty (parent_changes))
{
GtkCssStyle *new_values;
if (GTK_IS_CSS_ANIMATED_STYLE (style))
{
GtkCssStyle *new_base;
new_base = gtk_css_node_update_style (node,
GTK_CSS_ANIMATED_STYLE (style)->style,
parent_changes);
new_values = gtk_css_animated_style_new_advance (GTK_CSS_ANIMATED_STYLE (style),
new_base,
timestamp);
g_object_unref (new_base);
}
else
{
new_values = gtk_css_node_update_style (node,
style,
parent_changes);
}
gtk_css_node_set_style (node, new_values);
g_object_unref (new_values);
}
else if ((change & GTK_CSS_CHANGE_ANIMATE) &&
GTK_IS_CSS_ANIMATED_STYLE (style))
{
GtkCssStyle *new_values;
new_values = gtk_css_animated_style_new_advance (GTK_CSS_ANIMATED_STYLE (style),
GTK_CSS_ANIMATED_STYLE (style)->style,
timestamp);
gtk_css_node_set_style (node, new_values);
g_object_unref (new_values);
}
}
changes = gtk_css_style_get_difference (gtk_css_node_get_style (node), style);
g_object_unref (style);
gtk_style_context_validate (context, changes); gtk_style_context_validate (context, changes);