--- a/ChangeLog Mon Aug 24 00:21:29 2009 -0500
+++ b/ChangeLog Mon Aug 24 01:38:17 2009 -0500
@@ -7,6 +7,7 @@
* Added Hykle Bons's theme
* Fixed the problem where notifications were shown multiple times when a
buddy was in the buddy list multiple times.
+ * The buddy icons in themes will now use a custom icon if one is set. * Really fixed the G_GNUC_NULL_TERMINATED errors on non-Windows platforms.
--- a/src/gf_item_icon.c Mon Aug 24 00:21:29 2009 -0500
+++ b/src/gf_item_icon.c Mon Aug 24 01:38:17 2009 -0500
@@ -31,7 +31,7 @@
#include "gf_gtk_utils.h"
@@ -266,6 +266,115 @@
+gf_item_icon_get_buddy_icon(GfEventInfo *info) { + PurpleBuddyIcon *icon = NULL; + icon = purple_buddy_icons_find(gf_event_info_get_account(info), + gf_event_info_get_target(info)); + GdkPixbufLoader *loader = NULL; + gconstpointer data = NULL; + loader = gdk_pixbuf_loader_new(); + data = purple_buddy_icon_get_data(icon, &len); + gdk_pixbuf_loader_write(loader, data, len, NULL); + if((ret = gdk_pixbuf_loader_get_pixbuf(loader))) + g_object_ref(G_OBJECT(ret)); + gdk_pixbuf_loader_close(loader, NULL); + g_object_unref(G_OBJECT(loader)); +static inline GdkPixbuf * +gf_item_icon_stored_image_to_pixbuf(PurpleStoredImage *image) { + GdkPixbufLoader *loader = NULL; + gconstpointer data = NULL; + data = purple_imgstore_get_data(image); + len = purple_imgstore_get_size(image); + loader = gdk_pixbuf_loader_new(); + gdk_pixbuf_loader_write(loader, data, len, NULL); + if((ret = gdk_pixbuf_loader_get_pixbuf(loader))) + g_object_ref(G_OBJECT(ret)); + gdk_pixbuf_loader_close(loader, NULL); + g_object_unref(G_OBJECT(loader)); +#if PURPLE_VERSION_CHECK(2,5,0) +gf_item_icon_get_custom_buddy_icon(GfEventInfo *info) { + PurpleBuddy *buddy = NULL; + buddy = gf_event_info_get_buddy(info); + if(purple_buddy_icons_node_has_custom_icon(PURPLE_BLIST_NODE(buddy))) { + PurpleStoredImage *image = NULL; + purple_buddy_icons_node_find_custom_icon(PURPLE_BLIST_NODE(buddy)); + ret = gf_item_icon_stored_image_to_pixbuf(image); + purple_imgstore_unref(image); +gf_item_icon_get_custom_buddy_icon(GfEventInfo *info) { + PurpleBuddy *buddy = NULL; + PurpleContact *contact = NULL; + buddy = gf_event_info_get_buddy(info); + contact = purple_buddy_get_contact(buddy); + if(purple_buddy_icons_has_custom_icon(contact)) { + PurpleStoredImage *image = NULL; + image = purple_buddy_icons_find_custom_icon(contact); + ret = gf_item_icon_stored_image_to_pixbuf(image); + purple_imgstore_unref(image); gf_item_icon_render(GfItemIcon *item_icon, GdkPixbuf *pixbuf, GfEventInfo *info)
@@ -296,24 +405,10 @@
original = pidgin_create_prpl_icon(account, PIDGIN_PRPL_ICON_LARGE);
} else if(item_icon->type == GF_ITEM_ICON_TYPE_BUDDY) {
- PurpleBuddyIcon *icon = NULL;
- GdkPixbufLoader *loader;
+ original = gf_item_icon_get_custom_buddy_icon(info); - icon = purple_buddy_icons_find(gf_event_info_get_account(info),
- gf_event_info_get_target(info));
- loader = gdk_pixbuf_loader_new();
- data = purple_buddy_icon_get_data(icon, &len);
- gdk_pixbuf_loader_write(loader, data, len, NULL);
- if((original = gdk_pixbuf_loader_get_pixbuf(loader)))
- g_object_ref(G_OBJECT(original));
- gdk_pixbuf_loader_close(loader, NULL);
- g_object_unref(G_OBJECT(loader));
+ original = gf_item_icon_get_buddy_icon(info); } else if(item_icon->type == GF_ITEM_ICON_TYPE_STATUS) {
PurpleBuddy *buddy = NULL;