diff src/gtkaccount.c @ 9308:b3bda982996b

[gaim-migrate @ 10116] Yikes. committer: Tailor Script <tailor@pidgin.im>
author Sean Egan <seanegan@gmail.com>
date Sat, 19 Jun 2004 04:57:43 +0000
parents 96c481da57ea
children ade6b9c0dc8a
line wrap: on
line diff
--- a/src/gtkaccount.c	Fri Jun 18 07:39:02 2004 +0000
+++ b/src/gtkaccount.c	Sat Jun 19 04:57:43 2004 +0000
@@ -22,6 +22,7 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
+
 #include "gtkinternal.h"
 
 #include "account.h"
@@ -31,6 +32,7 @@
 #include "notify.h"
 #include "plugin.h"
 #include "prefs.h"
+#include "prpl.h"
 #include "request.h"
 #include "signals.h"
 #include "util.h"
@@ -117,6 +119,7 @@
 	GtkWidget *new_mail_check;
 	GtkWidget *buddy_icon_hbox;
 	GtkWidget *buddy_icon_entry;
+	char *buddy_icon_path;
 	GtkWidget *buddy_icon_filesel;
 	GtkWidget *buddy_icon_preview;
 	GtkWidget *buddy_icon_text;
@@ -269,7 +272,10 @@
 		return;
 	}
 
-	gtk_entry_set_text(GTK_ENTRY(dialog->buddy_icon_entry), filename);
+	if (dialog->buddy_icon_path)
+		g_free(dialog->buddy_icon_path);
+	dialog->buddy_icon_path = g_strdup(filename);
+	gtk_image_set_from_file(GTK_IMAGE(dialog->buddy_icon_entry), filename);
 	gtk_widget_destroy(dialog->buddy_icon_filesel);
 }
 
@@ -377,7 +383,66 @@
 static void
 buddy_icon_reset_cb(GtkWidget *button, AccountPrefsDialog *dialog)
 {
-	gtk_entry_set_text(GTK_ENTRY(dialog->buddy_icon_entry), "");
+	if (dialog->buddy_icon_path)
+		g_free(dialog->buddy_icon_path);
+	dialog->buddy_icon_path = NULL;
+	gtk_image_set_from_file(GTK_IMAGE(dialog->buddy_icon_entry), "");
+}
+
+gboolean str_array_match(char **a, char **b)
+{
+	int i, j;
+	for (i = 0; a[i] != NULL; i++) 
+		for (j = 0; b[j] != NULL; j++) 
+			if (!g_ascii_strcasecmp(a[i], b[j]))
+				return TRUE;
+	return FALSE;
+}
+
+static void
+convert_and_set_buddy_icon(GaimAccount *account, const char *path)
+{
+	int width, height;
+	GaimPluginProtocolInfo *prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(gaim_find_prpl(account->protocol_id));
+	char **prpl_formats =  g_strsplit (prpl_info->icon_spec.format,",",0);
+	GdkPixbufFormat *format = gdk_pixbuf_get_file_info (path, &width, &height);
+	char **pixbuf_formats =  gdk_pixbuf_format_get_extensions(format);
+
+	if (str_array_match(pixbuf_formats, prpl_formats)) {
+		gaim_account_set_buddy_icon(account, path);
+	} else {
+		int i;
+		GError *error = NULL;
+		GdkPixbuf *pixbuf = gdk_pixbuf_new_from_file(path, &error);
+		GdkPixbuf *scale;
+		char *random   = g_strdup_printf("%x", g_random_int());
+		const char *dirname = gaim_buddy_icons_get_cache_dir();
+		char *filename = g_build_filename(dirname, random, NULL);
+		if (prpl_info->icon_spec.width > 0 && prpl_info->icon_spec.height > 0) {
+			scale = gdk_pixbuf_scale_simple (pixbuf, prpl_info->icon_spec.width, prpl_info->icon_spec.height, GDK_INTERP_HYPER);
+			gdk_pixbuf_unref(pixbuf);
+			pixbuf = scale;
+		}
+		if (error) {
+			g_free(filename);
+			g_free(random);
+			gaim_debug_error("buddyicon", "Could not open icon for conversion: %s\n", error->message);
+			return;
+		}
+		for (i = 0; prpl_formats[i]; i++) {
+			gaim_debug_info("buddyicon", "Converting buddy icon to %s as %s\n", prpl_formats[i], filename);
+			if (gdk_pixbuf_save (pixbuf, filename, prpl_formats[i], &error, NULL) == FALSE)
+				break;
+		}
+		if (!error) {
+			gaim_account_set_buddy_icon(account, filename);
+		} else {
+			gaim_debug_error("buddyicon", "Could not convert icon to usable format: %s\n", error->message);
+		}
+		g_free(filename);
+		g_free(random);
+		g_object_unref(pixbuf);
+	}
 }
 
 static void
