cssnode: Create animated styles by default

... and hardcode transient and path nodes to never create animated
styles.
This commit is contained in:
Benjamin Otte 2015-02-22 08:23:04 +01:00
parent f43543165b
commit 6dd19306eb
3 changed files with 72 additions and 5 deletions

View File

@ -206,6 +206,12 @@ gtk_css_node_create_style (GtkCssNode *cssnode)
return style; return style;
} }
static gboolean
should_create_transitions (GtkCssChange change)
{
return (change & GTK_CSS_CHANGE_ANIMATIONS) == 0;
}
static gboolean static gboolean
gtk_css_style_needs_recreation (GtkCssStyle *style, gtk_css_style_needs_recreation (GtkCssStyle *style,
GtkCssChange change) GtkCssChange change)
@ -225,14 +231,53 @@ gtk_css_style_needs_recreation (GtkCssStyle *style,
static GtkCssStyle * static GtkCssStyle *
gtk_css_node_real_update_style (GtkCssNode *cssnode, gtk_css_node_real_update_style (GtkCssNode *cssnode,
GtkCssChange pending_change, GtkCssChange change,
gint64 timestamp, gint64 timestamp,
GtkCssStyle *old_style) GtkCssStyle *style)
{ {
if (!gtk_css_style_needs_recreation (old_style, pending_change)) GtkCssStyle *static_style, *new_static_style, *new_style;
return g_object_ref (old_style);
return gtk_css_node_create_style (cssnode); if (GTK_IS_CSS_ANIMATED_STYLE (style))
{
static_style = GTK_CSS_ANIMATED_STYLE (style)->style;
}
else
{
static_style = style;
}
if (gtk_css_style_needs_recreation (static_style, change))
new_static_style = gtk_css_node_create_style (cssnode);
else
new_static_style = g_object_ref (static_style);
if (new_static_style != static_style || (change & GTK_CSS_CHANGE_ANIMATIONS))
{
GtkCssNode *parent = gtk_css_node_get_parent (cssnode);
new_style = gtk_css_animated_style_new (new_static_style,
parent ? gtk_css_node_get_style (parent) : NULL,
timestamp,
gtk_css_node_get_style_provider (cssnode),
should_create_transitions (change) ? style : NULL);
}
else if (GTK_IS_CSS_ANIMATED_STYLE (style) && (change & GTK_CSS_CHANGE_TIMESTAMP))
{
new_style = gtk_css_animated_style_new_advance (GTK_CSS_ANIMATED_STYLE (style),
static_style,
timestamp);
}
else
{
new_style = g_object_ref (style);
}
if (GTK_IS_CSS_ANIMATED_STYLE (new_style) &&
!gtk_css_animated_style_is_static (GTK_CSS_ANIMATED_STYLE (new_style)))
gtk_css_node_set_invalid (cssnode, TRUE);
g_object_unref (new_static_style);
return new_style;
} }
static void static void

View File

@ -101,6 +101,16 @@ gtk_css_path_node_real_get_widget_path (GtkCssNode *node)
return path_node->path; return path_node->path;
} }
static GtkCssStyle *
gtk_css_path_node_update_style (GtkCssNode *cssnode,
GtkCssChange change,
gint64 timestamp,
GtkCssStyle *style)
{
/* This should get rid of animations */
return GTK_CSS_NODE_CLASS (gtk_css_path_node_parent_class)->update_style (cssnode, change, 0, style);
}
static GtkStyleProviderPrivate * static GtkStyleProviderPrivate *
gtk_css_path_node_get_style_provider (GtkCssNode *node) gtk_css_path_node_get_style_provider (GtkCssNode *node)
{ {
@ -121,6 +131,7 @@ gtk_css_path_node_class_init (GtkCssPathNodeClass *klass)
object_class->finalize = gtk_css_path_node_finalize; 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->update_style = gtk_css_path_node_update_style;
node_class->init_matcher = gtk_css_path_node_real_init_matcher; node_class->init_matcher = gtk_css_path_node_real_init_matcher;
node_class->create_widget_path = gtk_css_path_node_real_create_widget_path; node_class->create_widget_path = gtk_css_path_node_real_create_widget_path;
node_class->get_widget_path = gtk_css_path_node_real_get_widget_path; node_class->get_widget_path = gtk_css_path_node_real_get_widget_path;

View File

@ -52,6 +52,16 @@ gtk_css_transient_node_get_widget_path (GtkCssNode *node)
return gtk_css_node_get_widget_path (parent); return gtk_css_node_get_widget_path (parent);
} }
static GtkCssStyle *
gtk_css_transient_node_update_style (GtkCssNode *cssnode,
GtkCssChange change,
gint64 timestamp,
GtkCssStyle *style)
{
/* This should get rid of animations */
return GTK_CSS_NODE_CLASS (gtk_css_transient_node_parent_class)->update_style (cssnode, change, 0, style);
}
static void static void
gtk_css_transient_node_class_init (GtkCssTransientNodeClass *klass) gtk_css_transient_node_class_init (GtkCssTransientNodeClass *klass)
{ {
@ -59,6 +69,7 @@ gtk_css_transient_node_class_init (GtkCssTransientNodeClass *klass)
node_class->create_widget_path = gtk_css_transient_node_create_widget_path; node_class->create_widget_path = gtk_css_transient_node_create_widget_path;
node_class->get_widget_path = gtk_css_transient_node_get_widget_path; node_class->get_widget_path = gtk_css_transient_node_get_widget_path;
node_class->update_style = gtk_css_transient_node_update_style;
} }
static void static void