comparison src/gtkconv.c @ 12638:7a2a2ca48703

[gaim-migrate @ 14974] Bleeter reported that the Send To menu doesn't deal with users not on the buddy list. committer: Tailor Script <tailor@pidgin.im>
author Richard Laager <rlaager@wiktel.com>
date Fri, 23 Dec 2005 05:00:47 +0000
parents 886498a66961
children 366326fa9cb4
comparison
equal deleted inserted replaced
12637:101c421bb396 12638:7a2a2ca48703
2874 2874
2875 return FALSE; 2875 return FALSE;
2876 } 2876 }
2877 2877
2878 static void 2878 static void
2879 create_sendto_item(GtkWidget *menu, GtkSizeGroup *sg, GSList **group, GaimBuddy *bud) 2879 create_sendto_item(GtkWidget *menu, GtkSizeGroup *sg, GSList **group, GaimBuddy *buddy, GaimAccount *account, const char *name)
2880 { 2880 {
2881 GaimAccount *account;
2882 GtkWidget *box; 2881 GtkWidget *box;
2883 GtkWidget *label; 2882 GtkWidget *label;
2884 GtkWidget *image; 2883 GtkWidget *image;
2885 GtkWidget *menuitem; 2884 GtkWidget *menuitem;
2886 GdkPixbuf *pixbuf; 2885 GdkPixbuf *pixbuf;
2887 gchar *text; 2886 gchar *text;
2888 2887
2889 account = bud->account;
2890
2891 /* Create a pixmap for the protocol icon. */ 2888 /* Create a pixmap for the protocol icon. */
2892 pixbuf = gaim_gtk_blist_get_status_icon((GaimBlistNode*)bud, GAIM_STATUS_ICON_SMALL); 2889 if (buddy != NULL)
2890 pixbuf = gaim_gtk_blist_get_status_icon((GaimBlistNode*)buddy, GAIM_STATUS_ICON_SMALL);
2891 else
2892 {
2893 GdkPixbuf *unscaled = gaim_gtk_create_prpl_icon(account);
2894
2895 /* XXX: 15 is the size for GAIM_STATUS_ICON_SMALL in gtkblist.c */
2896 pixbuf = gdk_pixbuf_scale_simple(unscaled, 15, 15,
2897 GDK_INTERP_BILINEAR);
2898 g_object_unref(G_OBJECT(unscaled));
2899 }
2900
2893 /* Now convert it to GtkImage */ 2901 /* Now convert it to GtkImage */
2894 if (pixbuf == NULL) 2902 if (pixbuf == NULL)
2895 image = gtk_image_new(); 2903 image = gtk_image_new();
2896 else 2904 else
2897 image = gtk_image_new_from_pixbuf(pixbuf); 2905 image = gtk_image_new_from_pixbuf(pixbuf);
2899 gtk_size_group_add_widget(sg, image); 2907 gtk_size_group_add_widget(sg, image);
2900 2908
2901 g_object_unref(G_OBJECT(pixbuf)); 2909 g_object_unref(G_OBJECT(pixbuf));
2902 2910
2903 /* Make our menu item */ 2911 /* Make our menu item */
2904 text = g_strdup_printf("%s (%s)", gaim_buddy_get_name(bud), gaim_account_get_username(bud->account)); 2912 text = g_strdup_printf("%s (%s)", name, gaim_account_get_username(account));
2905 menuitem = gtk_radio_menu_item_new_with_label(*group, text); 2913 menuitem = gtk_radio_menu_item_new_with_label(*group, text);
2906 g_free(text); 2914 g_free(text);
2907 *group = gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(menuitem)); 2915 *group = gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(menuitem));
2908 2916
2909 /* Do some evil, see some evil, speak some evil. */ 2917 /* Do some evil, see some evil, speak some evil. */
2924 gtk_widget_show(image); 2932 gtk_widget_show(image);
2925 gtk_widget_show(box); 2933 gtk_widget_show(box);
2926 2934
2927 /* Set our data and callbacks. */ 2935 /* Set our data and callbacks. */
2928 g_object_set_data(G_OBJECT(menuitem), "gaim_account", account); 2936 g_object_set_data(G_OBJECT(menuitem), "gaim_account", account);
2929 g_object_set_data_full(G_OBJECT(menuitem), "gaim_buddy_name", g_strdup(gaim_buddy_get_name(bud)), g_free); 2937 g_object_set_data_full(G_OBJECT(menuitem), "gaim_buddy_name", g_strdup(name), g_free);
2930 2938
2931 g_signal_connect(G_OBJECT(menuitem), "activate", 2939 g_signal_connect(G_OBJECT(menuitem), "activate",
2932 G_CALLBACK(menu_conv_sel_send_cb), NULL); 2940 G_CALLBACK(menu_conv_sel_send_cb), NULL);
2933 2941
2934 gtk_widget_show(menuitem); 2942 gtk_widget_show(menuitem);
2964 2972
2965 gtk_widget_show(menu); 2973 gtk_widget_show(menu);
2966 2974
2967 if (gtkconv->active_conv->type == GAIM_CONV_TYPE_IM) { 2975 if (gtkconv->active_conv->type == GAIM_CONV_TYPE_IM) {
2968 buds = gaim_find_buddies(gtkconv->active_conv->account, gtkconv->active_conv->name); 2976 buds = gaim_find_buddies(gtkconv->active_conv->account, gtkconv->active_conv->name);
2969 for (l = buds; l != NULL; l = l->next) { 2977
2970 GaimBuddy *b; 2978 if (buds == NULL)
2971 GaimBlistNode *node; 2979 {
2972 2980 /* The user isn't on the buddy list. */
2973 b = l->data; 2981 create_sendto_item(menu, sg, &group, NULL, gtkconv->active_conv->account, gtkconv->active_conv->name);
2974 node = (GaimBlistNode *) gaim_buddy_get_contact(b); 2982 }
2975 2983 else
2976 for (node = node->child; node != NULL; node = node->next) 2984 {
2977 if (GAIM_BLIST_NODE_IS_BUDDY(node) && gaim_account_is_connected(((GaimBuddy *)node)->account)) 2985 for (l = buds; l != NULL; l = l->next)
2978 create_sendto_item(menu, sg, &group, (GaimBuddy *) node); 2986 {
2979 } 2987 GaimBlistNode *node;
2980 2988
2981 g_slist_free(buds); 2989 node = (GaimBlistNode *) gaim_buddy_get_contact((GaimBuddy *)l->data);
2990
2991 for (node = node->child; node != NULL; node = node->next)
2992 {
2993 GaimBuddy *buddy = node;
2994 GaimAccount *account;
2995
2996 if (!GAIM_BLIST_NODE_IS_BUDDY(node))
2997 continue;
2998
2999 account = gaim_buddy_get_account(buddy);
3000 if (gaim_account_is_connected(account))
3001 create_sendto_item(menu, sg, &group, buddy, account, gaim_buddy_get_name(buddy));
3002 }
3003 }
3004
3005 g_slist_free(buds);
3006 }
2982 } 3007 }
2983 3008
2984 g_object_unref(sg); 3009 g_object_unref(sg);
2985 3010
2986 gtk_widget_show(win->menu.send_to); 3011 gtk_widget_show(win->menu.send_to);