]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtkcssimage.c
Ensure the insertion handle stays on fake events (eg from IM)
[~andy/gtk] / gtk / gtkcssimage.c
index a89402e2a7ff93ee0eccdc265a85688e5422ce01..167af64a9117b02624ab0cfcef6d88bd49651ccb 100644 (file)
 
 #include "gtkcssimageprivate.h"
 
+#include "gtkcsscomputedvaluesprivate.h"
+
 /* for the types only */
+#include "gtk/gtkcssimagecrossfadeprivate.h"
 #include "gtk/gtkcssimagegradientprivate.h"
 #include "gtk/gtkcssimagelinearprivate.h"
 #include "gtk/gtkcssimageurlprivate.h"
@@ -56,12 +59,37 @@ gtk_css_image_real_get_aspect_ratio (GtkCssImage *image)
 }
 
 static GtkCssImage *
-gtk_css_image_real_compute (GtkCssImage     *image,
-                            GtkStyleContext *context)
+gtk_css_image_real_compute (GtkCssImage             *image,
+                            guint                    property_id,
+                            GtkStyleProviderPrivate *provider,
+                            GtkCssComputedValues    *values,
+                            GtkCssComputedValues    *parent_values,
+                            GtkCssDependencies      *dependencies)
 {
   return g_object_ref (image);
 }
 
+static gboolean
+gtk_css_image_real_equal (GtkCssImage *image1,
+                          GtkCssImage *image2)
+{
+  return FALSE;
+}
+
+static GtkCssImage *
+gtk_css_image_real_transition (GtkCssImage *start,
+                               GtkCssImage *end,
+                               guint        property_id,
+                               double       progress)
+{
+  if (progress <= 0.0)
+    return g_object_ref (start);
+  else if (progress >= 1.0)
+    return end ? g_object_ref (end) : NULL;
+  else
+    return _gtk_css_image_cross_fade_new (start, end, progress);
+}
+
 static void
 _gtk_css_image_class_init (GtkCssImageClass *klass)
 {
@@ -69,6 +97,8 @@ _gtk_css_image_class_init (GtkCssImageClass *klass)
   klass->get_height = gtk_css_image_real_get_height;
   klass->get_aspect_ratio = gtk_css_image_real_get_aspect_ratio;
   klass->compute = gtk_css_image_real_compute;
+  klass->equal = gtk_css_image_real_equal;
+  klass->transition = gtk_css_image_real_transition;
 }
 
 static void
@@ -113,17 +143,80 @@ _gtk_css_image_get_aspect_ratio (GtkCssImage *image)
 }
 
 GtkCssImage *
