# HG changeset patch # User Tim Ringenbach # Date 1087714674 0 # Node ID af707cc1e229c485553f66baa9f57eebaaeec144 # Parent 59bca4e8678cf1bca903ae4e8b3498879c768c55 [gaim-migrate @ 10132] Now when your buddies unset their icon, you'll no longer see it. Well on Yahoo! anyway, I doubt OSCAR actually ever tells the core when a buddy unsets his icon, since Chip just added the ability to do that a couple days ago. The caching needs to be fixed up, the file itself is never removed. I made gtkblist use GtkPixbufLoader, which i'm worried about because gtkconv has a comment about that leaking. The GaimBuddyIcon's end up being loaded from gtkblist.c, which is wrong, I think. However, they were previously not being created at all I think, except for new icons. So basicly, gtkconv and gtkblist use GaimBuddyIcon instead of loading the icon straight into a GdkPixap or whatever from the file. gtkblist will still read the file if it can't find a GaimBuddyIcon, but it creates one from the file, instead of just using the file. committer: Tailor Script diff -r 59bca4e8678c -r af707cc1e229 src/blist.c --- a/src/blist.c Sun Jun 20 05:39:21 2004 +0000 +++ b/src/blist.c Sun Jun 20 06:57:54 2004 +0000 @@ -650,7 +650,10 @@ buddy->icon = (icon == NULL ? NULL : gaim_buddy_icon_ref(icon)); } - gaim_buddy_icon_cache(icon, buddy); + if (buddy->icon) + gaim_buddy_icon_cache(icon, buddy); + else + gaim_blist_node_remove_setting((GaimBlistNode *)buddy, "buddy_icon"); schedule_blist_save(); diff -r 59bca4e8678c -r af707cc1e229 src/conversation.c --- a/src/conversation.c Sun Jun 20 05:39:21 2004 +0000 +++ b/src/conversation.c Sun Jun 20 06:57:54 2004 +0000 @@ -808,10 +808,13 @@ if (type == GAIM_CONV_IM) { + GaimBuddyIcon *icon; conv->u.im = g_new0(GaimConvIm, 1); conv->u.im->conv = conv; ims = g_list_append(ims, conv); + if ((icon = gaim_buddy_icons_find(account, name))) + gaim_conv_im_set_icon(conv->u.im, icon); gaim_conversation_set_logging(conv, gaim_prefs_get_bool("/core/logging/log_ims")); diff -r 59bca4e8678c -r af707cc1e229 src/gtkblist.c --- a/src/gtkblist.c Sun Jun 20 05:39:21 2004 +0000 +++ b/src/gtkblist.c Sun Jun 20 06:57:54 2004 +0000 @@ -2623,14 +2623,42 @@ { const char *file; GdkPixbuf *buf, *ret; + GdkPixbufLoader *loader; + GaimBuddyIcon *icon; + const char *data; + size_t len; + struct stat st; if (!gaim_prefs_get_bool("/gaim/gtk/blist/show_buddy_icons")) return NULL; - if ((file = gaim_blist_node_get_string((GaimBlistNode*)b, "buddy_icon")) == NULL) - return NULL; - - buf = gdk_pixbuf_new_from_file(file, NULL); + if (!(icon = gaim_buddy_get_icon(b))) { + if ((file = gaim_blist_node_get_string((GaimBlistNode*)b, "buddy_icon")) == NULL) + return NULL; + + /* This is a hack, we should be loading up the GaimBuddyIcon's somewhere + * else, like the core, like when we parse the blist.xml file. */ + if (!stat(file, &st)) { + FILE *f = fopen(file, "rb"); + if (f) { + char *data = g_malloc(st.st_size); + fread(data, 1, st.st_size, f); + fclose(f); + gaim_buddy_icons_set_for_user(b->account, b->name, data, st.st_size); + g_free(data); + } + } + + return NULL; /* Either no icon, or we just set one and so this will get called again */ + } + + loader = gdk_pixbuf_loader_new(); + data = gaim_buddy_icon_get_data(icon, &len); + gdk_pixbuf_loader_write(loader, data, len, NULL); + buf = gdk_pixbuf_loader_get_pixbuf(loader); + if (buf) + g_object_ref(G_OBJECT(buf)); + gdk_pixbuf_loader_close(loader, NULL); if (buf) { diff -r 59bca4e8678c -r af707cc1e229 src/gtkconv.c --- a/src/gtkconv.c Sun Jun 20 05:39:21 2004 +0000 +++ b/src/gtkconv.c Sun Jun 20 06:57:54 2004 +0000 @@ -5425,8 +5425,6 @@ FILE *file; GError *err = NULL; - GaimBuddy *buddy; - const void *data; size_t len; @@ -5445,6 +5443,8 @@ GaimButtonStyle button_type; + GaimBuddyIcon *icon; + g_return_if_fail(conv != NULL); g_return_if_fail(GAIM_IS_GTK_CONVERSATION(conv)); g_return_if_fail(gaim_conversation_get_type(conv) == GAIM_CONV_IM); @@ -5465,54 +5465,32 @@ if (gtkconv->u.im->anim) g_object_unref(G_OBJECT(gtkconv->u.im->anim)); - if((buddy = gaim_find_buddy(gaim_conversation_get_account(conv), - gaim_conversation_get_name(conv))) != NULL) { - const char *iconfile; - if((iconfile = gaim_blist_node_get_string((GaimBlistNode*)buddy, - "buddy_icon"))) { - GaimBuddyIcon *icon = gaim_conv_im_get_icon(GAIM_CONV_IM(conv)); - struct stat st; - if ((icon == NULL) && (!stat(iconfile, &st))) { - FILE *file = fopen(iconfile, "rb"); - if (file) { - char *data = g_malloc(st.st_size); - fread(data, 1, st.st_size, file); - fclose(file); - gaim_buddy_icons_set_for_user(gaim_conversation_get_account(conv), gaim_conversation_get_name(conv), data, st.st_size); - g_free(data); - } - return; - } - else - gtkconv->u.im->anim = - gdk_pixbuf_animation_new_from_file(iconfile, &err); /* LEAK */ - } - } - else - { - GaimBuddyIcon *icon = gaim_conv_im_get_icon(GAIM_CONV_IM(conv)); - - if (icon == NULL) - return; - - data = gaim_buddy_icon_get_data(icon, &len); - - /* this is such an evil hack, i don't know why i'm even considering it. - * we'll do it differently when gdk-pixbuf-loader isn't leaky anymore. */ - g_snprintf(filename, sizeof(filename), - "%s" G_DIR_SEPARATOR_S "gaimicon-%s.%d", - g_get_tmp_dir(), gaim_conversation_get_name(conv), getpid()); - - if (!(file = fopen(filename, "wb"))) - return; - - fwrite(data, 1, len, file); - fclose(file); - - gtkconv->u.im->anim = gdk_pixbuf_animation_new_from_file(filename, &err); - /* make sure we remove the file as soon as possible */ - unlink(filename); - } + + + icon = gaim_conv_im_get_icon(GAIM_CONV_IM(conv)); + + if (icon == NULL) + return; + + data = gaim_buddy_icon_get_data(icon, &len); + + /* this is such an evil hack, i don't know why i'm even considering it. + * we'll do it differently when gdk-pixbuf-loader isn't leaky anymore. */ + /* gdk-pixbuf-loader was leaky? is it still? */ + g_snprintf(filename, sizeof(filename), + "%s" G_DIR_SEPARATOR_S "gaimicon-%s.%d", + g_get_tmp_dir(), gaim_conversation_get_name(conv), getpid()); + + if (!(file = fopen(filename, "wb"))) + return; + + fwrite(data, 1, len, file); + fclose(file); + + gtkconv->u.im->anim = gdk_pixbuf_animation_new_from_file(filename, &err); + /* make sure we remove the file as soon as possible */ + unlink(filename); + if (err) { gaim_debug(GAIM_DEBUG_ERROR, "gtkconv",