aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDan Winship <danw@src.gnome.org>2001-09-20 02:15:57 +0800
committerDan Winship <danw@src.gnome.org>2001-09-20 02:15:57 +0800
commit982c014bffdcf15207e8a778689d1156ffc5161e (patch)
tree3b7cd46eae87313a65a85a3180bac11d9f4179d4
parent27dd700efbc33945e59eab8f35c62a6444b334bd (diff)
downloadgsoc2013-evolution-982c014bffdcf15207e8a778689d1156ffc5161e.tar.gz
gsoc2013-evolution-982c014bffdcf15207e8a778689d1156ffc5161e.tar.zst
gsoc2013-evolution-982c014bffdcf15207e8a778689d1156ffc5161e.zip
Hack around gdkpixbuf lossage by not trying to display the images
* e-summary.c (read_callback, etc): Hack around gdkpixbuf lossage by not trying to display the images incrementall. Instead, just wait until we've read the whole file, then display it all at once. Prevents garbage when rendering the icons. svn path=/trunk/; revision=12982
-rw-r--r--my-evolution/ChangeLog7
-rw-r--r--my-evolution/e-summary.c36
2 files changed, 25 insertions, 18 deletions
diff --git a/my-evolution/ChangeLog b/my-evolution/ChangeLog
index d2d86d2436..2511007499 100644
--- a/my-evolution/ChangeLog
+++ b/my-evolution/ChangeLog
@@ -1,3 +1,10 @@
+2001-09-19 Dan Winship <danw@ximian.com>
+
+ * e-summary.c (read_callback, etc): Hack around gdkpixbuf lossage
+ by not trying to display the images incrementall. Instead, just
+ wait until we've read the whole file, then display it all at once.
+ Prevents garbage when rendering the icons.
+
2001-09-18 Iain Holmes <iain@ximian.com>
* e-summary-preferences.c (weather_remove_clicked_cb): Select the next
diff --git a/my-evolution/e-summary.c b/my-evolution/e-summary.c
index 582926bf10..5c2f8feabd 100644
--- a/my-evolution/e-summary.c
+++ b/my-evolution/e-summary.c
@@ -65,9 +65,8 @@ struct _ESummaryMailFolderInfo {
typedef struct _DownloadInfo {
GtkHTMLStream *stream;
char *uri;
- char *buffer;
-
- gboolean error;
+ char *buffer, *ptr;
+ guint32 bufsize;
} DownloadInfo;
struct _ESummaryPrivate {
@@ -256,17 +255,16 @@ close_callback (GnomeVFSAsyncHandle *handle,
{
DownloadInfo *info = data;
- if (info->error) {
- gtk_html_stream_close (info->stream, GTK_HTML_STREAM_ERROR);
- } else {
- gtk_html_stream_close (info->stream, GTK_HTML_STREAM_OK);
- }
-
g_free (info->uri);
g_free (info->buffer);
g_free (info);
}
+/* The way this behaves is a workaround for ximian bug 10235: loading
+ * the image into gtkhtml progressively will result in garbage being
+ * drawn, so we wait until we've read the whole thing and then write
+ * it all at once.
+ */
static void
read_callback (GnomeVFSAsyncHandle *handle,
GnomeVFSResult result,
@@ -278,16 +276,18 @@ read_callback (GnomeVFSAsyncHandle *handle,
DownloadInfo *info = data;
if (result != GNOME_VFS_OK && result != GNOME_VFS_ERROR_EOF) {
- info->error = TRUE;
+ gtk_html_stream_close (info->stream, GTK_HTML_STREAM_ERROR);
gnome_vfs_async_close (handle, close_callback, info);
- }
-
- if (bytes_read == 0) {
- info->error = FALSE;
+ } else if (bytes_read == 0) {
+ gtk_html_stream_write (info->stream, info->buffer, info->ptr - info->buffer);
+ gtk_html_stream_close (info->stream, GTK_HTML_STREAM_OK);
gnome_vfs_async_close (handle, close_callback, info);
} else {
- gtk_html_stream_write (info->stream, buffer, bytes_read);
- gnome_vfs_async_read (handle, buffer, 4095, read_callback, info);
+ bytes_read += info->ptr - info->buffer;
+ info->bufsize += 4096;
+ info->buffer = g_realloc (info->buffer, info->bufsize);
+ info->ptr = info->buffer + bytes_read;
+ gnome_vfs_async_read (handle, info->ptr, 4095, read_callback, info);
}
}
@@ -303,7 +303,8 @@ open_callback (GnomeVFSAsyncHandle *handle,
return;
}
- info->buffer = g_new (char, 4096);
+ info->bufsize = 4096;
+ info->buffer = info->ptr = g_new (char, info->bufsize);
gnome_vfs_async_read (handle, info->buffer, 4095, read_callback, info);
}
@@ -364,7 +365,6 @@ e_summary_url_requested (GtkHTML *html,
info = g_new (DownloadInfo, 1);
info->stream = stream;
info->uri = filename;
- info->error = FALSE;
gnome_vfs_async_open (&handle, filename, GNOME_VFS_OPEN_READ,
(GnomeVFSAsyncOpenCallback) open_callback, info);