-_gtk_css_image_compute (GtkCssImage     *image,
-                        GtkStyleContext *context)
+_gtk_css_image_compute (GtkCssImage             *image,
+                        guint                    property_id,
+                        GtkStyleProviderPrivate *provider,
+                        GtkCssComputedValues    *values,
+                        GtkCssComputedValues    *parent_values,
+                        GtkCssDependencies      *dependencies)
 {
+  GtkCssDependencies unused;
   GtkCssImageClass *klass;
 
   g_return_val_if_fail (GTK_IS_CSS_IMAGE (image), NULL);
-  g_return_val_if_fail (GTK_IS_STYLE_CONTEXT (context), NULL);
+  g_return_val_if_fail (GTK_IS_CSS_COMPUTED_VALUES (values), NULL);
+  g_return_val_if_fail (parent_values == NULL || GTK_IS_CSS_COMPUTED_VALUES (parent_values), NULL);
+
+  if (dependencies == NULL)
+    dependencies = &unused;
+  *dependencies = 0;
 
   klass = GTK_CSS_IMAGE_GET_CLASS (image);
 
-  return klass->compute (image, context);
+  return klass->compute (image, property_id, provider, values, parent_values, dependencies);
+}
+
+GtkCssImage *
+_gtk_css_image_transition (GtkCssImage *start,
+                           GtkCssImage *end,
+                           guint        property_id,
+                           double       progress)
+{
+  GtkCssImageClass *klass;
+
+  g_return_val_if_fail (start == NULL || GTK_IS_CSS_IMAGE (start), NULL);
+  g_return_val_if_fail (end == NULL || GTK_IS_CSS_IMAGE (end), NULL);
+
+  progress = CLAMP (progress, 0.0, 1.0);
+
+  if (start == NULL)
+    {
+      if (end == NULL)
+        return NULL;
+      else
+        {
+          start = end;
+          end = NULL;
+          progress = 1.0 - progress;
+        }
+    }
+
+  klass = GTK_CSS_IMAGE_GET_CLASS (start);
+
+  return klass->transition (start, end, property_id, progress);
+}
+
+gboolean
+_gtk_css_image_equal (GtkCssImage *image1,
+                      GtkCssImage *image2)
+{
+  GtkCssImageClass *klass;
+
+  g_return_val_if_fail (image1 == NULL || GTK_IS_CSS_IMAGE (image1), FALSE);
+  g_return_val_if_fail (image2 == NULL || GTK_IS_CSS_IMAGE (image2), FALSE);
+
+  if (image1 == image2)
+    return TRUE;
+
+  if (image1 == NULL || image2 == NULL)
+    return FALSE;
+
+  if (G_OBJECT_TYPE (image1) != G_OBJECT_TYPE (image2))
+    return FALSE;
+
+  klass = GTK_CSS_IMAGE_GET_CLASS (image1);
+
+  return klass->equal (image1, image2);
 }
 
 void
@@ -136,6 +229,8 @@ _gtk_css_image_draw (GtkCssImage        *image,
 
   g_return_if_fail (GTK_IS_CSS_IMAGE (image));
   g_return_if_fail (cr != NULL);
+  g_return_if_fail (width > 0);
+  g_return_if_fail (height > 0);
 
   cairo_save (cr);
 
@@ -313,7 +408,7 @@ _gtk_css_image_get_surface (GtkCssImage     *image,
   return result;
 }
 
-GType
+static GType
 gtk_css_image_get_parser_type (GtkCssParser *parser)
 {
   static const struct {
@@ -324,7 +419,8 @@ gtk_css_image_get_parser_type (GtkCssParser *parser)
     { "-gtk-gradient", _gtk_css_image_gradient_get_type },
     { "-gtk-win32-theme-part", _gtk_css_image_win32_get_type },
     { "linear-gradient", _gtk_css_image_linear_get_type },
-    { "repeating-linear-gradient", _gtk_css_image_linear_get_type }
+    { "repeating-linear-gradient", _gtk_css_image_linear_get_type },
+    { "cross-fade", _gtk_css_image_cross_fade_get_type }
   };
   guint i;
 
@@ -355,15 +451,13 @@ _gtk_css_image_can_parse (GtkCssParser *parser)
 }
 
 GtkCssImage *
-_gtk_css_image_new_parse (GtkCssParser *parser,
-                          GFile        *base)
+_gtk_css_image_new_parse (GtkCssParser *parser)
 {
   GtkCssImageClass *klass;
   GtkCssImage *image;
   GType image_type;
 
   g_return_val_if_fail (parser != NULL, NULL);
-  g_return_val_if_fail (G_IS_FILE (base), NULL);
 
   image_type = gtk_css_image_get_parser_type (parser);
   if (image_type == G_TYPE_INVALID)
@@ -375,7 +469,7 @@ _gtk_css_image_new_parse (GtkCssParser *parser,
   image = g_object_new (image_type, NULL);
 
   klass = GTK_CSS_IMAGE_GET_CLASS (image);
-  if (!klass->parse (image, parser, base))
+  if (!klass->parse (image, parser))
     {
       g_object_unref (image);
       return NULL;