Mercurial > pidgin
changeset 11840:047f85200139
[gaim-migrate @ 14131]
SF Patch #1338002 from sadrul
"When an image in a non-editable GtkIMHtml is just
enough wide/long to cause the imhtml to have a
scrollbar, the size-allocate callback for the imhtml
falls into an infinite loop. Bleeter hit this bug with
the profile of a specific yahoo-id. So did I. This
patch prevents such lockups."
committer: Tailor Script <tailor@pidgin.im>
author | Richard Laager <rlaager@wiktel.com> |
---|---|
date | Wed, 26 Oct 2005 08:35:12 +0000 |
parents | 216a05e0a6f1 |
children | f91b4fedd8b5 |
files | src/gtkimhtml.c |
diffstat | 1 files changed, 14 insertions(+), 17 deletions(-) [+] |
line wrap: on
line diff
--- a/src/gtkimhtml.c Wed Oct 26 05:59:26 2005 +0000 +++ b/src/gtkimhtml.c Wed Oct 26 08:35:12 2005 +0000 @@ -381,7 +381,7 @@ } } -static gboolean gtk_size_allocate_cb(GtkIMHtml *widget, GtkAllocation *alloc, gpointer user_data) +static void gtk_size_allocate_cb(GtkIMHtml *widget, GtkAllocation *alloc, gpointer user_data) { GdkRectangle rect; int xminus; @@ -403,7 +403,7 @@ } widget->old_rect = rect; - return FALSE; + return; } static gint @@ -3152,22 +3152,19 @@ GtkIMHtmlImage *image = (GtkIMHtmlImage *)scale; if(image->width > width || image->height > height){ + double ratio_w, ratio_h, ratio; + int new_h, new_w; GdkPixbuf *new_image = NULL; - float factor; - int new_width = image->width, new_height = image->height; - - if(image->width > (width - 2)){ - factor = (float)(width)/image->width; - new_width = width; - new_height = image->height * factor; - } - if(new_height >= (height - 2)){ - factor = (float)(height)/new_height; - new_height = height; - new_width = new_width * factor; - } - - new_image = gdk_pixbuf_scale_simple(image->pixbuf, new_width, new_height, GDK_INTERP_BILINEAR); + + ratio_w = ((double)width - 2) / image->width; + ratio_h = ((double)height - 2) / image->height; + + ratio = (ratio_w < ratio_h) ? ratio_w : ratio_h; + + new_w = (int)(image->width * ratio); + new_h = (int)(image->height * ratio); + + new_image = gdk_pixbuf_scale_simple(image->pixbuf, new_w, new_h, GDK_INTERP_BILINEAR); gtk_image_set_from_pixbuf(image->image, new_image); g_object_unref(G_OBJECT(new_image)); }