X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=gtk%2Fgtkimage.c;h=d373b51b709d81586f61af595b9504d836775b3e;hb=a97178af65072e98605b2ce168ee4cc36f684ca2;hp=73d5fdf86870b8e384125dc24360f4e810ff405b;hpb=9d0febc9a64a5bfb0fcfc3a88de4757f6c1ff090;p=~andy%2Fgtk diff --git a/gtk/gtkimage.c b/gtk/gtkimage.c index 73d5fdf86..d373b51b7 100644 --- a/gtk/gtkimage.c +++ b/gtk/gtkimage.c @@ -139,6 +139,7 @@ struct _GtkImagePrivate GdkPixbufAnimationIter *animation_iter; gchar *filename; /* Only used with GTK_IMAGE_ANIMATION, GTK_IMAGE_PIXBUF */ + gchar *resource_path; /* Only used with GTK_IMAGE_PIXBUF */ }; @@ -157,7 +158,7 @@ static void gtk_image_get_preferred_height (GtkWidget *widget, static void gtk_image_style_updated (GtkWidget *widget); static void gtk_image_screen_changed (GtkWidget *widget, GdkScreen *prev_screen); -static void gtk_image_destroy (GtkWidget *widget); +static void gtk_image_finalize (GObject *object); static void gtk_image_reset (GtkImage *image); static void gtk_image_set_property (GObject *object, @@ -184,6 +185,7 @@ enum PROP_ICON_NAME, PROP_STORAGE_TYPE, PROP_GICON, + PROP_RESOURCE, PROP_USE_FALLBACK }; @@ -199,10 +201,10 @@ gtk_image_class_init (GtkImageClass *class) gobject_class->set_property = gtk_image_set_property; gobject_class->get_property = gtk_image_get_property; + gobject_class->finalize = gtk_image_finalize; widget_class = GTK_WIDGET_CLASS (class); widget_class->draw = gtk_image_draw; - widget_class->destroy = gtk_image_destroy; widget_class->get_preferred_width = gtk_image_get_preferred_width; widget_class->get_preferred_height = gtk_image_get_preferred_height; widget_class->unmap = gtk_image_unmap; @@ -309,7 +311,22 @@ gtk_image_class_init (GtkImageClass *class) P_("The GIcon being displayed"), G_TYPE_ICON, GTK_PARAM_READWRITE)); - + + /** + * GtkImage:resource: + * + * A path to a resource file to display. + * + * Since: 3.8 + */ + g_object_class_install_property (gobject_class, + PROP_RESOURCE, + g_param_spec_string ("resource", + P_("Resource"), + P_("The resource path being displayed"), + NULL, + GTK_PARAM_READWRITE)); + g_object_class_install_property (gobject_class, PROP_STORAGE_TYPE, g_param_spec_enum ("storage-type", @@ -359,14 +376,16 @@ gtk_image_init (GtkImage *image) } static void -gtk_image_destroy (GtkWidget *widget) +gtk_image_finalize (GObject *object) { - GtkImage *image = GTK_IMAGE (widget); + GtkImage *image = GTK_IMAGE (object); g_clear_object (&image->priv->icon_helper); + + g_free (image->priv->filename); - GTK_WIDGET_CLASS (gtk_image_parent_class)->destroy (widget); -} + G_OBJECT_CLASS (gtk_image_parent_class)->finalize (object); +}; static void gtk_image_set_property (GObject *object, @@ -416,6 +435,9 @@ gtk_image_set_property (GObject *object, gtk_image_set_from_gicon (image, g_value_get_object (value), icon_size); break; + case PROP_RESOURCE: + gtk_image_set_from_resource (image, g_value_get_string (value)); + break; case PROP_USE_FALLBACK: _gtk_icon_helper_set_use_fallback (priv->icon_helper, g_value_get_boolean (value)); @@ -445,7 +467,7 @@ gtk_image_get_property (GObject *object, g_value_set_string (value, priv->filename); break; case PROP_STOCK: - g_value_set_string (value, _gtk_icon_helper_get_icon_name (priv->icon_helper)); + g_value_set_string (value, _gtk_icon_helper_get_stock_id (priv->icon_helper)); break; case PROP_ICON_SET: g_value_set_boxed (value, _gtk_icon_helper_peek_icon_set (priv->icon_helper)); @@ -465,9 +487,15 @@ gtk_image_get_property (GObject *object, case PROP_GICON: 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)); break; + case PROP_STORAGE_TYPE: + 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); break; @@ -786,11 +814,13 @@ void gtk_image_set_from_resource (GtkImage *image, const gchar *resource_path) { - GdkPixbuf *pixbuf = NULL; - GInputStream *stream; + GtkImagePrivate *priv; + GdkPixbufAnimation *animation; g_return_if_fail (GTK_IS_IMAGE (image)); + priv = image->priv; + g_object_freeze_notify (G_OBJECT (image)); gtk_image_clear (image); @@ -801,14 +831,9 @@ gtk_image_set_from_resource (GtkImage *image, return; } - stream = g_resources_open_stream (resource_path, 0, NULL); - if (stream != NULL) - { - pixbuf = gdk_pixbuf_new_from_stream (stream, NULL, NULL); - g_object_unref (stream); - } + animation = gdk_pixbuf_animation_new_from_resource (resource_path, NULL); - if (pixbuf == NULL) + if (animation == NULL) { gtk_image_set_from_stock (image, GTK_STOCK_MISSING_IMAGE, @@ -817,9 +842,16 @@ gtk_image_set_from_resource (GtkImage *image, return; } - gtk_image_set_from_pixbuf (image, pixbuf); + priv->resource_path = g_strdup (resource_path); + + if (gdk_pixbuf_animation_is_static_image (animation)) + gtk_image_set_from_pixbuf (image, gdk_pixbuf_animation_get_static_image (animation)); + else + gtk_image_set_from_animation (image, animation); - g_object_unref (pixbuf); + g_object_notify (G_OBJECT (image), "resource"); + + g_object_unref (animation); g_object_thaw_notify (G_OBJECT (image)); } @@ -1309,9 +1341,6 @@ animation_timeout (gpointer data) gdk_threads_add_timeout (delay, animation_timeout, image); gtk_widget_queue_draw (widget); - - if (gtk_widget_is_drawable (widget)) - gdk_window_process_updates (gtk_widget_get_window (widget), TRUE); } return FALSE; @@ -1384,6 +1413,13 @@ gtk_image_draw (GtkWidget *widget, context = gtk_widget_get_style_context (widget); + gtk_render_background (context, cr, + 0, 0, + gtk_widget_get_allocated_width (widget), gtk_widget_get_allocated_height (widget)); + gtk_render_frame (context, cr, + 0, 0, + gtk_widget_get_allocated_width (widget), gtk_widget_get_allocated_height (widget)); + gtk_misc_get_alignment (misc, &xalign, &yalign); gtk_image_get_preferred_size (image, &width, &height); _gtk_misc_get_padding_and_border (misc, &border); @@ -1391,14 +1427,8 @@ gtk_image_draw (GtkWidget *widget, if (gtk_widget_get_direction (widget) != GTK_TEXT_DIR_LTR) xalign = 1.0 - xalign; - x = floor ((gtk_widget_get_allocated_width (widget) - width) * xalign); - y = floor ((gtk_widget_get_allocated_height (widget) - height) * yalign); - - gtk_render_background (context, cr, x, y, width, height); - gtk_render_frame (context, cr, x, y, width, height); - - x += border.left; - y += border.top; + x = floor ((gtk_widget_get_allocated_width (widget) - width) * xalign) + border.left; + y = floor ((gtk_widget_get_allocated_height (widget) - height) * yalign) + border.top; if (gtk_image_get_storage_type (image) == GTK_IMAGE_ANIMATION) { @@ -1465,6 +1495,13 @@ gtk_image_reset (GtkImage *image) g_object_notify (G_OBJECT (image), "file"); } + if (priv->resource_path) + { + g_free (priv->resource_path); + priv->resource_path = NULL; + g_object_notify (G_OBJECT (image), "resource"); + } + _gtk_icon_helper_clear (priv->icon_helper); g_object_thaw_notify (G_OBJECT (image));