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
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)
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,
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);
}
#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)
{
}
}
-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;
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
struct _GtkImagePrivate
{
- GtkIconHelper icon_helper;
+ GtkIconHelper *icon_helper;
GtkIconSize icon_size;
float baseline_align;
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
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);
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;
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);
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);
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]);
if (icon)
{
- _gtk_icon_helper_set_gicon (&priv->icon_helper, icon);
+ _gtk_icon_helper_set_gicon (priv->icon_helper, icon);
g_object_unref (icon);
}
if (surface)
{
- _gtk_icon_helper_set_surface (&priv->icon_helper, surface);
+ _gtk_icon_helper_set_surface (priv->icon_helper, surface);
cairo_surface_destroy (surface);
}
{
GtkImagePrivate *priv = gtk_image_get_instance_private (image);
- gtk_icon_helper_invalidate (&priv->icon_helper);
+ gtk_icon_helper_invalidate (priv->icon_helper);
}
/**
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),
if (texture)
{
- _gtk_icon_helper_set_texture (&priv->icon_helper, texture);
+ _gtk_icon_helper_set_texture (priv->icon_helper, texture);
g_object_unref (texture);
}
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);
}
/**
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);
}
/**
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);
}
/**
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);
}
/**
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);
}
/**
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);
}
/**
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);
}
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);
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);
}
}
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));
}
{
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);
}
/**
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);
image);
}
- _gtk_icon_helper_clear (&priv->icon_helper);
+ _gtk_icon_helper_clear (priv->icon_helper);
g_object_thaw_notify (G_OBJECT (image));
}
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);
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);
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));
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);
}
/**
{
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);
}