# HG changeset patch # User Sean Egan # Date 1087621063 0 # Node ID b3bda982996b5a42e115bcdc4f97b5d4358f610f # Parent 2138b3a07cb89e41a43c5292f774ecfb84cf860b [gaim-migrate @ 10116] Yikes. committer: Tailor Script diff -r 2138b3a07cb8 -r b3bda982996b src/gtkaccount.c --- 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( diff -r 2138b3a07cb8 -r b3bda982996b src/protocols/gg/gg.c --- a/src/protocols/gg/gg.c Fri Jun 18 07:39:02 2004 +0000 +++ b/src/protocols/gg/gg.c Sat Jun 19 04:57:43 2004 +0000 @@ -1,6 +1,6 @@ /* * gaim - Gadu-Gadu Protocol Plugin - * $Id: gg.c 10098 2004-06-15 21:59:04Z thekingant $ + * $Id: gg.c 10116 2004-06-19 04:57:43Z seanegan $ * * Copyright (C) 2001 Arkadiusz Mi¶kiewicz * @@ -1533,6 +1533,7 @@ 0, NULL, NULL, + NO_BUDDY_ICONS, agg_list_icon, agg_list_emblems, NULL, diff -r 2138b3a07cb8 -r b3bda982996b src/protocols/irc/irc.c --- a/src/protocols/irc/irc.c Fri Jun 18 07:39:02 2004 +0000 +++ b/src/protocols/irc/irc.c Sat Jun 19 04:57:43 2004 +0000 @@ -574,6 +574,7 @@ OPT_PROTO_CHAT_TOPIC | OPT_PROTO_PASSWORD_OPTIONAL, NULL, NULL, + NO_BUDDY_ICONS, irc_blist_icon, irc_blist_emblems, NULL, diff -r 2138b3a07cb8 -r b3bda982996b src/protocols/jabber/jabber.c --- a/src/protocols/jabber/jabber.c Fri Jun 18 07:39:02 2004 +0000 +++ b/src/protocols/jabber/jabber.c Sat Jun 19 04:57:43 2004 +0000 @@ -1465,6 +1465,7 @@ OPT_PROTO_CHAT_TOPIC | OPT_PROTO_UNIQUE_CHATNAME, NULL, NULL, + NO_BUDDY_ICONS, jabber_list_icon, jabber_list_emblems, jabber_status_text, diff -r 2138b3a07cb8 -r b3bda982996b src/protocols/msn/msn.c --- a/src/protocols/msn/msn.c Fri Jun 18 07:39:02 2004 +0000 +++ b/src/protocols/msn/msn.c Sat Jun 19 04:57:43 2004 +0000 @@ -1631,9 +1631,10 @@ static GaimPluginProtocolInfo prpl_info = { GAIM_PRPL_API_VERSION, - OPT_PROTO_MAIL_CHECK | OPT_PROTO_BUDDY_ICON, + OPT_PROTO_MAIL_CHECK, NULL, NULL, + {"png", 96, 96}, msn_list_icon, msn_list_emblems, msn_status_text, diff -r 2138b3a07cb8 -r b3bda982996b src/protocols/napster/napster.c --- a/src/protocols/napster/napster.c Fri Jun 18 07:39:02 2004 +0000 +++ b/src/protocols/napster/napster.c Sat Jun 19 04:57:43 2004 +0000 @@ -553,6 +553,7 @@ OPT_PROTO_CHAT_TOPIC, NULL, NULL, + NO_BUDDY_ICONS, nap_list_icon, nap_list_emblems, NULL, diff -r 2138b3a07cb8 -r b3bda982996b src/protocols/novell/novell.c --- a/src/protocols/novell/novell.c Fri Jun 18 07:39:02 2004 +0000 +++ b/src/protocols/novell/novell.c Sat Jun 19 04:57:43 2004 +0000 @@ -3314,6 +3314,7 @@ 0, NULL, NULL, + NO_BUDDY_ICONS, novell_list_icon, novell_list_emblems, novell_status_text, diff -r 2138b3a07cb8 -r b3bda982996b src/protocols/oscar/oscar.c --- a/src/protocols/oscar/oscar.c Fri Jun 18 07:39:02 2004 +0000 +++ b/src/protocols/oscar/oscar.c Sat Jun 19 04:57:43 2004 +0000 @@ -7147,9 +7147,10 @@ static GaimPluginProtocolInfo prpl_info = { GAIM_PRPL_API_VERSION, - OPT_PROTO_MAIL_CHECK | OPT_PROTO_BUDDY_ICON | OPT_PROTO_IM_IMAGE, + OPT_PROTO_MAIL_CHECK | OPT_PROTO_IM_IMAGE, NULL, NULL, + {"jpeg,gif,bmp,ico", 50, 50}, oscar_list_icon, oscar_list_emblems, oscar_status_text, diff -r 2138b3a07cb8 -r b3bda982996b src/protocols/rendezvous/rendezvous.c --- a/src/protocols/rendezvous/rendezvous.c Fri Jun 18 07:39:02 2004 +0000 +++ b/src/protocols/rendezvous/rendezvous.c Sat Jun 19 04:57:43 2004 +0000 @@ -639,7 +639,8 @@ char hostname[255]; prpl_info.api_version = GAIM_PRPL_API_VERSION; - prpl_info.options = OPT_PROTO_NO_PASSWORD | OPT_PROTO_BUDDY_ICON; + prpl_info.options = OPT_PROTO_NO_PASSWORD; + prpl_info.icon_spec = {"FIXME, Mark!", 0,0}; prpl_info.list_icon = rendezvous_prpl_list_icon; prpl_info.list_emblems = rendezvous_prpl_list_emblems; prpl_info.status_text = rendezvous_prpl_status_text; diff -r 2138b3a07cb8 -r b3bda982996b src/protocols/silc/silc.c --- a/src/protocols/silc/silc.c Fri Jun 18 07:39:02 2004 +0000 +++ b/src/protocols/silc/silc.c Sat Jun 19 04:57:43 2004 +0000 @@ -1265,6 +1265,7 @@ OPT_PROTO_PASSWORD_OPTIONAL, NULL, NULL, + NO_BUDDY_ICONS, silcgaim_list_icon, silcgaim_list_emblems, silcgaim_status_text, diff -r 2138b3a07cb8 -r b3bda982996b src/protocols/toc/toc.c --- a/src/protocols/toc/toc.c Fri Jun 18 07:39:02 2004 +0000 +++ b/src/protocols/toc/toc.c Sat Jun 19 04:57:43 2004 +0000 @@ -2098,6 +2098,7 @@ 0, NULL, NULL, + NO_BUDDY_ICONS, toc_list_icon, toc_list_emblems, NULL, diff -r 2138b3a07cb8 -r b3bda982996b src/protocols/trepia/trepia.c --- a/src/protocols/trepia/trepia.c Fri Jun 18 07:39:02 2004 +0000 +++ b/src/protocols/trepia/trepia.c Sat Jun 19 04:57:43 2004 +0000 @@ -1197,9 +1197,10 @@ static GaimPluginProtocolInfo prpl_info = { GAIM_PRPL_API_VERSION, - OPT_PROTO_BUDDY_ICON, + 0, NULL, /* user_splits */ NULL, /* protocol_options */ + {"Christian, fix me!", 0, 0}, trepia_list_icon, trepia_list_emblems, trepia_status_text, diff -r 2138b3a07cb8 -r b3bda982996b src/protocols/yahoo/yahoo.c --- a/src/protocols/yahoo/yahoo.c Fri Jun 18 07:39:02 2004 +0000 +++ b/src/protocols/yahoo/yahoo.c Sat Jun 19 04:57:43 2004 +0000 @@ -3187,9 +3187,10 @@ static GaimPluginProtocolInfo prpl_info = { GAIM_PRPL_API_VERSION, - OPT_PROTO_MAIL_CHECK | OPT_PROTO_CHAT_TOPIC | OPT_PROTO_BUDDY_ICON, + OPT_PROTO_MAIL_CHECK | OPT_PROTO_CHAT_TOPIC, NULL, /* user_splits */ NULL, /* protocol_options */ + {"png", 96, 96}, yahoo_list_icon, yahoo_list_emblems, yahoo_status_text, diff -r 2138b3a07cb8 -r b3bda982996b src/protocols/zephyr/zephyr.c --- a/src/protocols/zephyr/zephyr.c Fri Jun 18 07:39:02 2004 +0000 +++ b/src/protocols/zephyr/zephyr.c Sat Jun 19 04:57:43 2004 +0000 @@ -1286,7 +1286,8 @@ OPT_PROTO_CHAT_TOPIC | OPT_PROTO_NO_PASSWORD, NULL, NULL, - zephyr_list_icon, + NO_BUDDY_ICONS, + zephyr_list_icon, NULL, NULL, NULL, diff -r 2138b3a07cb8 -r b3bda982996b src/prpl.h --- a/src/prpl.h Fri Jun 18 07:39:02 2004 +0000 +++ b/src/prpl.h Sat Jun 19 04:57:43 2004 +0000 @@ -100,6 +100,21 @@ } GaimConvImFlags; +/** + * A description of a Buddy Icon specification. This tells Gaim what kind of image file + * it should give this prpl, and what kind of image file it should expect back. + */ +typedef struct { + char *format; /**< This is a comma-delimited list of image formats or NULL if icons are not supported. + * The core nor the prpl will actually check to see if the data it's given matches this, it's entirely + * up to the UI to do what it wants */ + int width; /**< The width of this icon */ + int height; /**< The height of this icon */ +} GaimBuddyIconSpec; + +/* This #define exists just to make it easier to fill out the buddy icon field in he prpl info struct for protocols that couldn't care less. */ +#define NO_BUDDY_ICONS {NULL, 0, 0} + #include "blist.h" #include "proxy.h" #include "plugin.h" @@ -146,8 +161,11 @@ * Buddy icon support. * * Oscar and Jabber have buddy icons. + * + * *We'll do this a bit more sophisticated like, now. + * + * OPT_PROTO_BUDDY_ICON = 0x00000040, */ - OPT_PROTO_BUDDY_ICON = 0x00000040, /** * Images in IMs. @@ -194,7 +212,9 @@ GList *user_splits; /* A GList of GaimAccountUserSplit */ GList *protocol_options; /* A GList of GaimAccountOption */ - + + GaimBuddyIconSpec icon_spec; /* The icon spec. */ + /** * Returns the base icon name for the given buddy and account. * If buddy is NULL, it will return the name to use for the account's icon