pidgin/gtkconv.c

changeset 39929
51c9575bbdd2
parent 39858
0f2be88d88e4
child 39930
411f3df51bcd
equal deleted inserted replaced
39928:0c5e17e46226 39929:51c9575bbdd2
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)
2353 } 2354 }
2354 2355
2355 static gboolean 2356 static gboolean
2356 icon_menu(GtkWidget *widget, GdkEventButton *e, PidginConversation *gtkconv) 2357 icon_menu(GtkWidget *widget, GdkEventButton *e, PidginConversation *gtkconv)
2357 { 2358 {
2358 static GtkWidget *menu = NULL; 2359 GtkWidget *menu = NULL;
2360 GList *old_menus = NULL;
2359 PurpleConversation *conv; 2361 PurpleConversation *conv;
2360 PurpleBuddy *buddy; 2362 PurpleBuddy *buddy;
2361 2363
2362 if (e->button == GDK_BUTTON_PRIMARY && e->type == GDK_BUTTON_PRESS) { 2364 if (e->button == GDK_BUTTON_PRIMARY && e->type == GDK_BUTTON_PRESS) {
2363 change_size_cb(NULL, gtkconv); 2365 change_size_cb(NULL, 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 {

mercurial