mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2024-11-17 14:30:15 +00:00
cssnode: Refactor gtk_css_widget_node_validate()
Makes it clearer what actually happens in that function.
This commit is contained in:
parent
caf2fc9a10
commit
5f19f09ac3
@ -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;
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user