]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtkcsscomputedvalues.c
Use gdk_threads_add_timeout to popup the selection window
[~andy/gtk] / gtk / gtkcsscomputedvalues.c
index b60324eaa08e854a0bb334227f3810479c430a93..dea23bdf5e3ef50da9a0e2b4c63945bd034e415c 100644 (file)
@@ -19,6 +19,7 @@
 
 #include "config.h"
 
+#include "gtkprivate.h"
 #include "gtkcsscomputedvaluesprivate.h"
 
 #include "gtkcssanimationprivate.h"
@@ -120,9 +121,9 @@ _gtk_css_computed_values_compute_value (GtkCssComputedValues    *values,
   GtkCssDependencies dependencies;
   GtkCssValue *value;
 
-  g_return_if_fail (GTK_IS_CSS_COMPUTED_VALUES (values));
-  g_return_if_fail (GTK_IS_STYLE_PROVIDER_PRIVATE (provider));
-  g_return_if_fail (parent_values == NULL || GTK_IS_CSS_COMPUTED_VALUES (parent_values));
+  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
@@ -154,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);
@@ -175,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);
 
@@ -195,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)
@@ -210,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 &&
@@ -224,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)
@@ -237,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)
@@ -405,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);
@@ -494,6 +501,7 @@ gtk_css_computed_values_create_css_animations (GtkCssComputedValues    *values,
                                               _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);
     }
@@ -522,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;
@@ -572,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)
     {
@@ -586,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)
     {
@@ -598,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;
+}
+