iconhelper: Turn into a GObject
authorBenjamin Otte <otte@redhat.com>
Wed, 14 Mar 2018 00:56:30 +0000 (01:56 +0100)
committerBenjamin Otte <otte@redhat.com>
Fri, 16 Mar 2018 05:04:44 +0000 (06:04 +0100)
gtk/gtkcellrendererpixbuf.c
gtk/gtkiconhelper.c
gtk/gtkiconhelperprivate.h
gtk/gtkimage.c

index 731ebc51c50c84a742e52a154b348bf1477cedab..a217634f948829b83550ca76e9ac891801150fbc 100644 (file)
@@ -417,18 +417,20 @@ gtk_cell_renderer_pixbuf_new (void)
   return g_object_new (GTK_TYPE_CELL_RENDERER_PIXBUF, NULL);
 }
 
-static void
-create_icon_helper (GtkIconHelper         *icon_helper,
+static GtkIconHelper *
+create_icon_helper (
                     GtkCellRendererPixbuf *cellpixbuf,
                     GtkWidget             *widget)
 {
   GtkCellRendererPixbufPrivate *priv = cellpixbuf->priv;
+  GtkIconHelper *icon_helper;
 
-  gtk_icon_helper_init (icon_helper,
-                        gtk_style_context_get_node (gtk_widget_get_style_context (widget)),
-                        widget);
+  icon_helper = gtk_icon_helper_new (gtk_style_context_get_node (gtk_widget_get_style_context (widget)),
+                                     widget);
   _gtk_icon_helper_set_force_scale_pixbuf (icon_helper, TRUE);
   _gtk_icon_helper_set_definition (icon_helper, priv->image_def);
+
+  return icon_helper;
 }
 
 static void
@@ -448,19 +450,19 @@ gtk_cell_renderer_pixbuf_get_size (GtkCellRenderer    *cell,
   gint calc_height;
   gint xpad, ypad;
   GtkStyleContext *context;
-  GtkIconHelper icon_helper;
+  GtkIconHelper *icon_helper;
 
   context = gtk_widget_get_style_context (widget);
   gtk_style_context_save (context);
   gtk_style_context_add_class (context, GTK_STYLE_CLASS_IMAGE);
   gtk_icon_size_set_style_classes (gtk_style_context_get_node (context), priv->icon_size);
-  create_icon_helper (&icon_helper, cellpixbuf, widget);
+  icon_helper = create_icon_helper (cellpixbuf, widget);
 
-  if (!_gtk_icon_helper_get_is_empty (&icon_helper))
-    _gtk_icon_helper_get_size (&icon_helper, 
+  if (!_gtk_icon_helper_get_is_empty (icon_helper))
+    _gtk_icon_helper_get_size (icon_helper, 
                                &pixbuf_width, &pixbuf_height);
 
-  gtk_icon_helper_destroy (&icon_helper);
+  g_object_unref (icon_helper);
   gtk_style_context_restore (context);
 
   if (priv->pixbuf_expander_open)
@@ -526,7 +528,7 @@ gtk_cell_renderer_pixbuf_snapshot (GtkCellRenderer      *cell,
   GdkRectangle draw_rect;
   gboolean is_expander;
   gint xpad, ypad;
-  GtkIconHelper icon_helper;
+  GtkIconHelper *icon_helper;
   cairo_surface_t *surface;
 
   gtk_cell_renderer_pixbuf_get_size (cell, widget, (GdkRectangle *) cell_area,
@@ -559,32 +561,32 @@ gtk_cell_renderer_pixbuf_snapshot (GtkCellRenderer      *cell,
 
       if (is_expanded && priv->pixbuf_expander_open != NULL)
         {
-          gtk_icon_helper_init (&icon_helper, gtk_style_context_get_node (context), widget);
+          icon_helper = gtk_icon_helper_new (gtk_style_context_get_node (context), widget);
           surface = gdk_cairo_surface_create_from_pixbuf (priv->pixbuf_expander_open, 1, NULL);
-          _gtk_icon_helper_set_surface (&icon_helper, surface);
+          _gtk_icon_helper_set_surface (icon_helper, surface);
           cairo_surface_destroy (surface);
         }
       else if (!is_expanded && priv->pixbuf_expander_closed != NULL)
         {
-          gtk_icon_helper_init (&icon_helper, gtk_style_context_get_node (context), widget);
+          icon_helper = gtk_icon_helper_new (gtk_style_context_get_node (context), widget);
           surface = gdk_cairo_surface_create_from_pixbuf (priv->pixbuf_expander_closed, 1, NULL);
-          _gtk_icon_helper_set_surface (&icon_helper, surface);
+          _gtk_icon_helper_set_surface (icon_helper, surface);
           cairo_surface_destroy (surface);
         }
       else
         {
-          create_icon_helper (&icon_helper, cellpixbuf, widget);
+          icon_helper = create_icon_helper (cellpixbuf, widget);
         }
     }
   else
     {
-      create_icon_helper (&icon_helper, cellpixbuf, widget);
+      icon_helper = create_icon_helper (cellpixbuf, widget);
     }
 
   gtk_snapshot_offset (snapshot, pix_rect.x, pix_rect.y);
-  gtk_icon_helper_snapshot (&icon_helper, snapshot, pix_rect.width, pix_rect.height);
+  gtk_icon_helper_snapshot (icon_helper, snapshot, pix_rect.width, pix_rect.height);
   gtk_snapshot_offset (snapshot, - pix_rect.x, - pix_rect.y);
 
-  gtk_icon_helper_destroy (&icon_helper);
+  g_object_unref (icon_helper);
   gtk_style_context_restore (context);
 }
index bb9a62e7e521486f616fcfd66b58c06460195f1c..54a8212d30beeca56f315046ee9a7866216c7eba 100644 (file)
 #include "gtksnapshot.h"
 #include "gtkwidgetprivate.h"
 
+struct _GtkIconHelper
+{
+  GObject parent_instance;
+
+  GtkImageDefinition *def;
+
+  gint pixel_size;
+
+  guint use_fallback : 1;
+  guint force_scale_pixbuf : 1;
+  guint texture_is_symbolic : 1;
+
+  GtkWidget *owner;
+  GtkCssNode *node;
+  GdkPaintable *paintable;
+  int texture_scale;
+};
+
+G_DEFINE_TYPE (GtkIconHelper, gtk_icon_helper, G_TYPE_OBJECT)
+
 void
 gtk_icon_helper_invalidate (GtkIconHelper *self)
 {
@@ -98,21 +118,39 @@ _gtk_icon_helper_clear (GtkIconHelper *self)
     }
 }
 
-void
-gtk_icon_helper_destroy (GtkIconHelper *self)
+static void
+gtk_icon_helper_finalize (GObject *object)
 {
+  GtkIconHelper *self = GTK_ICON_HELPER (object);
+
   _gtk_icon_helper_clear (self);
   g_signal_handlers_disconnect_by_func (self->owner, G_CALLBACK (gtk_icon_helper_invalidate), self);
   gtk_image_definition_unref (self->def);
+
+  G_OBJECT_CLASS (gtk_icon_helper_parent_class)->finalize (object);
+}
+
+void
+gtk_icon_helper_class_init (GtkIconHelperClass *klass)
+{
+  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+
+  gobject_class->finalize = gtk_icon_helper_finalize;
 }
 
 void
-gtk_icon_helper_init (GtkIconHelper *self,
-                      GtkCssNode    *css_node,
-                      GtkWidget     *owner)
+gtk_icon_helper_init (GtkIconHelper *self)
 {
-  memset (self, 0, sizeof (GtkIconHelper));
   self->def = gtk_image_definition_new_empty ();
+}
+
+GtkIconHelper *
+gtk_icon_helper_new (GtkCssNode *css_node,
+                     GtkWidget  *owner)
+{
+  GtkIconHelper *self;
+  
+  self = g_object_new (GTK_TYPE_ICON_HELPER, NULL);
 
   self->pixel_size = -1;
   self->texture_is_symbolic = FALSE;
@@ -121,6 +159,8 @@ gtk_icon_helper_init (GtkIconHelper *self,
   self->owner = owner;
   g_signal_connect_swapped (owner, "direction-changed", G_CALLBACK (gtk_icon_helper_invalidate), self);
   g_signal_connect_swapped (owner, "notify::scale-factor", G_CALLBACK (gtk_icon_helper_invalidate), self);
+
+  return self;
 }
 
 static int
index ce260b3f68745e72d7d3bc7a07c7bb76b289a825..9b8357cf393c46664c3ecd5ee97594e71939fe52 100644 (file)
 
 G_BEGIN_DECLS
 
-typedef struct _GtkIconHelper GtkIconHelper;
+#define GTK_TYPE_ICON_HELPER (gtk_icon_helper_get_type())
 
-struct _GtkIconHelper
-{
-  GObject parent_instance;
+G_DECLARE_FINAL_TYPE(GtkIconHelper, gtk_icon_helper, GTK, ICON_HELPER, GObject)
 
-  GtkImageDefinition *def;
-
-  gint pixel_size;
-
-  guint use_fallback : 1;
-  guint force_scale_pixbuf : 1;
-  guint texture_is_symbolic : 1;
-
-  GtkWidget *owner;
-  GtkCssNode *node;
-  GdkPaintable *paintable;
-  int texture_scale;
-};
-
-void gtk_icon_helper_init (GtkIconHelper *self,
-                           GtkCssNode    *css_node,
-                           GtkWidget     *owner);
-
-void gtk_icon_helper_destroy (GtkIconHelper *self);
+GtkIconHelper *gtk_icon_helper_new (GtkCssNode    *css_node,
+                                    GtkWidget     *owner);
 
 void _gtk_icon_helper_clear (GtkIconHelper *self);
 
index 970ab758ae9fb853eefa9cf0b5e21a6d68a73569..3013a93a29c72c8f136eddee7c94ecfe50eb93f4 100644 (file)
@@ -78,7 +78,7 @@
 
 struct _GtkImagePrivate
 {
-  GtkIconHelper icon_helper;
+  GtkIconHelper *icon_helper;
   GtkIconSize icon_size;
 
   float baseline_align;
@@ -283,7 +283,7 @@ gtk_image_init (GtkImage *image)
   widget_node = gtk_widget_get_css_node (GTK_WIDGET (image));
   gtk_widget_set_has_window (GTK_WIDGET (image), FALSE);
 
-  gtk_icon_helper_init (&priv->icon_helper, widget_node, GTK_WIDGET (image));
+  priv->icon_helper = gtk_icon_helper_new (widget_node, GTK_WIDGET (image));
 }
 
 static void
@@ -294,7 +294,7 @@ gtk_image_finalize (GObject *object)
 
   gtk_image_clear (image);
 
-  gtk_icon_helper_destroy (&priv->icon_helper);
+  g_clear_object (&priv->icon_helper);
 
   g_free (priv->filename);
   g_free (priv->resource_path);
@@ -342,7 +342,7 @@ gtk_image_set_property (GObject      *object,
       break;
 
     case PROP_USE_FALLBACK:
-      if (_gtk_icon_helper_set_use_fallback (&priv->icon_helper, g_value_get_boolean (value)))
+      if (_gtk_icon_helper_set_use_fallback (priv->icon_helper, g_value_get_boolean (value)))
         g_object_notify_by_pspec (object, pspec);
       break;
 
@@ -364,13 +364,13 @@ gtk_image_get_property (GObject     *object,
   switch (prop_id)
     {
     case PROP_SURFACE:
-      g_value_set_boxed (value, _gtk_icon_helper_peek_surface (&priv->icon_helper));
+      g_value_set_boxed (value, _gtk_icon_helper_peek_surface (priv->icon_helper));
       break;
     case PROP_PAINTABLE:
-      g_value_set_object (value, _gtk_icon_helper_peek_paintable (&priv->icon_helper));
+      g_value_set_object (value, _gtk_icon_helper_peek_paintable (priv->icon_helper));
       break;
     case PROP_TEXTURE:
-      g_value_set_object (value, _gtk_icon_helper_peek_texture (&priv->icon_helper));
+      g_value_set_object (value, _gtk_icon_helper_peek_texture (priv->icon_helper));
       break;
     case PROP_FILE:
       g_value_set_string (value, priv->filename);
@@ -379,22 +379,22 @@ gtk_image_get_property (GObject     *object,
       g_value_set_enum (value, priv->icon_size);
       break;
     case PROP_PIXEL_SIZE:
-      g_value_set_int (value, _gtk_icon_helper_get_pixel_size (&priv->icon_helper));
+      g_value_set_int (value, _gtk_icon_helper_get_pixel_size (priv->icon_helper));
       break;
     case PROP_ICON_NAME:
-      g_value_set_string (value, _gtk_icon_helper_get_icon_name (&priv->icon_helper));
+      g_value_set_string (value, _gtk_icon_helper_get_icon_name (priv->icon_helper));
       break;
     case PROP_GICON:
-      g_value_set_object (value, _gtk_icon_helper_peek_gicon (&priv->icon_helper));
+      g_value_set_object (value, _gtk_icon_helper_peek_gicon (priv->icon_helper));
       break;
     case PROP_RESOURCE:
       g_value_set_string (value, priv->resource_path);
       break;
     case PROP_USE_FALLBACK:
-      g_value_set_boolean (value, _gtk_icon_helper_get_use_fallback (&priv->icon_helper));
+      g_value_set_boolean (value, _gtk_icon_helper_get_use_fallback (priv->icon_helper));
       break;
     case PROP_STORAGE_TYPE:
-      g_value_set_enum (value, _gtk_icon_helper_get_storage_type (&priv->icon_helper));
+      g_value_set_enum (value, _gtk_icon_helper_get_storage_type (priv->icon_helper));
       break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -910,7 +910,7 @@ gtk_image_set_from_icon_name  (GtkImage    *image,
   gtk_image_clear (image);
 
   if (icon_name)
-    _gtk_icon_helper_set_icon_name (&priv->icon_helper, icon_name);
+    _gtk_icon_helper_set_icon_name (priv->icon_helper, icon_name);
 
   g_object_notify_by_pspec (G_OBJECT (image), image_props[PROP_ICON_NAME]);
 
@@ -945,7 +945,7 @@ gtk_image_set_from_gicon  (GtkImage       *image,
 
   if (icon)
     {
-      _gtk_icon_helper_set_gicon (&priv->icon_helper, icon);
+      _gtk_icon_helper_set_gicon (priv->icon_helper, icon);
       g_object_unref (icon);
     }
 
@@ -978,7 +978,7 @@ gtk_image_set_from_surface (GtkImage       *image,
 
   if (surface)
     {
-      _gtk_icon_helper_set_surface (&priv->icon_helper, surface);
+      _gtk_icon_helper_set_surface (priv->icon_helper, surface);
       cairo_surface_destroy (surface);
     }
 
@@ -1000,7 +1000,7 @@ gtk_image_paintable_invalidate_size (GdkPaintable *paintable,
 {
   GtkImagePrivate *priv = gtk_image_get_instance_private (image);
 
-  gtk_icon_helper_invalidate (&priv->icon_helper);
+  gtk_icon_helper_invalidate (priv->icon_helper);
 }
 
 /**
@@ -1028,7 +1028,7 @@ gtk_image_set_from_paintable (GtkImage     *image,
 
   if (paintable)
     {
-      _gtk_icon_helper_set_paintable (&priv->icon_helper, paintable);
+      _gtk_icon_helper_set_paintable (priv->icon_helper, paintable);
       g_signal_connect (paintable,
                         "invalidate-contents",
                         G_CALLBACK (gtk_image_paintable_invalidate_contents),
@@ -1070,7 +1070,7 @@ gtk_image_set_from_texture (GtkImage   *image,
 
   if (texture)
     {
-      _gtk_icon_helper_set_texture (&priv->icon_helper, texture);
+      _gtk_icon_helper_set_texture (priv->icon_helper, texture);
       g_object_unref (texture);
     }
 
@@ -1096,7 +1096,7 @@ gtk_image_get_storage_type (GtkImage *image)
 
   g_return_val_if_fail (GTK_IS_IMAGE (image), GTK_IMAGE_EMPTY);
 
-  return _gtk_icon_helper_get_storage_type (&priv->icon_helper);
+  return _gtk_icon_helper_get_storage_type (priv->icon_helper);
 }
 
 /**
@@ -1119,7 +1119,7 @@ gtk_image_get_surface (GtkImage *image)
 
   g_return_val_if_fail (GTK_IS_IMAGE (image), NULL);
 
-  return _gtk_icon_helper_peek_surface (&priv->icon_helper);
+  return _gtk_icon_helper_peek_surface (priv->icon_helper);
 }
 
 /**
@@ -1142,7 +1142,7 @@ gtk_image_get_paintable (GtkImage *image)
 
   g_return_val_if_fail (GTK_IS_IMAGE (image), NULL);
 
-  return _gtk_icon_helper_peek_paintable (&priv->icon_helper);
+  return _gtk_icon_helper_peek_paintable (priv->icon_helper);
 }
 
 /**
@@ -1165,7 +1165,7 @@ gtk_image_get_texture (GtkImage *image)
 
   g_return_val_if_fail (GTK_IS_IMAGE (image), NULL);
 
-  return _gtk_icon_helper_peek_texture (&priv->icon_helper);
+  return _gtk_icon_helper_peek_texture (priv->icon_helper);
 }
 
 /**
@@ -1191,7 +1191,7 @@ gtk_image_get_icon_name (GtkImage *image)
 
   g_return_val_if_fail (GTK_IS_IMAGE (image), NULL);
 
-  return _gtk_icon_helper_get_icon_name (&priv->icon_helper);
+  return _gtk_icon_helper_get_icon_name (priv->icon_helper);
 }
 
 /**
@@ -1217,7 +1217,7 @@ gtk_image_get_gicon (GtkImage *image)
 
   g_return_val_if_fail (GTK_IS_IMAGE (image), NULL);
 
-  return _gtk_icon_helper_peek_gicon (&priv->icon_helper);
+  return _gtk_icon_helper_peek_gicon (priv->icon_helper);
 }
 
 /**
@@ -1253,7 +1253,7 @@ gtk_image_unrealize (GtkWidget *widget)
   GtkImage *image = GTK_IMAGE (widget);
   GtkImagePrivate *priv = gtk_image_get_instance_private (image);
 
-  gtk_icon_helper_invalidate (&priv->icon_helper);
+  gtk_icon_helper_invalidate (priv->icon_helper);
 
   GTK_WIDGET_CLASS (gtk_image_parent_class)->unrealize (widget);
 }
@@ -1294,13 +1294,13 @@ gtk_image_snapshot (GtkWidget   *widget,
   width = gtk_widget_get_width (widget);
   height = gtk_widget_get_height (widget);
 
-  if (_gtk_icon_helper_get_storage_type (&priv->icon_helper) == GTK_IMAGE_PAINTABLE)
+  if (_gtk_icon_helper_get_storage_type (priv->icon_helper) == GTK_IMAGE_PAINTABLE)
     {
-      gtk_icon_helper_snapshot (&priv->icon_helper, snapshot, width, height);
+      gtk_icon_helper_snapshot (priv->icon_helper, snapshot, width, height);
     }
   else
     {
-      _gtk_icon_helper_get_size (&priv->icon_helper, &w, &h);
+      _gtk_icon_helper_get_size (priv->icon_helper, &w, &h);
       x = (width - w) / 2;
 
       baseline = gtk_widget_get_allocated_baseline (widget);
@@ -1311,7 +1311,7 @@ gtk_image_snapshot (GtkWidget   *widget,
         y = CLAMP (baseline - h * gtk_image_get_baseline_align (image), 0, height - h);
 
       gtk_snapshot_offset (snapshot, x, y);
-      gtk_icon_helper_snapshot (&priv->icon_helper, snapshot, w, h);
+      gtk_icon_helper_snapshot (priv->icon_helper, snapshot, w, h);
       gtk_snapshot_offset (snapshot, -x, -y);
     }
 }
@@ -1357,7 +1357,7 @@ gtk_image_set_from_definition (GtkImage           *image,
 
   if (def != NULL)
     {
-      _gtk_icon_helper_set_definition (&priv->icon_helper, def);
+      _gtk_icon_helper_set_definition (priv->icon_helper, def);
 
       gtk_image_notify_for_storage_type (image, gtk_image_definition_get_storage_type (def));
     }
@@ -1370,7 +1370,7 @@ gtk_image_get_definition (GtkImage *image)
 {
   GtkImagePrivate *priv = gtk_image_get_instance_private (image);
 
-  return gtk_icon_helper_get_definition (&priv->icon_helper);
+  return gtk_icon_helper_get_definition (priv->icon_helper);
 }
 
 /**
@@ -1411,7 +1411,7 @@ gtk_image_clear (GtkImage *image)
 
   if (storage_type == GTK_IMAGE_PAINTABLE)
     {
-      GdkPaintable *paintable = _gtk_icon_helper_peek_paintable (&priv->icon_helper);
+      GdkPaintable *paintable = _gtk_icon_helper_peek_paintable (priv->icon_helper);
       g_signal_handlers_disconnect_by_func (paintable,
                                             gtk_image_paintable_invalidate_contents,
                                             image);
@@ -1420,7 +1420,7 @@ gtk_image_clear (GtkImage *image)
                                             image);
     }
 
-  _gtk_icon_helper_clear (&priv->icon_helper);
+  _gtk_icon_helper_clear (priv->icon_helper);
 
   g_object_thaw_notify (G_OBJECT (image));
 }
@@ -1437,7 +1437,7 @@ gtk_image_measure (GtkWidget      *widget,
   GtkImagePrivate *priv = gtk_image_get_instance_private (GTK_IMAGE (widget));
   float baseline_align;
 
-  gtk_icon_helper_measure (&priv->icon_helper,
+  gtk_icon_helper_measure (priv->icon_helper,
                            orientation,
                            for_size,
                            minimum, natural);
@@ -1460,7 +1460,7 @@ gtk_image_style_updated (GtkWidget *widget)
   GtkStyleContext *context = gtk_widget_get_style_context (widget);
   GtkCssStyleChange *change = gtk_style_context_get_change (context);
 
-  gtk_icon_helper_invalidate_for_change (&priv->icon_helper, change);
+  gtk_icon_helper_invalidate_for_change (priv->icon_helper, change);
 
   GTK_WIDGET_CLASS (gtk_image_parent_class)->style_updated (widget);
 
@@ -1484,7 +1484,7 @@ gtk_image_set_pixel_size (GtkImage *image,
 
   g_return_if_fail (GTK_IS_IMAGE (image));
 
-  if (_gtk_icon_helper_set_pixel_size (&priv->icon_helper, pixel_size))
+  if (_gtk_icon_helper_set_pixel_size (priv->icon_helper, pixel_size))
     {
       if (gtk_widget_get_visible (GTK_WIDGET (image)))
         gtk_widget_queue_resize (GTK_WIDGET (image));
@@ -1507,7 +1507,7 @@ gtk_image_get_pixel_size (GtkImage *image)
 
   g_return_val_if_fail (GTK_IS_IMAGE (image), -1);
 
-  return _gtk_icon_helper_get_pixel_size (&priv->icon_helper);
+  return _gtk_icon_helper_get_pixel_size (priv->icon_helper);
 }
 
 /**
@@ -1558,5 +1558,5 @@ gtk_image_get_image_size (GtkImage *image,
 {
   GtkImagePrivate *priv = gtk_image_get_instance_private (image);
 
-  _gtk_icon_helper_get_size (&priv->icon_helper, width, height);
+  _gtk_icon_helper_get_size (priv->icon_helper, width, height);
 }