@@ -578,8 +643,7 @@
 	gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
 	gtk_widget_show(label);
 
-	dialog->buddy_icon_entry = gtk_entry_new();
-	gtk_editable_set_editable(GTK_EDITABLE(dialog->buddy_icon_entry), FALSE);
+	dialog->buddy_icon_entry = gtk_image_new();
 	gtk_box_pack_start(GTK_BOX(hbox), dialog->buddy_icon_entry, TRUE, TRUE, 0);
 	gtk_widget_show(dialog->buddy_icon_entry);
 	gaim_set_accessible_label (dialog->buddy_icon_entry, label);
@@ -600,7 +664,7 @@
 		if (!(dialog->prpl_info->options & OPT_PROTO_MAIL_CHECK))
 			gtk_widget_hide(dialog->new_mail_check);
 
-		if (!(dialog->prpl_info->options & OPT_PROTO_BUDDY_ICON))
+		if (!(dialog->prpl_info->icon_spec.format != NULL))
 			gtk_widget_hide(dialog->buddy_icon_hbox);
 	}
 
@@ -608,14 +672,15 @@
 		gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dialog->new_mail_check),
 				gaim_account_get_check_mail(dialog->account));
 
-		if (gaim_account_get_buddy_icon(dialog->account) != NULL)
-			gtk_entry_set_text(GTK_ENTRY(dialog->buddy_icon_entry),
-					gaim_account_get_buddy_icon(dialog->account));
+		if (gaim_account_get_buddy_icon(dialog->account) != NULL) {
+			dialog->buddy_icon_path = g_strdup(gaim_account_get_buddy_icon(dialog->account));
+			gtk_image_set_from_file(GTK_IMAGE(dialog->buddy_icon_entry),dialog->buddy_icon_path);
+		}
 	}
 
 	if (!dialog->prpl_info ||
 			(!(dialog->prpl_info->options & OPT_PROTO_MAIL_CHECK) &&
-		!(dialog->prpl_info->options & OPT_PROTO_BUDDY_ICON))) {
+			 (dialog->prpl_info->icon_spec.format ==  NULL))) {
 
 		/* Nothing to see :( aww. */
 		gtk_widget_hide(dialog->user_frame);
@@ -1099,15 +1164,15 @@
 		gaim_account_set_alias(dialog->account, NULL);
 
 	/* Buddy Icon */
-	value = gtk_entry_get_text(GTK_ENTRY(dialog->buddy_icon_entry));
-
+	value = dialog->buddy_icon_path;
+	
 	if (dialog->prpl_info &&
-			(dialog->prpl_info->options & OPT_PROTO_BUDDY_ICON) &&
-			*value != '\0')
-		gaim_account_set_buddy_icon(dialog->account, value);
-	else
+	    (dialog->prpl_info->icon_spec.format) &&
+	    *value != '\0') {
+		convert_and_set_buddy_icon(dialog->account, value);
+	} else {
 		gaim_account_set_buddy_icon(dialog->account, NULL);
-
+	}
 	/* Remember Password */
 	gaim_account_set_remember_password(dialog->account,
 			gtk_toggle_button_get_active(