+2006-02-05 [colin] 2.0.0cvs13
+
+ * src/headerview.c
+ * src/procheader.c
+ * src/procmsg.c
+ * src/procmsg.h
+ * src/textview.c
+ Show Face headers - patch partially by Klaus Flittner
+
2006-02-05 [colin] 2.0.0cvs12
* src/folderview.c
( cvs diff -u -r 1.382.2.233 -r 1.382.2.234 src/compose.c; cvs diff -u -r 1.207.2.85 -r 1.207.2.86 src/folderview.c; cvs diff -u -r 1.83.2.61 -r 1.83.2.62 src/mimeview.c; cvs diff -u -r 1.395.2.160 -r 1.395.2.161 src/summaryview.c; cvs diff -u -r 1.68.2.14 -r 1.68.2.15 src/summaryview.h; ) > 2.0.0cvs10.patchset
( cvs diff -u -r 1.395.2.161 -r 1.395.2.162 src/summaryview.c; cvs diff -u -r 1.83.2.62 -r 1.83.2.63 src/mimeview.c; ) > 2.0.0cvs11.patchset
( cvs diff -u -r 1.207.2.86 -r 1.207.2.87 src/folderview.c; cvs diff -u -r 1.395.2.162 -r 1.395.2.163 src/summaryview.c; cvs diff -u -r 1.36.2.53 -r 1.36.2.54 src/common/utils.c; cvs diff -u -r 1.20.2.31 -r 1.20.2.32 src/common/utils.h; ) > 2.0.0cvs12.patchset
+( cvs diff -u -r 1.8.2.13 -r 1.8.2.14 src/headerview.c; cvs diff -u -r 1.47.2.25 -r 1.47.2.26 src/procheader.c; cvs diff -u -r 1.150.2.49 -r 1.150.2.50 src/procmsg.c; cvs diff -u -r 1.60.2.20 -r 1.60.2.21 src/procmsg.h; cvs diff -u -r 1.96.2.91 -r 1.96.2.92 src/textview.c; ) > 2.0.0cvs13.patchset
MICRO_VERSION=0
INTERFACE_AGE=0
BINARY_AGE=0
-EXTRA_VERSION=12
+EXTRA_VERSION=13
EXTRA_RELEASE=
EXTRA_GTK2_VERSION=
# include <compface.h>
#endif
+#include <gdk-pixbuf/gdk-pixbuf.h>
+
#include "headerview.h"
#include "prefs_common.h"
#include "codeconv.h"
#include "gtkutils.h"
#include "utils.h"
+#include "base64.h"
#define TR(str) (prefs_common.trans_hdr ? gettext(str) : str)
MsgInfo *msginfo);
#endif
+static gint headerview_show_face (HeaderView *headerview,
+ MsgInfo *msginfo);
+
HeaderView *headerview_create(void)
{
HeaderView *headerview;
msginfo->subject ? msginfo->subject :
_("(No Subject)"));
+ if (!headerview_show_face(headerview, msginfo))
+ return;
+
#if HAVE_LIBCOMPFACE
headerview_show_xface(headerview, msginfo);
#endif
}
#endif
+static gint headerview_show_face (HeaderView *headerview, MsgInfo *msginfo)
+{
+ gchar face[2048];
+ gchar face_png[2048];
+ gint pngsize;
+ GtkWidget *hbox = headerview->hbox;
+ GdkPixbuf *pixbuf;
+ GError *error = NULL;
+
+ if (!msginfo->face) {
+ if (headerview->image &&
+ GTK_WIDGET_VISIBLE(headerview->image)) {
+ gtk_widget_hide(headerview->image);
+ gtk_widget_queue_resize(hbox);
+ }
+ return -1;
+ }
+ if (!GTK_WIDGET_VISIBLE(headerview->hbox)) return -1;
+
+ strncpy2(face, msginfo->face, sizeof(face));
+
+ unfold_line(face); /* strip all whitespace and linebreaks */
+ remove_space(face);
+
+ pngsize = base64_decode(face_png, face, strlen(face));
+
+ GdkPixbufLoader *loader = gdk_pixbuf_loader_new ();
+ if (!gdk_pixbuf_loader_write (loader, face_png, pngsize, &error) ||
+ !gdk_pixbuf_loader_close (loader, &error)) {
+ g_warning("loading face failed\n");
+ g_object_unref(loader);
+ if (headerview->image)
+ gtk_widget_hide(headerview->image);
+ return;
+ }
+
+ pixbuf = g_object_ref(gdk_pixbuf_loader_get_pixbuf(loader));
+
+ g_object_unref(loader);
+
+ if ((gdk_pixbuf_get_width(pixbuf) != 48) || (gdk_pixbuf_get_height(pixbuf) != 48)) {
+ g_object_unref(pixbuf);
+ return -1;
+ }
+
+ if (!headerview->image) {
+ GtkWidget *image;
+
+ image = gtk_image_new_from_pixbuf(pixbuf);
+ gtk_box_pack_start(GTK_BOX(hbox), image, FALSE, FALSE, 0);
+ gtk_widget_show(image);
+ headerview->image = image;
+ } else {
+ gtk_image_set_from_pixbuf(GTK_IMAGE(headerview->image), pixbuf);
+ gtk_widget_show(headerview->image);
+ }
+
+ g_object_unref(pixbuf);
+
+ return 0;
+}
+
void headerview_clear(HeaderView *headerview)
{
if (headerview == NULL)
H_FROM_SPACE = 13,
H_SC_PLANNED_DOWNLOAD = 14,
H_SC_MESSAGE_SIZE = 15,
- H_X_FACE = 16,
- H_DISPOSITION_NOTIFICATION_TO = 17,
- H_RETURN_RECEIPT_TO = 18,
- H_SC_PARTIALLY_RETRIEVED = 19,
- H_SC_ACCOUNT_SERVER = 20,
- H_SC_ACCOUNT_LOGIN = 21,
+ H_FACE = 16,
+ H_X_FACE = 17,
+ H_DISPOSITION_NOTIFICATION_TO = 18,
+ H_RETURN_RECEIPT_TO = 19,
+ H_SC_PARTIALLY_RETRIEVED = 20,
+ H_SC_ACCOUNT_SERVER = 21,
+ H_SC_ACCOUNT_LOGIN = 22,
};
static HeaderEntry hentry_full[] = {{"Date:", NULL, FALSE},
{"From ", NULL, FALSE},
{"SC-Marked-For-Download:", NULL, FALSE},
{"SC-Message-Size:", NULL, FALSE},
+ {"Face:", NULL, FALSE},
{"X-Face:", NULL, FALSE},
{"Disposition-Notification-To:", NULL, FALSE},
{"Return-Receipt-To:", NULL, FALSE},
MSG_UNSET_PERM_FLAGS(msginfo->flags, MSG_NEW|MSG_UNREAD);
break;
#endif
+ case H_FACE:
+ if (msginfo->face) break;
+ msginfo->face = g_strdup(hp);
+ break;
case H_X_FACE:
if (msginfo->xface) break;
msginfo->xface = g_strdup(hp);
MEMBCOPY(folder);
MEMBCOPY(to_folder);
+ MEMBDUP(face);
MEMBDUP(xface);
MEMBDUP(dispositionnotificationto);
MEMBDUP(returnreceiptto);
* procheader.c::procheader_get_headernames() */
if (!msginfo->xface)
msginfo->xface = g_strdup(full_msginfo->xface);
+ if (!msginfo->face)
+ msginfo->face = g_strdup(full_msginfo->face);
if (!msginfo->dispositionnotificationto)
msginfo->dispositionnotificationto =
g_strdup(full_msginfo->dispositionnotificationto);
g_free(msginfo->returnreceiptto);
g_free(msginfo->dispositionnotificationto);
g_free(msginfo->xface);
+ g_free(msginfo->face);
g_free(msginfo->fromname);
memusage += strlen(msginfo->inreplyto);
if (msginfo->xface)
memusage += strlen(msginfo->xface);
+ if (msginfo->face)
+ memusage += strlen(msginfo->face);
if (msginfo->dispositionnotificationto)
memusage += strlen(msginfo->dispositionnotificationto);
if (msginfo->returnreceiptto)
FolderItem *to_folder;
gchar *xface;
+ gchar *face;
gchar *dispositionnotificationto;
gchar *returnreceiptto;
#include "menu.h"
#include "image_viewer.h"
#include "filesel.h"
+#include "base64.h"
struct _RemoteURI
{
static void scrolled_cb (GtkAdjustment *adj, TextView *textview)
{
-#if HAVE_LIBCOMPFACE
if (textview->image) {
gint x, y, x1;
x1 = textview->text->allocation.width - WIDTH - 5;
gtk_text_view_move_child(GTK_TEXT_VIEW(textview->text),
textview->image, x1, y);
}
-#endif
}
static void textview_size_allocate_cb (GtkWidget *widget,
textview->mail_popup_factory = mail_popupfactory;
textview->file_popup_menu = file_popupmenu;
textview->file_popup_factory = file_popupfactory;
-
+ textview->image = NULL;
return textview;
}
return sorted_headers;
}
+static void textview_show_face(TextView *textview)
+{
+ gchar face[2048];
+ gchar face_png[2048];
+ gint pngsize;
+ GdkPixbuf *pixbuf;
+ GError *error = NULL;
+ GtkTextView *text = GTK_TEXT_VIEW(textview->text);
+ MsgInfo *msginfo = textview->messageview->msginfo;
+ int x = 0;
+
+ if (!msginfo->face) {
+ goto bail;
+ }
+
+ strncpy2(face, msginfo->face, sizeof(face));
+
+ unfold_line(face); /* strip all whitespace and linebreaks */
+ remove_space(face);
+
+ pngsize = base64_decode(face_png, face, strlen(face));
+
+ GdkPixbufLoader *loader = gdk_pixbuf_loader_new ();
+ if (!gdk_pixbuf_loader_write (loader, face_png, pngsize, &error) ||
+ !gdk_pixbuf_loader_close (loader, &error)) {
+ g_warning("loading face failed\n");
+ g_object_unref(loader);
+ goto bail;
+ }
+
+ pixbuf = g_object_ref(gdk_pixbuf_loader_get_pixbuf(loader));
+
+ g_object_unref(loader);
+
+ if ((gdk_pixbuf_get_width(pixbuf) != 48) || (gdk_pixbuf_get_height(pixbuf) != 48)) {
+ g_object_unref(pixbuf);
+ g_warning("wrong_size");
+ goto bail;
+ }
+
+ if (textview->image)
+ gtk_widget_destroy(textview->image);
+
+ textview->image = gtk_image_new_from_pixbuf(pixbuf);
+ gtk_widget_show(textview->image);
+
+ x = textview->text->allocation.width - WIDTH -5;
+
+ gtk_text_view_add_child_in_window(text, textview->image,
+ GTK_TEXT_WINDOW_TEXT, x, 5);
+
+ g_object_unref(pixbuf);
+
+ gtk_widget_show_all(textview->text);
+
+
+ return;
+bail:
+ if (textview->image)
+ gtk_widget_destroy(textview->image);
+ textview->image = NULL;
+}
+
#if HAVE_LIBCOMPFACE
static void textview_show_xface(TextView *textview)
{
if (!msginfo)
goto bail;
+ if (msginfo->face)
+ return;
+
if (!msginfo->xface || strlen(msginfo->xface) < 5) {
goto bail;
}
gtk_text_buffer_insert_with_tags_by_name(buffer, &iter, "\n", 1,
"header", NULL);
}
+
+ textview_show_face(textview);
#if HAVE_LIBCOMPFACE
textview_show_xface(textview);
#endif