| 2234 |
2234 |
| 2235 static void |
2235 static void |
| 2236 custom_icon_sel_cb(const char *filename, gpointer data) |
2236 custom_icon_sel_cb(const char *filename, gpointer data) |
| 2237 { |
2237 { |
| 2238 if (filename) { |
2238 if (filename) { |
| 2239 const gchar *name; |
2239 PurpleContact *contact = data; |
| 2240 PurpleBuddy *buddy; |
|
| 2241 PurpleContact *contact; |
|
| 2242 PidginConversation *gtkconv = data; |
|
| 2243 PurpleConversation *conv = gtkconv->active_conv; |
|
| 2244 PurpleAccount *account = purple_conversation_get_account(conv); |
|
| 2245 |
|
| 2246 name = purple_conversation_get_name(conv); |
|
| 2247 buddy = purple_blist_find_buddy(account, name); |
|
| 2248 if (!buddy) { |
|
| 2249 purple_debug_info("custom-icon", "You can only set custom icons for people on your buddylist.\n"); |
|
| 2250 return; |
|
| 2251 } |
|
| 2252 contact = purple_buddy_get_contact(buddy); |
|
| 2253 |
2240 |
| 2254 purple_buddy_icons_node_set_custom_icon_from_file((PurpleBlistNode*)contact, filename); |
2241 purple_buddy_icons_node_set_custom_icon_from_file((PurpleBlistNode*)contact, filename); |
| 2255 } |
2242 } |
| 2256 } |
2243 g_object_set_data(G_OBJECT(data), "buddy-icon-chooser", NULL); |
| 2257 |
2244 } |
| 2258 static void |
2245 |
| 2259 set_custom_icon_cb(GtkWidget *widget, PidginConversation *gtkconv) |
2246 static void |
| 2260 { |
2247 set_custom_icon_cb(GtkWidget *widget, PurpleContact *contact) |
| 2261 GtkWidget *win = pidgin_buddy_icon_chooser_new(GTK_WINDOW(gtkconv->win->window), |
2248 { |
| 2262 custom_icon_sel_cb, gtkconv); |
2249 GtkWidget *win = NULL; |
| |
2250 |
| |
2251 /* Should not happen as menu item should be disabled. */ |
| |
2252 g_return_if_fail(contact != NULL); |
| |
2253 |
| |
2254 win = g_object_get_data(G_OBJECT(contact), "buddy-icon-chooser"); |
| |
2255 if (win == NULL) { |
| |
2256 GtkMenu *menu = GTK_MENU(gtk_widget_get_parent(widget)); |
| |
2257 GtkWidget *toplevel = |
| |
2258 gtk_widget_get_toplevel(gtk_menu_get_attach_widget(menu)); |
| |
2259 win = pidgin_buddy_icon_chooser_new(GTK_WINDOW(toplevel), |
| |
2260 custom_icon_sel_cb, contact); |
| |
2261 g_object_set_data_full(G_OBJECT(contact), "buddy-icon-chooser", win, |
| |
2262 (GDestroyNotify)gtk_widget_destroy); |
| |
2263 } |
| 2263 gtk_widget_show_all(win); |
2264 gtk_widget_show_all(win); |
| 2264 } |
2265 } |
| 2265 |
2266 |
| 2266 static void |
2267 static void |
| 2267 change_size_cb(GtkWidget *widget, PidginConversation *gtkconv) |
2268 change_size_cb(GtkWidget *widget, PidginConversation *gtkconv) |
| 2370 |
2372 |
| 2371 /* |
2373 /* |
| 2372 * If a menu already exists, destroy it before creating a new one, |
2374 * If a menu already exists, destroy it before creating a new one, |
| 2373 * thus freeing-up the memory it occupied. |
2375 * thus freeing-up the memory it occupied. |
| 2374 */ |
2376 */ |
| 2375 if (menu != NULL) |
2377 while ((old_menus = gtk_menu_get_for_attach_widget(widget)) != NULL) { |
| |
2378 menu = old_menus->data; |
| |
2379 gtk_menu_detach(GTK_MENU(menu)); |
| 2376 gtk_widget_destroy(menu); |
2380 gtk_widget_destroy(menu); |
| |
2381 } |
| 2377 |
2382 |
| 2378 menu = gtk_menu_new(); |
2383 menu = gtk_menu_new(); |
| |
2384 gtk_menu_attach_to_widget(GTK_MENU(menu), widget, NULL); |
| 2379 |
2385 |
| 2380 if (gtkconv->u.im->anim && |
2386 if (gtkconv->u.im->anim && |
| 2381 !(gdk_pixbuf_animation_is_static_image(gtkconv->u.im->anim))) |
2387 !(gdk_pixbuf_animation_is_static_image(gtkconv->u.im->anim))) |
| 2382 { |
2388 { |
| 2383 pidgin_new_check_item(menu, _("Animate"), |
2389 pidgin_new_check_item(menu, _("Animate"), |
| 2384 G_CALLBACK(toggle_icon_animate_cb), gtkconv, |
2390 G_CALLBACK(toggle_icon_animate_cb), gtkconv, |
| 2385 gtkconv->u.im->icon_timer); |
2391 gtkconv->u.im->icon_timer); |
| 2386 } |
2392 } |
| 2387 |
2393 |
| |
2394 conv = gtkconv->active_conv; |
| |
2395 buddy = purple_blist_find_buddy(purple_conversation_get_account(conv), |
| |
2396 purple_conversation_get_name(conv)); |
| |
2397 |
| 2388 pidgin_new_menu_item(menu, _("Hide Icon"), NULL, |
2398 pidgin_new_menu_item(menu, _("Hide Icon"), NULL, |
| 2389 G_CALLBACK(remove_icon), gtkconv); |
2399 G_CALLBACK(remove_icon), gtkconv); |
| 2390 |
2400 |
| 2391 pidgin_new_menu_item(menu, _("Save Icon As..."), GTK_STOCK_SAVE_AS, |
2401 pidgin_new_menu_item(menu, _("Save Icon As..."), GTK_STOCK_SAVE_AS, |
| 2392 G_CALLBACK(icon_menu_save_cb), gtkconv); |
2402 G_CALLBACK(icon_menu_save_cb), gtkconv); |
| 2393 |
2403 |
| 2394 pidgin_new_menu_item(menu, _("Set Custom Icon..."), NULL, |
2404 if (buddy) { |
| 2395 G_CALLBACK(set_custom_icon_cb), gtkconv); |
2405 PurpleContact *contact = purple_buddy_get_contact(buddy); |
| |
2406 pidgin_new_menu_item(menu, _("Set Custom Icon..."), NULL, |
| |
2407 G_CALLBACK(set_custom_icon_cb), contact); |
| |
2408 } else { |
| |
2409 GtkWidget *item = |
| |
2410 pidgin_new_menu_item(menu, _("Set Custom Icon..."), NULL, |
| |
2411 G_CALLBACK(set_custom_icon_cb), NULL); |
| |
2412 gtk_widget_set_sensitive(item, FALSE); |
| |
2413 } |
| 2396 |
2414 |
| 2397 pidgin_new_menu_item(menu, _("Change Size"), NULL, |
2415 pidgin_new_menu_item(menu, _("Change Size"), NULL, |
| 2398 G_CALLBACK(change_size_cb), gtkconv); |
2416 G_CALLBACK(change_size_cb), gtkconv); |
| 2399 |
2417 |
| 2400 /* Is there a custom icon for this person? */ |
2418 /* Is there a custom icon for this person? */ |
| 2401 conv = gtkconv->active_conv; |
|
| 2402 buddy = purple_blist_find_buddy(purple_conversation_get_account(conv), |
|
| 2403 purple_conversation_get_name(conv)); |
|
| 2404 if (buddy) |
2419 if (buddy) |
| 2405 { |
2420 { |
| 2406 PurpleContact *contact = purple_buddy_get_contact(buddy); |
2421 PurpleContact *contact = purple_buddy_get_contact(buddy); |
| 2407 if (contact && purple_buddy_icons_node_has_custom_icon((PurpleBlistNode*)contact)) |
2422 if (contact && purple_buddy_icons_node_has_custom_icon((PurpleBlistNode*)contact)) |
| 2408 { |
2423 { |