| 2480 return; |
2480 return; |
| 2481 } |
2481 } |
| 2482 fclose(fp); |
2482 fclose(fp); |
| 2483 } |
2483 } |
| 2484 |
2484 |
| 2485 static const char * |
|
| 2486 custom_icon_pref_name(PidginConversation *gtkconv) |
|
| 2487 { |
|
| 2488 PurpleConversation *conv; |
|
| 2489 PurpleAccount *account; |
|
| 2490 PurpleBuddy *buddy; |
|
| 2491 |
|
| 2492 conv = gtkconv->active_conv; |
|
| 2493 account = purple_conversation_get_account(conv); |
|
| 2494 buddy = purple_find_buddy(account, purple_conversation_get_name(conv)); |
|
| 2495 if (buddy) { |
|
| 2496 PurpleContact *contact = purple_buddy_get_contact(buddy); |
|
| 2497 return purple_blist_node_get_string((PurpleBlistNode*)contact, "custom_buddy_icon"); |
|
| 2498 } |
|
| 2499 return NULL; |
|
| 2500 } |
|
| 2501 |
|
| 2502 static void |
2485 static void |
| 2503 custom_icon_sel_cb(const char *filename, gpointer data) |
2486 custom_icon_sel_cb(const char *filename, gpointer data) |
| 2504 { |
2487 { |
| 2505 if (filename) { |
2488 if (filename) { |
| 2506 PidginConversation *gtkconv = data; |
2489 PidginConversation *gtkconv = data; |
| 2536 const gchar *ext; |
2519 const gchar *ext; |
| 2537 gchar *buf; |
2520 gchar *buf; |
| 2538 |
2521 |
| 2539 g_return_if_fail(conv != NULL); |
2522 g_return_if_fail(conv != NULL); |
| 2540 |
2523 |
| 2541 ext = purple_buddy_icon_get_type(purple_conv_im_get_icon(PURPLE_CONV_IM(conv))); |
2524 ext = purple_buddy_icon_get_extension(purple_conv_im_get_icon(PURPLE_CONV_IM(conv))); |
| 2542 if (ext == NULL) |
|
| 2543 ext = "icon"; |
|
| 2544 |
2525 |
| 2545 buf = g_strdup_printf("%s.%s", purple_normalize(conv->account, conv->name), ext); |
2526 buf = g_strdup_printf("%s.%s", purple_normalize(conv->account, conv->name), ext); |
| 2546 |
2527 |
| 2547 purple_request_file(gtkconv, _("Save Icon"), buf, TRUE, |
2528 purple_request_file(gtkconv, _("Save Icon"), buf, TRUE, |
| 2548 G_CALLBACK(saveicon_writefile_cb), NULL, gtkconv); |
2529 G_CALLBACK(saveicon_writefile_cb), NULL, gtkconv); |
| 2608 pidgin_new_item_from_stock(menu, _("Set Custom Icon..."), NULL, |
2590 pidgin_new_item_from_stock(menu, _("Set Custom Icon..."), NULL, |
| 2609 G_CALLBACK(set_custom_icon_cb), gtkconv, |
2591 G_CALLBACK(set_custom_icon_cb), gtkconv, |
| 2610 0, 0, NULL); |
2592 0, 0, NULL); |
| 2611 |
2593 |
| 2612 /* Is there a custom icon for this person? */ |
2594 /* Is there a custom icon for this person? */ |
| 2613 pref = custom_icon_pref_name(gtkconv); |
2595 conv = gtkconv->active_conv; |
| 2614 if (pref && *pref) { |
2596 buddy = purple_find_buddy(purple_conversation_get_account(conv), |
| 2615 pidgin_new_item_from_stock(menu, _("Remove Custom Icon"), NULL, |
2597 purple_conversation_get_name(conv)); |
| 2616 G_CALLBACK(remove_custom_icon_cb), gtkconv, |
2598 if (buddy) |
| 2617 0, 0, NULL); |
2599 { |
| |
2600 PurpleContact *contact = purple_buddy_get_contact(buddy); |
| |
2601 if (contact && purple_buddy_icons_has_custom_icon(contact)) |
| |
2602 { |
| |
2603 pidgin_new_item_from_stock(menu, _("Remove Custom Icon"), NULL, |
| |
2604 G_CALLBACK(remove_custom_icon_cb), gtkconv, |
| |
2605 0, 0, NULL); |
| |
2606 } |
| 2618 } |
2607 } |
| 2619 |
2608 |
| 2620 gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, e->button, e->time); |
2609 gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, e->button, e->time); |
| 2621 |
2610 |
| 2622 return TRUE; |
2611 return TRUE; |
| 6175 pidgin_conv_update_buddy_icon(PurpleConversation *conv) |
6164 pidgin_conv_update_buddy_icon(PurpleConversation *conv) |
| 6176 { |
6165 { |
| 6177 PidginConversation *gtkconv; |
6166 PidginConversation *gtkconv; |
| 6178 PidginWindow *win; |
6167 PidginWindow *win; |
| 6179 |
6168 |
| |
6169 PurpleBuddy *buddy; |
| |
6170 |
| 6180 GdkPixbufLoader *loader; |
6171 GdkPixbufLoader *loader; |
| 6181 GdkPixbufAnimation *anim; |
6172 GdkPixbufAnimation *anim; |
| 6182 GError *err = NULL; |
6173 GError *err = NULL; |
| 6183 |
6174 |
| 6184 const char *custom = NULL; |
6175 PurpleStoredImage *custom_img = NULL; |
| 6185 const void *data = NULL; |
6176 gconstpointer data = NULL; |
| 6186 size_t len; |
6177 size_t len; |
| 6187 |
6178 |
| 6188 GdkPixbuf *buf; |
6179 GdkPixbuf *buf; |
| 6189 |
6180 |
| 6190 GtkWidget *event; |
6181 GtkWidget *event; |
| 6237 return; |
6228 return; |
| 6238 |
6229 |
| 6239 if (purple_conversation_get_gc(conv) == NULL) |
6230 if (purple_conversation_get_gc(conv) == NULL) |
| 6240 return; |
6231 return; |
| 6241 |
6232 |
| 6242 custom = custom_icon_pref_name(gtkconv); |
6233 buddy = purple_find_buddy(account, purple_conversation_get_name(conv)); |
| 6243 if (custom) { |
6234 if (buddy) |
| 6244 /* There is a custom icon for this user */ |
6235 { |
| 6245 char *contents = NULL; |
6236 PurpleContact *contact = purple_buddy_get_contact(buddy); |
| 6246 if (!g_file_get_contents(custom, &contents, &len, &err)) { |
6237 if (contact) { |
| 6247 purple_debug_warning("custom icon", "could not load custom icon %s for %s\n", |
6238 custom_img = purple_buddy_icons_find_custom_icon(contact); |
| 6248 custom, purple_conversation_get_name(conv)); |
6239 if (custom_img) { |
| 6249 g_error_free(err); |
6240 /* There is a custom icon for this user */ |
| 6250 err = NULL; |
6241 data = purple_imgstore_get_data(custom_img); |
| 6251 } else |
6242 len = purple_imgstore_get_size(custom_img); |
| 6252 data = contents; |
6243 } |
| |
6244 } |
| 6253 } |
6245 } |
| 6254 |
6246 |
| 6255 if (data == NULL) { |
6247 if (data == NULL) { |
| 6256 icon = purple_conv_im_get_icon(PURPLE_CONV_IM(conv)); |
6248 icon = purple_conv_im_get_icon(PURPLE_CONV_IM(conv)); |
| 6257 |
6249 |
| 6258 if (icon == NULL) |
6250 if (icon == NULL) |
| 6259 return; |
6251 return; |
| 6260 |
6252 |
| 6261 data = purple_buddy_icon_get_data(icon, &len); |
6253 data = purple_buddy_icon_get_data(icon, &len); |
| 6262 custom = NULL; |
6254 |
| |
6255 if (data == NULL) |
| |
6256 return; |
| 6263 } |
6257 } |
| 6264 |
6258 |
| 6265 loader = gdk_pixbuf_loader_new(); |
6259 loader = gdk_pixbuf_loader_new(); |
| 6266 gdk_pixbuf_loader_write(loader, data, len, NULL); |
6260 gdk_pixbuf_loader_write(loader, data, len, NULL); |
| 6267 gdk_pixbuf_loader_close(loader, &err); |
6261 gdk_pixbuf_loader_close(loader, &err); |
| |
6262 |
| |
6263 purple_imgstore_unref(custom_img); |
| |
6264 |
| 6268 anim = gdk_pixbuf_loader_get_animation(loader); |
6265 anim = gdk_pixbuf_loader_get_animation(loader); |
| 6269 if (anim) |
6266 if (anim) |
| 6270 g_object_ref(G_OBJECT(anim)); |
6267 g_object_ref(G_OBJECT(anim)); |
| 6271 g_object_unref(loader); |
6268 g_object_unref(loader); |
| 6272 |
6269 |
| 6273 if (custom) |
|
| 6274 g_free((void*)data); |
|
| 6275 |
|
| 6276 if (!anim) |
6270 if (!anim) |
| 6277 return; |
6271 return; |
| 6278 gtkconv->u.im->anim = anim; |
6272 gtkconv->u.im->anim = anim; |
| 6279 |
6273 |
| 6280 if (err) { |
6274 if (err) { |
| 6281 purple_debug(PURPLE_DEBUG_ERROR, "gtkconv", |
6275 purple_debug(PURPLE_DEBUG_ERROR, "gtkconv", |
| 6282 "Buddy icon error: %s\n", err->message); |
6276 "Buddy icon error: %s\n", err->message); |
| 6283 g_error_free(err); |
6277 g_error_free(err); |
| 6284 } |
6278 } |
| 6285 |
|
| 6286 if (!gtkconv->u.im->anim) |
|
| 6287 return; |
|
| 6288 |
6279 |
| 6289 if (gdk_pixbuf_animation_is_static_image(gtkconv->u.im->anim)) { |
6280 if (gdk_pixbuf_animation_is_static_image(gtkconv->u.im->anim)) { |
| 6290 gtkconv->u.im->iter = NULL; |
6281 gtkconv->u.im->iter = NULL; |
| 6291 buf = gdk_pixbuf_animation_get_static_image(gtkconv->u.im->anim); |
6282 buf = gdk_pixbuf_animation_get_static_image(gtkconv->u.im->anim); |
| 6292 } else { |
6283 } else { |