diff options
author | Benjamin Otte <otte@redhat.com> | 2015-02-22 08:23:04 +0100 |
---|---|---|
committer | Benjamin Otte <otte@redhat.com> | 2015-03-18 15:23:32 +0100 |
commit | 6dd19306eb982597fcf8e9d809128cef5c952dd3 (patch) | |
tree | 05c21d7b10e460d551eb78e89ff11de1cc659402 /gtk | |
parent | f43543165be4aa3a0732bcbd01559bb21e1f72b1 (diff) | |
download | gtk+-6dd19306eb982597fcf8e9d809128cef5c952dd3.tar.gz |
cssnode: Create animated styles by default
... and hardcode transient and path nodes to never create animated
styles.
Diffstat (limited to 'gtk')
-rw-r--r-- | gtk/gtkcssnode.c | 55 | ||||
-rw-r--r-- | gtk/gtkcsspathnode.c | 11 | ||||
-rw-r--r-- | gtk/gtkcsstransientnode.c | 11 |
3 files changed, 72 insertions, 5 deletions
diff --git a/gtk/gtkcssnode.c b/gtk/gtkcssnode.c index d6c2c40933..2c032ed989 100644 --- a/gtk/gtkcssnode.c +++ b/gtk/gtkcssnode.c @@ -207,6 +207,12 @@ gtk_css_node_create_style (GtkCssNode *cssnode) } static gboolean +should_create_transitions (GtkCssChange change) +{ + return (change & GTK_CSS_CHANGE_ANIMATIONS) == 0; +} + +static gboolean gtk_css_style_needs_recreation (GtkCssStyle *style, GtkCssChange change) { @@ -225,14 +231,53 @@ gtk_css_style_needs_recreation (GtkCssStyle *style, static GtkCssStyle * gtk_css_node_real_update_style (GtkCssNode *cssnode, - GtkCssChange pending_change, + GtkCssChange change, gint64 timestamp, - GtkCssStyle *old_style) + GtkCssStyle *style) { - if (!gtk_css_style_needs_recreation (old_style, pending_change)) - return g_object_ref (old_style); + GtkCssStyle *static_style, *new_static_style, *new_style; + + 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 gtk_css_node_create_style (cssnode); + return new_style; } static void diff --git a/gtk/gtkcsspathnode.c b/gtk/gtkcsspathnode.c index 50a1cc3e08..e9b5298733 100644 --- a/gtk/gtkcsspathnode.c +++ b/gtk/gtkcsspathnode.c @@ -101,6 +101,16 @@ gtk_css_path_node_real_get_widget_path (GtkCssNode *node) 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 * 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; 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->create_widget_path = gtk_css_path_node_real_create_widget_path; node_class->get_widget_path = gtk_css_path_node_real_get_widget_path; diff --git a/gtk/gtkcsstransientnode.c b/gtk/gtkcsstransientnode.c index e3d68b4149..a8485f0858 100644 --- a/gtk/gtkcsstransientnode.c +++ b/gtk/gtkcsstransientnode.c @@ -52,6 +52,16 @@ gtk_css_transient_node_get_widget_path (GtkCssNode *node) 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 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->get_widget_path = gtk_css_transient_node_get_widget_path; + node_class->update_style = gtk_css_transient_node_update_style; } static void |