iconhelper: Turn into a GObject

This commit is contained in:
Benjamin Otte 2018-03-14 01:56:30 +01:00
parent 3427639b08
commit 2016f56176
4 changed files with 109 additions and 86 deletions

View 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);
}

View File

@ -35,6 +35,26 @@
#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_init (GtkIconHelper *self,
GtkCssNode *css_node,
GtkWidget *owner)
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)
{
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

View File

@ -28,31 +28,12 @@
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);

View 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);
}