grim/guifications2

Parents 826bca42317e
Children dadcd1299c10
Check for and use a custom buddy icon if it exists for GfItemIcon

Fixes #528
  • +1 -0
    ChangeLog
  • +113 -18
    src/gf_item_icon.c
  • --- 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.
    Version 2.16 12/16/07:
    * 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 <xmlnode.h>
    #include <gtkblist.h>
    #include <gtkutils.h>
    -
    +#include <version.h>
    #include "gf_gtk_utils.h"
    #include "gf_item.h"
    @@ -266,6 +266,115 @@
    item_icon->item);
    }
    +static GdkPixbuf *
    +gf_item_icon_get_buddy_icon(GfEventInfo *info) {
    + PurpleBuddyIcon *icon = NULL;
    + GdkPixbuf *ret = NULL;
    +
    + icon = purple_buddy_icons_find(gf_event_info_get_account(info),
    + gf_event_info_get_target(info));
    +
    + if(icon) {
    + GdkPixbufLoader *loader = NULL;
    + gconstpointer data = NULL;
    + size_t len = 0;
    +
    + 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));
    + }
    +
    + return ret;
    +}
    +
    +static inline GdkPixbuf *
    +gf_item_icon_stored_image_to_pixbuf(PurpleStoredImage *image) {
    + GdkPixbuf *ret = NULL;
    + GdkPixbufLoader *loader = NULL;
    + gconstpointer data = NULL;
    + size_t len = 0;
    +
    + data = purple_imgstore_get_data(image);
    + if(!data)
    + return NULL;
    +
    + 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));
    +
    + return ret;
    +}
    +
    +#if PURPLE_VERSION_CHECK(2,5,0)
    +static GdkPixbuf *
    +gf_item_icon_get_custom_buddy_icon(GfEventInfo *info) {
    + GdkPixbuf *ret = NULL;
    + PurpleBuddy *buddy = NULL;
    +
    + buddy = gf_event_info_get_buddy(info);
    +
    + if(!buddy)
    + return NULL;
    +
    + if(purple_buddy_icons_node_has_custom_icon(PURPLE_BLIST_NODE(buddy))) {
    + PurpleStoredImage *image = NULL;
    +
    + image =
    + purple_buddy_icons_node_find_custom_icon(PURPLE_BLIST_NODE(buddy));
    +
    + if(image) {
    + ret = gf_item_icon_stored_image_to_pixbuf(image);
    +
    + purple_imgstore_unref(image);
    + }
    + }
    +
    + return ret;
    +}
    +#else
    +static GdkPixbuf *
    +gf_item_icon_get_custom_buddy_icon(GfEventInfo *info) {
    + GdkPixbuf *ret = NULL;
    + PurpleBuddy *buddy = NULL;
    + PurpleContact *contact = NULL;
    +
    + buddy = gf_event_info_get_buddy(info);
    + if(!buddy)
    + return NULL;
    +
    + contact = purple_buddy_get_contact(buddy);
    + if(!contact)
    + return NULL;
    +
    + if(purple_buddy_icons_has_custom_icon(contact)) {
    + PurpleStoredImage *image = NULL;
    +
    + image = purple_buddy_icons_find_custom_icon(contact);
    +
    + if(image) {
    + ret = gf_item_icon_stored_image_to_pixbuf(image);
    +
    + purple_imgstore_unref(image);
    + }
    + }
    +
    + return ret;
    +}
    +#endif
    +
    void
    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;
    - const guchar *data;
    - size_t len;
    + 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));
    - if(icon) {
    - 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));
    - }
    + if(!original)
    + original = gf_item_icon_get_buddy_icon(info);
    } else if(item_icon->type == GF_ITEM_ICON_TYPE_STATUS) {
    PurpleBuddy *buddy = NULL;