]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtkcsscomputedvalues.c
treeview: Don't emit cursor-changed in destruction
[~andy/gtk] / gtk / gtkcsscomputedvalues.c
index cd2f66b2d636e510f6600c6997b5c844727ff59b..dea23bdf5e3ef50da9a0e2b4c63945bd034e415c 100644 (file)
@@ -19,6 +19,7 @@
 
 #include "config.h"
 
+#include "gtkprivate.h"
 #include "gtkcsscomputedvaluesprivate.h"
 
 #include "gtkcssanimationprivate.h"
@@ -110,17 +111,19 @@ maybe_unref_section (gpointer section)
 }
 
 void
-_gtk_css_computed_values_compute_value (GtkCssComputedValues *values,
-                                        GtkStyleContext      *context,
-                                        guint                 id,
-                                        GtkCssValue          *specified,
-                                        GtkCssSection        *section)
+_gtk_css_computed_values_compute_value (GtkCssComputedValues    *values,
+                                        GtkStyleProviderPrivate *provider,
+                                        GtkCssComputedValues    *parent_values,
+                                        guint                    id,
+                                        GtkCssValue             *specified,
+                                        GtkCssSection           *section)
 {
   GtkCssDependencies dependencies;
   GtkCssValue *value;
 
-  g_return_if_fail (GTK_IS_CSS_COMPUTED_VALUES (values));
-  g_return_if_fail (GTK_IS_STYLE_CONTEXT (context));
+  gtk_internal_return_if_fail (GTK_IS_CSS_COMPUTED_VALUES (values));
+  gtk_internal_return_if_fail (GTK_IS_STYLE_PROVIDER_PRIVATE (provider));
+  gtk_internal_return_if_fail (parent_values == NULL || GTK_IS_CSS_COMPUTED_VALUES (parent_values));
 
   /* http://www.w3.org/TR/css3-cascade/#cascade
    * Then, for every element, the value for each property can be found
@@ -139,7 +142,7 @@ _gtk_css_computed_values_compute_value (GtkCssComputedValues *values,
   else
     _gtk_css_value_ref (specified);
 
-  value = _gtk_css_value_compute (specified, id, context, &dependencies);
+  value = _gtk_css_value_compute (specified, id, provider, values, parent_values, &dependencies);
 
   _gtk_css_computed_values_set_value (values, id, value, dependencies, section);
 
@@ -152,8 +155,8 @@ _gtk_css_computed_values_set_animated_value (GtkCssComputedValues *values,
                                              guint                 id,
                                              GtkCssValue          *value)
 {
-  g_return_if_fail (GTK_IS_CSS_COMPUTED_VALUES (values));
-  g_return_if_fail (value != NULL);
+  gtk_internal_return_if_fail (GTK_IS_CSS_COMPUTED_VALUES (values));
+  gtk_internal_return_if_fail (value != NULL);
 
   if (values->animated_values == NULL)
     values->animated_values = g_ptr_array_new_with_free_func ((GDestroyNotify)_gtk_css_value_unref);
@@ -173,10 +176,11 @@ _gtk_css_computed_values_set_value (GtkCssComputedValues *values,
                                     GtkCssDependencies    dependencies,
                                     GtkCssSection        *section)
 {
-  g_return_if_fail (GTK_IS_CSS_COMPUTED_VALUES (values));
+  gtk_internal_return_if_fail (GTK_IS_CSS_COMPUTED_VALUES (values));
 
   if (values->values == NULL)
-    values->values = g_ptr_array_new_with_free_func ((GDestroyNotify)_gtk_css_value_unref);
+    values->values = g_ptr_array_new_full (_gtk_css_style_property_get_n_properties (),
+                                          (GDestroyNotify)_gtk_css_value_unref);
   if (id >= values->values->len)
    g_ptr_array_set_size (values->values, id + 1);
 
@@ -193,6 +197,12 @@ _gtk_css_computed_values_set_value (GtkCssComputedValues *values,
   if (dependencies & (GTK_CSS_DEPENDS_ON_FONT_SIZE))
     values->depends_on_font_size = _gtk_bitmask_set (values->depends_on_font_size, id, TRUE);
 
+  if (values->sections && values->sections->len > id && g_ptr_array_index (values->sections, id))
+    {
+      gtk_css_section_unref (g_ptr_array_index (values->sections, id));
+      g_ptr_array_index (values->sections, id) = NULL;
+    }
+
   if (section)
     {
       if (values->sections == NULL)
@@ -208,7 +218,7 @@ GtkCssValue *
 _gtk_css_computed_values_get_value (GtkCssComputedValues *values,
                                     guint                 id)
 {
-  g_return_val_if_fail (GTK_IS_CSS_COMPUTED_VALUES (values), NULL);
+  gtk_internal_return_val_if_fail (GTK_IS_CSS_COMPUTED_VALUES (values), NULL);
 
   if (values->animated_values &&
       id < values->animated_values->len &&
@@ -222,7 +232,7 @@ GtkCssValue *
 _gtk_css_computed_values_get_intrinsic_value (GtkCssComputedValues *values,
                                               guint                 id)
 {
-  g_return_val_if_fail (GTK_IS_CSS_COMPUTED_VALUES (values), NULL);
+  gtk_internal_return_val_if_fail (GTK_IS_CSS_COMPUTED_VALUES (values), NULL);
 
   if (values->values == NULL ||
       id >= values->values->len)
@@ -235,7 +245,7 @@ GtkCssSection *
 _gtk_css_computed_values_get_section (GtkCssComputedValues *values,
                                       guint                 id)
 {
-  g_return_val_if_fail (GTK_IS_CSS_COMPUTED_VALUES (values), NULL);
+  gtk_internal_return_val_if_fail (GTK_IS_CSS_COMPUTED_VALUES (values), NULL);
 
   if (values->sections == NULL ||
       id >= values->sections->len)
@@ -403,8 +413,7 @@ gtk_css_computed_values_create_css_transitions (GtkCssComputedValues *values,
       else
         {
           animation = _gtk_css_transition_new (i,
-                                               start,
-                                               end,
+                                               _gtk_css_computed_values_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);
@@ -432,16 +441,16 @@ gtk_css_computed_values_find_animation (GtkCssComputedValues *values,
 }
 
 static void
-gtk_css_computed_values_create_css_animations (GtkCssComputedValues *values,
-                                               gint64                timestamp,
-                                               GtkStyleContext      *context)
+gtk_css_computed_values_create_css_animations (GtkCssComputedValues    *values,
+                                               GtkCssComputedValues    *parent_values,
+                                               gint64                   timestamp,
+                                               GtkStyleProviderPrivate *provider,
+                                               GtkCssComputedValues    *source)
 {
-  GtkStyleProviderPrivate *provider;
   GtkCssValue *durations, *delays, *timing_functions, *animations;
   GtkCssValue *iteration_counts, *directions, *play_states, *fill_modes;
   guint i;
 
-  provider = _gtk_style_context_get_style_provider (context);
   animations = _gtk_css_computed_values_get_value (values, GTK_CSS_PROPERTY_ANIMATION_NAME);
   durations = _gtk_css_computed_values_get_value (values, GTK_CSS_PROPERTY_ANIMATION_DURATION);
   delays = _gtk_css_computed_values_get_value (values, GTK_CSS_PROPERTY_ANIMATION_DELAY);
@@ -465,21 +474,35 @@ gtk_css_computed_values_create_css_animations (GtkCssComputedValues *values,
       if (animation)
         continue;
 
-      keyframes = _gtk_style_provider_private_get_keyframes (provider, name);
-      if (keyframes == NULL)
-        continue;
+      if (source)
+        animation = gtk_css_computed_values_find_animation (source, name);
 
-      keyframes = _gtk_css_keyframes_compute (keyframes, context);
-
-      animation = _gtk_css_animation_new (name,
-                                          keyframes,
-                                          timestamp + _gtk_css_number_value_get (_gtk_css_array_value_get_nth (delays, i), 100) * G_USEC_PER_SEC,
-                                          _gtk_css_number_value_get (_gtk_css_array_value_get_nth (durations, i), 100) * G_USEC_PER_SEC,
-                                          _gtk_css_array_value_get_nth (timing_functions, i),
-                                          _gtk_css_direction_value_get (_gtk_css_array_value_get_nth (directions, i)),
-                                          _gtk_css_play_state_value_get (_gtk_css_array_value_get_nth (play_states, i)),
-                                          _gtk_css_fill_mode_value_get (_gtk_css_array_value_get_nth (fill_modes, i)),
-                                          _gtk_css_number_value_get (_gtk_css_array_value_get_nth (iteration_counts, i), 100));
+      if (animation)
+        {
+          animation = _gtk_css_animation_copy (GTK_CSS_ANIMATION (animation),
+                                               timestamp,
+                                               _gtk_css_play_state_value_get (_gtk_css_array_value_get_nth (play_states, i)));
+        }
+      else
+        {
+          keyframes = _gtk_style_provider_private_get_keyframes (provider, name);
+          if (keyframes == NULL)
+            continue;
+
+          keyframes = _gtk_css_keyframes_compute (keyframes, provider, values, parent_values);
+
+          animation = _gtk_css_animation_new (name,
+                                              keyframes,
+                                              timestamp,
+                                              _gtk_css_number_value_get (_gtk_css_array_value_get_nth (delays, i), 100) * G_USEC_PER_SEC,
+                                              _gtk_css_number_value_get (_gtk_css_array_value_get_nth (durations, i), 100) * G_USEC_PER_SEC,
+                                              _gtk_css_array_value_get_nth (timing_functions, i),
+                                              _gtk_css_direction_value_get (_gtk_css_array_value_get_nth (directions, i)),
+                                              _gtk_css_play_state_value_get (_gtk_css_array_value_get_nth (play_states, i)),
+                                              _gtk_css_fill_mode_value_get (_gtk_css_array_value_get_nth (fill_modes, i)),
+                                              _gtk_css_number_value_get (_gtk_css_array_value_get_nth (iteration_counts, i), 100));
+          _gtk_css_keyframes_unref (keyframes);
+        }
       values->animations = g_slist_prepend (values->animations, animation);
     }
 }
@@ -487,14 +510,15 @@ gtk_css_computed_values_create_css_animations (GtkCssComputedValues *values,
 /* PUBLIC API */
 
 void
-_gtk_css_computed_values_create_animations (GtkCssComputedValues *values,
-                                            gint64                timestamp,
-                                            GtkCssComputedValues *source,
-                                            GtkStyleContext      *context)
+_gtk_css_computed_values_create_animations (GtkCssComputedValues    *values,
+                                            GtkCssComputedValues    *parent_values,
+                                            gint64                   timestamp,
+                                            GtkStyleProviderPrivate *provider,
+                                            GtkCssComputedValues    *source)
 {
   if (source != NULL)
     gtk_css_computed_values_create_css_transitions (values, timestamp, source);
-  gtk_css_computed_values_create_css_animations (values, timestamp, context);
+  gtk_css_computed_values_create_css_animations (values, parent_values, timestamp, provider, source);
 }
 
 GtkBitmask *
@@ -506,8 +530,8 @@ _gtk_css_computed_values_advance (GtkCssComputedValues *values,
   GSList *list;
   guint i;
 
-  g_return_val_if_fail (GTK_IS_CSS_COMPUTED_VALUES (values), NULL);
-  g_return_val_if_fail (timestamp >= values->current_time, NULL);
+  gtk_internal_return_val_if_fail (GTK_IS_CSS_COMPUTED_VALUES (values), NULL);
+  gtk_internal_return_val_if_fail (timestamp >= values->current_time, NULL);
 
   values->current_time = timestamp;
   old_computed_values = values->animated_values;
@@ -556,7 +580,7 @@ _gtk_css_computed_values_is_static (GtkCssComputedValues *values)
 {
   GSList *list;
 
-  g_return_val_if_fail (GTK_IS_CSS_COMPUTED_VALUES (values), TRUE);
+  gtk_internal_return_val_if_fail (GTK_IS_CSS_COMPUTED_VALUES (values), TRUE);
 
   for (list = values->animations; list; list = list->next)
     {
@@ -570,7 +594,7 @@ _gtk_css_computed_values_is_static (GtkCssComputedValues *values)
 void
 _gtk_css_computed_values_cancel_animations (GtkCssComputedValues *values)
 {
-  g_return_if_fail (GTK_IS_CSS_COMPUTED_VALUES (values));
+  gtk_internal_return_if_fail (GTK_IS_CSS_COMPUTED_VALUES (values));
 
   if (values->animated_values)
     {
@@ -582,3 +606,21 @@ _gtk_css_computed_values_cancel_animations (GtkCssComputedValues *values)
   values->animations = NULL;
 }
 
+GtkBitmask *
+_gtk_css_computed_values_compute_dependencies (GtkCssComputedValues *values,
+                                               const GtkBitmask     *parent_changes)
+{
+  GtkBitmask *changes;
+
+  gtk_internal_return_val_if_fail (GTK_IS_CSS_COMPUTED_VALUES (values), _gtk_bitmask_new ());
+
+  changes = _gtk_bitmask_copy (parent_changes);
+  changes = _gtk_bitmask_intersect (changes, values->depends_on_parent);
+  if (_gtk_bitmask_get (changes, GTK_CSS_PROPERTY_COLOR))
+    changes = _gtk_bitmask_union (changes, values->depends_on_color);
+  if (_gtk_bitmask_get (changes, GTK_CSS_PROPERTY_FONT_SIZE))
+    changes = _gtk_bitmask_union (changes, values->depends_on_font_size);
+
+  return changes;
+}
+