pidgin/gtkimhtml.c

branch
release-2.2.1
changeset 20106
50eaec926d59
parent 19859
71d37b57eff2
child 20066
f75a71fa6e19
child 20147
66f05a854eee
child 20397
e2fe53088dc1
equal deleted inserted replaced
20105:530e447ff6d6 20106:50eaec926d59
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 g_object_unref(G_OBJECT(im_image->pixbuf)); 3213 if (gdk_pixbuf_animation_iter_advance(GTK_IMHTML_ANIMATION(im_image)->iter, NULL)) {
3214 gdk_pixbuf_animation_iter_advance(GTK_IMHTML_ANIMATION(im_image)->iter, NULL); 3214 GdkPixbuf *pb = gdk_pixbuf_animation_iter_get_pixbuf(GTK_IMHTML_ANIMATION(im_image)->iter);
3215 im_image->pixbuf = gdk_pixbuf_animation_iter_get_pixbuf(GTK_IMHTML_ANIMATION(im_image)->iter); 3215 g_object_unref(G_OBJECT(im_image->pixbuf));
3216 g_object_ref(G_OBJECT(im_image->pixbuf)); 3216 im_image->pixbuf = gdk_pixbuf_copy(pb);
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 }
3231 } 3232 }
3232 3233
3233 delay = MIN(gdk_pixbuf_animation_iter_get_delay_time(GTK_IMHTML_ANIMATION(im_image)->iter), 100); 3234 delay = MIN(gdk_pixbuf_animation_iter_get_delay_time(GTK_IMHTML_ANIMATION(im_image)->iter), 100);
3234 GTK_IMHTML_ANIMATION(im_image)->timer = g_timeout_add(delay, animate_image_cb, im_image); 3235 GTK_IMHTML_ANIMATION(im_image)->timer = g_timeout_add(delay, animate_image_cb, im_image);
3235 3236
3246 3247
3247 GTK_IMHTML_ANIMATION(im_image)->anim = anim; 3248 GTK_IMHTML_ANIMATION(im_image)->anim = anim;
3248 if (gdk_pixbuf_animation_is_static_image(anim)) { 3249 if (gdk_pixbuf_animation_is_static_image(anim)) {
3249 GTK_IMHTML_ANIMATION(im_image)->iter = NULL; 3250 GTK_IMHTML_ANIMATION(im_image)->iter = NULL;
3250 im_image->pixbuf = gdk_pixbuf_animation_get_static_image(anim); 3251 im_image->pixbuf = gdk_pixbuf_animation_get_static_image(anim);
3252 g_object_ref(im_image->pixbuf);
3251 GTK_IMHTML_ANIMATION(im_image)->timer = 0; 3253 GTK_IMHTML_ANIMATION(im_image)->timer = 0;
3252 } else { 3254 } else {
3253 int delay; 3255 int delay;
3256 GdkPixbuf *pb;
3254 GTK_IMHTML_ANIMATION(im_image)->iter = gdk_pixbuf_animation_get_iter(anim, NULL); 3257 GTK_IMHTML_ANIMATION(im_image)->iter = gdk_pixbuf_animation_get_iter(anim, NULL);
3255 im_image->pixbuf = gdk_pixbuf_animation_iter_get_pixbuf(GTK_IMHTML_ANIMATION(im_image)->iter); 3258 pb = gdk_pixbuf_animation_iter_get_pixbuf(GTK_IMHTML_ANIMATION(im_image)->iter);
3259 im_image->pixbuf = gdk_pixbuf_copy(pb);
3256 delay = MIN(gdk_pixbuf_animation_iter_get_delay_time(GTK_IMHTML_ANIMATION(im_image)->iter), 100); 3260 delay = MIN(gdk_pixbuf_animation_iter_get_delay_time(GTK_IMHTML_ANIMATION(im_image)->iter), 100);
3257 GTK_IMHTML_ANIMATION(im_image)->timer = g_timeout_add(delay, animate_image_cb, im_image); 3261 GTK_IMHTML_ANIMATION(im_image)->timer = g_timeout_add(delay, animate_image_cb, im_image);
3258 } 3262 }
3259 im_image->image = GTK_IMAGE(gtk_image_new_from_pixbuf(im_image->pixbuf)); 3263 im_image->image = GTK_IMAGE(gtk_image_new_from_pixbuf(im_image->pixbuf));
3260 im_image->width = gdk_pixbuf_animation_get_width(anim); 3264 im_image->width = gdk_pixbuf_animation_get_width(anim);
3263 im_image->filename = g_strdup(filename); 3267 im_image->filename = g_strdup(filename);
3264 im_image->id = id; 3268 im_image->id = id;
3265 im_image->filesel = NULL; 3269 im_image->filesel = NULL;
3266 3270
3267 g_object_ref(anim); 3271 g_object_ref(anim);
3268 g_object_ref(im_image->pixbuf);
3269 3272
3270 return GTK_IMHTML_SCALABLE(im_image); 3273 return GTK_IMHTML_SCALABLE(im_image);
3271 } 3274 }
3272 3275
3273 void gtk_imhtml_image_scale(GtkIMHtmlScalable *scale, int width, int height) 3276 void gtk_imhtml_image_scale(GtkIMHtmlScalable *scale, int width, int height)
4603 } else { 4606 } else {
4604 icon = gtk_image_new_from_animation(annipixbuf); 4607 icon = gtk_image_new_from_animation(annipixbuf);
4605 if (imhtml->num_animations == 20) { 4608 if (imhtml->num_animations == 20) {
4606 GtkImage *image = GTK_IMAGE(g_queue_pop_head(imhtml->animations)); 4609 GtkImage *image = GTK_IMAGE(g_queue_pop_head(imhtml->animations));
4607 GdkPixbufAnimation *anim = gtk_image_get_animation(image); 4610 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);
4608 if (anim) { 4613 if (anim) {
4609 GdkPixbuf *pb = gdk_pixbuf_animation_get_static_image(anim); 4614 GdkPixbuf *pb = gdk_pixbuf_animation_get_static_image(anim);
4610 gtk_image_set_from_pixbuf(image, pb); 4615 if (pb != NULL) {
4611 g_object_unref(G_OBJECT(pb)); 4616 GdkPixbuf *copy = gdk_pixbuf_copy(pb);
4617 gtk_image_set_from_pixbuf(image, copy);
4618 g_object_unref(G_OBJECT(copy));
4619 }
4612 } 4620 }
4613 } else { 4621 } else {
4614 imhtml->num_animations++; 4622 imhtml->num_animations++;
4615 } 4623 }
4616 g_signal_connect(G_OBJECT(icon), "destroy", G_CALLBACK(animated_smiley_destroy_cb), imhtml); 4624 g_signal_connect(G_OBJECT(icon), "destroy", G_CALLBACK(animated_smiley_destroy_cb), imhtml);

mercurial