From 79f73921096e795d92257d7ce063161aece057da Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Sun, 14 Dec 2014 17:06:27 +0100 Subject: [PATCH] stylecontext: Make static styles static Instead of keeping an animated style everywhere, we replace it with the static style when nothing gets animated. Apart from making the code cleaner, this gets rid of a bunch of animated style values that do nothing but wrap a static style. --- gtk/gtkcssanimatedstyle.c | 62 ++++++++++++++++++-------------- gtk/gtkcssanimatedstyleprivate.h | 6 ++-- gtk/gtkstylecontext.c | 30 +++++++++++----- 3 files changed, 61 insertions(+), 37 deletions(-) diff --git a/gtk/gtkcssanimatedstyle.c b/gtk/gtkcssanimatedstyle.c index efbce2490b..baf5be6796 100644 --- a/gtk/gtkcssanimatedstyle.c +++ b/gtk/gtkcssanimatedstyle.c @@ -117,13 +117,20 @@ gtk_css_animated_style_class_init (GtkCssAnimatedStyleClass *klass) static void gtk_css_animated_style_init (GtkCssAnimatedStyle *style) { - style->style = gtk_css_static_style_new (); } GtkCssStyle * -gtk_css_animated_style_new (void) +gtk_css_animated_style_new (GtkCssStyle *style) { - return g_object_new (GTK_TYPE_CSS_ANIMATED_STYLE, NULL); + GtkCssAnimatedStyle *result; + + g_return_val_if_fail (GTK_IS_CSS_STYLE (style), NULL); + + result = g_object_new (GTK_TYPE_CSS_ANIMATED_STYLE, NULL); + + result->style = g_object_ref (style); + + return GTK_CSS_STYLE (result); } void @@ -254,7 +261,7 @@ gtk_css_animated_style_find_transition (GtkCssAnimatedStyle *style, static void gtk_css_animated_style_create_css_transitions (GtkCssAnimatedStyle *style, gint64 timestamp, - GtkCssAnimatedStyle *source) + GtkCssStyle *source) { TransitionInfo transitions[GTK_CSS_PROPERTY_N_PROPERTIES] = { { 0, } }; GtkCssValue *durations, *delays, *timing_functions; @@ -280,23 +287,26 @@ gtk_css_animated_style_create_css_transitions (GtkCssAnimatedStyle *style, if (duration + delay == 0.0) continue; - start = gtk_css_animated_style_get_intrinsic_value (source, i); - end = gtk_css_animated_style_get_intrinsic_value (style, i); - if (_gtk_css_value_equal (start, end)) + if (GTK_IS_CSS_ANIMATED_STYLE (source)) { - animation = gtk_css_animated_style_find_transition (GTK_CSS_ANIMATED_STYLE (source), i); - if (animation) - style->animations = g_slist_prepend (style->animations, g_object_ref (animation)); - } - else - { - animation = _gtk_css_transition_new (i, - gtk_css_style_get_value (GTK_CSS_STYLE (source), i), - _gtk_css_array_value_get_nth (timing_functions, i), - timestamp + delay * G_USEC_PER_SEC, - timestamp + (delay + duration) * G_USEC_PER_SEC); - style->animations = g_slist_prepend (style->animations, animation); + start = gtk_css_animated_style_get_intrinsic_value (GTK_CSS_ANIMATED_STYLE (source), i); + end = gtk_css_animated_style_get_intrinsic_value (style, i); + if (_gtk_css_value_equal (start, end)) + { + animation = gtk_css_animated_style_find_transition (GTK_CSS_ANIMATED_STYLE (source), i); + if (animation) + style->animations = g_slist_prepend (style->animations, g_object_ref (animation)); + + continue; + } } + + animation = _gtk_css_transition_new (i, + gtk_css_style_get_value (source, i), + _gtk_css_array_value_get_nth (timing_functions, i), + timestamp + delay * G_USEC_PER_SEC, + timestamp + (delay + duration) * G_USEC_PER_SEC); + style->animations = g_slist_prepend (style->animations, animation); } } @@ -320,11 +330,11 @@ gtk_css_animated_style_find_animation (GtkCssAnimatedStyle *style, static void gtk_css_animated_style_create_css_animations (GtkCssAnimatedStyle *style, - GtkCssAnimatedStyle *parent_style, + GtkCssStyle *parent_style, gint64 timestamp, GtkStyleProviderPrivate *provider, int scale, - GtkCssAnimatedStyle *source) + GtkCssStyle *source) { GtkCssValue *durations, *delays, *timing_functions, *animations; GtkCssValue *iteration_counts, *directions, *play_states, *fill_modes; @@ -353,8 +363,8 @@ gtk_css_animated_style_create_css_animations (GtkCssAnimatedStyle *style, if (animation) continue; - if (source) - animation = gtk_css_animated_style_find_animation (source, name); + if (GTK_IS_CSS_ANIMATED_STYLE (source)) + animation = gtk_css_animated_style_find_animation (GTK_CSS_ANIMATED_STYLE (source), name); if (animation) { @@ -368,7 +378,7 @@ gtk_css_animated_style_create_css_animations (GtkCssAnimatedStyle *style, if (keyframes == NULL) continue; - keyframes = _gtk_css_keyframes_compute (keyframes, provider, scale, GTK_CSS_STYLE (style), GTK_CSS_STYLE (parent_style)); + keyframes = _gtk_css_keyframes_compute (keyframes, provider, scale, GTK_CSS_STYLE (style), parent_style); animation = _gtk_css_animation_new (name, keyframes, @@ -390,11 +400,11 @@ gtk_css_animated_style_create_css_animations (GtkCssAnimatedStyle *style, void gtk_css_animated_style_create_animations (GtkCssAnimatedStyle *style, - GtkCssAnimatedStyle *parent_style, + GtkCssStyle *parent_style, gint64 timestamp, GtkStyleProviderPrivate *provider, int scale, - GtkCssAnimatedStyle *source) + GtkCssStyle *source) { if (source != NULL) gtk_css_animated_style_create_css_transitions (style, timestamp, source); diff --git a/gtk/gtkcssanimatedstyleprivate.h b/gtk/gtkcssanimatedstyleprivate.h index ac8be9a552..7e05ef8c8f 100644 --- a/gtk/gtkcssanimatedstyleprivate.h +++ b/gtk/gtkcssanimatedstyleprivate.h @@ -52,7 +52,7 @@ struct _GtkCssAnimatedStyleClass GType gtk_css_animated_style_get_type (void) G_GNUC_CONST; -GtkCssStyle * gtk_css_animated_style_new (void); +GtkCssStyle * gtk_css_animated_style_new (GtkCssStyle *style); void gtk_css_animated_style_set_animated_value(GtkCssAnimatedStyle *style, guint id, @@ -62,11 +62,11 @@ GtkCssValue * gtk_css_animated_style_get_intrinsic_value (GtkCssAnimat guint id); void gtk_css_animated_style_create_animations(GtkCssAnimatedStyle *style, - GtkCssAnimatedStyle *parent_style, + GtkCssStyle *parent_style, gint64 timestamp, GtkStyleProviderPrivate*provider, int scale, - GtkCssAnimatedStyle *source); + GtkCssStyle *source); GtkBitmask * gtk_css_animated_style_advance (GtkCssAnimatedStyle *style, gint64 timestamp); void gtk_css_animated_style_cancel_animations(GtkCssAnimatedStyle *style); diff --git a/gtk/gtkstylecontext.c b/gtk/gtkstylecontext.c index dfd8ccf74e..ba7763c797 100644 --- a/gtk/gtkstylecontext.c +++ b/gtk/gtkstylecontext.c @@ -505,7 +505,8 @@ gtk_style_context_should_animate (GtkStyleContext *context) return FALSE; values = style_values_lookup (context); - if (gtk_css_animated_style_is_static (GTK_CSS_ANIMATED_STYLE (values))) + if (!GTK_IS_CSS_ANIMATED_STYLE (values) || + gtk_css_animated_style_is_static (GTK_CSS_ANIMATED_STYLE (values))) return FALSE; g_object_get (gtk_widget_get_settings (context->priv->widget), @@ -778,9 +779,9 @@ style_values_lookup (GtkStyleContext *context) } else { - values = gtk_css_animated_style_new (); + values = gtk_css_static_style_new (); - build_properties (context, GTK_CSS_ANIMATED_STYLE (values)->style, info->decl, &priv->relevant_changes); + build_properties (context, values, info->decl, &priv->relevant_changes); /* These flags are always relevant */ priv->relevant_changes |= GTK_CSS_CHANGE_SOURCE; } @@ -2837,20 +2838,26 @@ _gtk_style_context_validate (GtkStyleContext *context, style_info_set_values (info, NULL); values = style_values_lookup (context); + values = gtk_css_animated_style_new (values); if (values != current) gtk_css_animated_style_create_animations (GTK_CSS_ANIMATED_STYLE (values), - priv->parent ? GTK_CSS_ANIMATED_STYLE (style_values_lookup (priv->parent)) : NULL, + priv->parent ? style_values_lookup (priv->parent) : NULL, timestamp, GTK_STYLE_PROVIDER_PRIVATE (priv->cascade), priv->scale, gtk_style_context_should_create_transitions (context) - ? GTK_CSS_ANIMATED_STYLE (current) + ? current : NULL); if (gtk_css_animated_style_is_static (GTK_CSS_ANIMATED_STYLE (values))) - change &= ~GTK_CSS_CHANGE_ANIMATE; + { + change &= ~GTK_CSS_CHANGE_ANIMATE; + } else - change |= GTK_CSS_CHANGE_ANIMATE; + { + change |= GTK_CSS_CHANGE_ANIMATE; + style_info_set_values (info, values); + } _gtk_style_context_update_animating (context); if (current) @@ -2862,12 +2869,19 @@ _gtk_style_context_validate (GtkStyleContext *context, changes = _gtk_bitmask_new (); changes = _gtk_bitmask_invert_range (changes, 0, _gtk_css_style_property_get_n_properties ()); } + + g_object_unref (values); } else { changes = gtk_css_style_compute_dependencies (current, parent_changes); if (!_gtk_bitmask_is_empty (changes)) - update_properties (context, GTK_CSS_ANIMATED_STYLE (current)->style, info->decl, changes); + { + if (GTK_IS_CSS_ANIMATED_STYLE (current)) + update_properties (context, GTK_CSS_ANIMATED_STYLE (current)->style, info->decl, changes); + else + update_properties (context, current, info->decl, changes); + } gtk_style_context_update_cache (context, parent_changes); }