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