+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;
+}
+