pidgin/gtkimhtml.c

branch
release-2.2.1
changeset 20066
f75a71fa6e19
parent 20043
4e5c87f9d62c
child 20416
34b818f1b8b8
equal deleted inserted replaced
20043:4e5c87f9d62c 20066:f75a71fa6e19
3208 int delay; 3208 int delay;
3209 3209
3210 im_image = data; 3210 im_image = data;
3211 3211
3212 /* Update the pointer to this GdkPixbuf frame of the animation */ 3212 /* Update the pointer to this GdkPixbuf frame of the animation */
3213 if (gdk_pixbuf_animation_iter_advance(GTK_IMHTML_ANIMATION(im_image)->iter, NULL)) { 3213 g_object_unref(G_OBJECT(im_image->pixbuf));
3214 GdkPixbuf *pb = gdk_pixbuf_animation_iter_get_pixbuf(GTK_IMHTML_ANIMATION(im_image)->iter); 3214 gdk_pixbuf_animation_iter_advance(GTK_IMHTML_ANIMATION(im_image)->iter, NULL);
3215 g_object_unref(G_OBJECT(im_image->pixbuf)); 3215 im_image->pixbuf = gdk_pixbuf_animation_iter_get_pixbuf(GTK_IMHTML_ANIMATION(im_image)->iter);
3216 im_image->pixbuf = gdk_pixbuf_copy(pb); 3216 g_object_ref(G_OBJECT(im_image->pixbuf));
3217 3217
3218 /* Update the displayed GtkImage */ 3218 /* Update the displayed GtkImage */
3219 width = gdk_pixbuf_get_width(gtk_image_get_pixbuf(im_image->image)); 3219 width = gdk_pixbuf_get_width(gtk_image_get_pixbuf(im_image->image));
3220 height = gdk_pixbuf_get_height(gtk_image_get_pixbuf(im_image->image)); 3220 height = gdk_pixbuf_get_height(gtk_image_get_pixbuf(im_image->image));
3221 if (width > 0 && height > 0) 3221 if (width > 0 && height > 0)
3222 { 3222 {
3223 /* Need to scale the new frame to the same size as the old frame */ 3223 /* Need to scale the new frame to the same size as the old frame */
3224 GdkPixbuf *tmp; 3224 GdkPixbuf *tmp;
3225 tmp = gdk_pixbuf_scale_simple(im_image->pixbuf, width, height, GDK_INTERP_BILINEAR); 3225 tmp = gdk_pixbuf_scale_simple(im_image->pixbuf, width, height, GDK_INTERP_BILINEAR);
3226 gtk_image_set_from_pixbuf(im_image->image, tmp); 3226 gtk_image_set_from_pixbuf(im_image->image, tmp);
3227 g_object_unref(G_OBJECT(tmp)); 3227 g_object_unref(G_OBJECT(tmp));
3228 } else { 3228 } else {
3229 /* Display at full-size */ 3229 /* Display at full-size */
3230 gtk_image_set_from_pixbuf(im_image->image, im_image->pixbuf); 3230 gtk_image_set_from_pixbuf(im_image->image, im_image->pixbuf);
3231 }
3232 } 3231 }
3233 3232
3234 delay = MIN(gdk_pixbuf_animation_iter_get_delay_time(GTK_IMHTML_ANIMATION(im_image)->iter), 100); 3233 delay = MIN(gdk_pixbuf_animation_iter_get_delay_time(GTK_IMHTML_ANIMATION(im_image)->iter), 100);
3235 GTK_IMHTML_ANIMATION(im_image)->timer = g_timeout_add(delay, animate_image_cb, im_image); 3234 GTK_IMHTML_ANIMATION(im_image)->timer = g_timeout_add(delay, animate_image_cb, im_image);
3236 3235
3247 3246
3248 GTK_IMHTML_ANIMATION(im_image)->anim = anim; 3247 GTK_IMHTML_ANIMATION(im_image)->anim = anim;
3249 if (gdk_pixbuf_animation_is_static_image(anim)) { 3248 if (gdk_pixbuf_animation_is_static_image(anim)) {
3250 GTK_IMHTML_ANIMATION(im_image)->iter = NULL; 3249 GTK_IMHTML_ANIMATION(im_image)->iter = NULL;
3251 im_image->pixbuf = gdk_pixbuf_animation_get_static_image(anim); 3250 im_image->pixbuf = gdk_pixbuf_animation_get_static_image(anim);
3252 g_object_ref(im_image->pixbuf);
3253 GTK_IMHTML_ANIMATION(im_image)->timer = 0; 3251 GTK_IMHTML_ANIMATION(im_image)->timer = 0;
3254 } else { 3252 } else {
3255 int delay; 3253 int delay;
3256 GdkPixbuf *pb;
3257 GTK_IMHTML_ANIMATION(im_image)->iter = gdk_pixbuf_animation_get_iter(anim, NULL); 3254 GTK_IMHTML_ANIMATION(im_image)->iter = gdk_pixbuf_animation_get_iter(anim, NULL);
3258 pb = gdk_pixbuf_animation_iter_get_pixbuf(GTK_IMHTML_ANIMATION(im_image)->iter); 3255 im_image->pixbuf = gdk_pixbuf_animation_iter_get_pixbuf(GTK_IMHTML_ANIMATION(im_image)->iter);
3259 im_image->pixbuf = gdk_pixbuf_copy(pb);
3260 delay = MIN(gdk_pixbuf_animation_iter_get_delay_time(GTK_IMHTML_ANIMATION(im_image)->iter), 100); 3256 delay = MIN(gdk_pixbuf_animation_iter_get_delay_time(GTK_IMHTML_ANIMATION(im_image)->iter), 100);
3261 GTK_IMHTML_ANIMATION(im_image)->timer = g_timeout_add(delay, animate_image_cb, im_image); 3257 GTK_IMHTML_ANIMATION(im_image)->timer = g_timeout_add(delay, animate_image_cb, im_image);
3262 } 3258 }
3263 im_image->image = GTK_IMAGE(gtk_image_new_from_pixbuf(im_image->pixbuf)); 3259 im_image->image = GTK_IMAGE(gtk_image_new_from_pixbuf(im_image->pixbuf));
3264 im_image->width = gdk_pixbuf_animation_get_width(anim); 3260 im_image->width = gdk_pixbuf_animation_get_width(anim);
3267 im_image->filename = g_strdup(filename); 3263 im_image->filename = g_strdup(filename);
3268 im_image->id = id; 3264 im_image->id = id;
3269 im_image->filesel = NULL; 3265 im_image->filesel = NULL;
3270 3266
3271 g_object_ref(anim); 3267 g_object_ref(anim);
3268 g_object_ref(im_image->pixbuf);
3272 3269
3273 return GTK_IMHTML_SCALABLE(im_image); 3270 return GTK_IMHTML_SCALABLE(im_image);
3274 } 3271 }
3275 3272
3276 void gtk_imhtml_image_scale(GtkIMHtmlScalable *scale, int width, int height) 3273 void gtk_imhtml_image_scale(GtkIMHtmlScalable *scale, int width, int height)
4606 } else { 4603 } else {
4607 icon = gtk_image_new_from_animation(annipixbuf); 4604 icon = gtk_image_new_from_animation(annipixbuf);
4608 if (imhtml->num_animations == 20) { 4605 if (imhtml->num_animations == 20) {
4609 GtkImage *image = GTK_IMAGE(g_queue_pop_head(imhtml->animations)); 4606 GtkImage *image = GTK_IMAGE(g_queue_pop_head(imhtml->animations));
4610 GdkPixbufAnimation *anim = gtk_image_get_animation(image); 4607 GdkPixbufAnimation *anim = gtk_image_get_animation(image);
4611 g_signal_handlers_disconnect_matched(G_OBJECT(image), G_SIGNAL_MATCH_FUNC,
4612 0, 0, NULL, G_CALLBACK(animated_smiley_destroy_cb), NULL);
4613 if (anim) { 4608 if (anim) {
4614 GdkPixbuf *pb = gdk_pixbuf_animation_get_static_image(anim); 4609 GdkPixbuf *pb = gdk_pixbuf_animation_get_static_image(anim);
4615 if (pb != NULL) { 4610 gtk_image_set_from_pixbuf(image, pb);
4616 GdkPixbuf *copy = gdk_pixbuf_copy(pb); 4611 g_object_unref(G_OBJECT(pb));
4617 gtk_image_set_from_pixbuf(image, copy);
4618 g_object_unref(G_OBJECT(copy));
4619 }
4620 } 4612 }
4621 } else { 4613 } else {
4622 imhtml->num_animations++; 4614 imhtml->num_animations++;
4623 } 4615 }
4624 g_signal_connect(G_OBJECT(icon), "destroy", G_CALLBACK(animated_smiley_destroy_cb), imhtml); 4616 g_signal_connect(G_OBJECT(icon), "destroy", G_CALLBACK(animated_smiley_destroy_cb), imhtml);

mercurial