diff -r 763d885ff7a2 -r c7e61e2917c9 pidgin/gtkstatusbox.c --- a/pidgin/gtkstatusbox.c Wed Apr 25 01:19:24 2007 +0000 +++ b/pidgin/gtkstatusbox.c Wed Apr 25 21:48:56 2007 +0000 @@ -42,8 +42,10 @@ #include #include "account.h" +#include "buddyicon.h" #include "core.h" #include "internal.h" +#include "imgstore.h" #include "network.h" #include "savedstatuses.h" #include "status.h" @@ -383,13 +385,27 @@ if (status_box->account && !purple_account_get_bool(status_box->account, "use-global-buddyicon", TRUE)) { - char *string = purple_buddy_icons_get_full_path(purple_account_get_buddy_icon(status_box->account)); - pidgin_status_box_set_buddy_icon(status_box, string); - g_free(string); + PurpleStoredImage *img = purple_buddy_icons_find_account_icon(status_box->account); + pidgin_status_box_set_buddy_icon(status_box, img); + purple_imgstore_unref(img); } else { - pidgin_status_box_set_buddy_icon(status_box, purple_prefs_get_path(PIDGIN_PREFS_ROOT "/accounts/buddyicon")); + const char *filename = purple_prefs_get_path(PIDGIN_PREFS_ROOT "/accounts/buddyicon"); + PurpleStoredImage *img = NULL; + + if (filename != NULL) + { + gchar *contents; + gsize size; + if (g_file_get_contents(filename, &contents, &size, NULL)) + { + img = purple_imgstore_add(contents, size, filename); + g_free(contents); + } + } + + pidgin_status_box_set_buddy_icon(status_box, img); } status_box->hand_cursor = gdk_cursor_new (GDK_HAND2); @@ -422,6 +438,8 @@ gdk_cursor_unref(statusbox->hand_cursor); gdk_cursor_unref(statusbox->arrow_cursor); + purple_imgstore_unref(statusbox->buddy_icon_img); + g_object_unref(G_OBJECT(statusbox->buddy_icon)); g_object_unref(G_OBJECT(statusbox->buddy_icon_hover)); @@ -431,12 +449,10 @@ if (statusbox->icon_box_menu) gtk_widget_destroy(statusbox->icon_box_menu); - g_free(statusbox->buddy_icon_path); - statusbox->icon = NULL; statusbox->icon_box = NULL; statusbox->icon_box_menu = NULL; - statusbox->buddy_icon_path = NULL; + statusbox->buddy_icon_img = NULL; statusbox->buddy_icon = NULL; statusbox->buddy_icon_hover = NULL; statusbox->hand_cursor = NULL; @@ -489,14 +505,13 @@ gdk_cursor_unref(statusbox->hand_cursor); gdk_cursor_unref(statusbox->arrow_cursor); + purple_imgstore_unref(statusbox->buddy_icon_img); g_object_unref(G_OBJECT(statusbox->buddy_icon)); g_object_unref(G_OBJECT(statusbox->buddy_icon_hover)); if (statusbox->buddy_icon_sel) gtk_widget_destroy(statusbox->buddy_icon_sel); - g_free(statusbox->buddy_icon_path); - G_OBJECT_CLASS(parent_class)->finalize(obj); } @@ -1432,22 +1447,21 @@ static void buddy_icon_set_cb(const char *filename, PidginStatusBox *box) { + PurpleStoredImage *img = NULL; if (box->account) { PurplePlugin *plug = purple_find_prpl(purple_account_get_protocol_id(box->account)); if (plug) { PurplePluginProtocolInfo *prplinfo = PURPLE_PLUGIN_PROTOCOL_INFO(plug); if (prplinfo && prplinfo->icon_spec.format) { - char *icon = NULL; -#if 0 + gpointer data = NULL; + size_t len = 0; if (filename) - icon = pidgin_convert_buddy_icon(plug, filename); -#endif + data = pidgin_convert_buddy_icon(plug, filename, &len); + img = purple_buddy_icons_set_account_icon(box->account, data, len); + purple_account_set_buddy_icon_path(box->account, filename); + purple_account_set_bool(box->account, "use-global-buddyicon", (filename != NULL)); - purple_account_set_ui_string(box->account, PIDGIN_UI, "non-global-buddyicon-cached-path", icon); - purple_account_set_buddy_icon_path(box->account, filename); - purple_account_set_buddy_icon(box->account, icon); - g_free(icon); } } } else { @@ -1460,19 +1474,20 @@ if (prplinfo != NULL && purple_account_get_bool(account, "use-global-buddyicon", TRUE) && prplinfo->icon_spec.format) { - char *icon = NULL; -#if 0 + gpointer data = NULL; + size_t len = 0; if (filename) - icon = pidgin_convert_buddy_icon(plug, filename); -#endif - purple_account_set_buddy_icon_path(account, filename); - purple_account_set_buddy_icon(account, icon); - g_free(icon); + data = pidgin_convert_buddy_icon(plug, filename, &len); + img = purple_buddy_icons_set_account_icon(box->account, data, len); + purple_account_set_buddy_icon_path(box->account, filename); + + purple_account_set_bool(box->account, "use-global-buddyicon", (filename != NULL)); } } } } - pidgin_status_box_set_buddy_icon(box, filename); + + pidgin_status_box_set_buddy_icon(box, img); } static void @@ -2044,10 +2059,14 @@ status_box->buddy_icon = NULL; status_box->buddy_icon_hover = NULL; - if ((status_box->buddy_icon_path != NULL) && - (*status_box->buddy_icon_path != '\0')) - status_box->buddy_icon = gdk_pixbuf_new_from_file_at_scale(status_box->buddy_icon_path, - status_box->icon_size, status_box->icon_size, FALSE, NULL); + if (status_box->buddy_icon_img != NULL) + { + GdkPixbufLoader *loader = gdk_pixbuf_loader_new(); + gdk_pixbuf_loader_write(loader, purple_imgstore_get_data(status_box->buddy_icon_img), + purple_imgstore_get_size(status_box->buddy_icon_img), NULL); + gdk_pixbuf_loader_close(loader, NULL); + status_box->buddy_icon = gdk_pixbuf_loader_get_pixbuf(loader); + } if (status_box->buddy_icon == NULL) { @@ -2068,20 +2087,14 @@ } void -pidgin_status_box_set_buddy_icon(PidginStatusBox *status_box, const char *filename) +pidgin_status_box_set_buddy_icon(PidginStatusBox *status_box, PurpleStoredImage *img) { - g_free(status_box->buddy_icon_path); - status_box->buddy_icon_path = g_strdup(filename); + purple_imgstore_unref(status_box->buddy_icon_img); + status_box->buddy_icon_img = purple_imgstore_ref(img); pidgin_status_box_redisplay_buddy_icon(status_box); } -const char* -pidgin_status_box_get_buddy_icon(PidginStatusBox *box) -{ - return box->buddy_icon_path; -} - void pidgin_status_box_pulse_connecting(PidginStatusBox *status_box) {