Mercurial > pidgin
changeset 11594:8ee38f9428d5
[gaim-migrate @ 13864]
replace the Send As menu with a Send To menu, that functions off of contacts
committer: Tailor Script <tailor@pidgin.im>
author | Tim Ringenbach <marv@pidgin.im> |
---|---|
date | Mon, 03 Oct 2005 01:47:59 +0000 |
parents | 4b7fb30b8926 |
children | ecd49b9a48b7 |
files | src/gtkconv.c src/gtkconvwin.h |
diffstat | 2 files changed, 124 insertions(+), 222 deletions(-) [+] |
line wrap: on
line diff
--- a/src/gtkconv.c Sun Oct 02 23:40:59 2005 +0000 +++ b/src/gtkconv.c Mon Oct 03 01:47:59 2005 +0000 @@ -114,8 +114,8 @@ static GtkWidget *invite_dialog = NULL; static GtkWidget *warn_close_dialog = NULL; -static gboolean update_send_as_selection(GaimGtkWindow *win); -static void generate_send_as_items(GaimGtkWindow *win, GaimConversation *deleted_conv); +static gboolean update_send_to_selection(GaimGtkWindow *win); +static void generate_send_to_items(GaimGtkWindow *win); @@ -1898,19 +1898,19 @@ static void menu_conv_sel_send_cb(GObject *m, gpointer data) { - GaimGtkWindow *win = g_object_get_data(m, "user_data"); GaimAccount *account = g_object_get_data(m, "gaim_account"); + gchar *name = g_object_get_data(m, "gaim_buddy_name"); GaimConversation *conv; GaimGtkConversation *gtkconv; if (gtk_check_menu_item_get_active((GtkCheckMenuItem*) m) == FALSE) return; - conv = gaim_gtk_conv_window_get_active_conversation(win); - - gaim_conversation_set_account(conv, account); - + conv = gaim_conversation_new(GAIM_CONV_TYPE_IM, account, name); gtkconv = GAIM_GTK_CONVERSATION(conv); + + gtkconv->active_conv = conv; + gtk_imhtml_set_protocol_name(GTK_IMHTML(gtkconv->entry), gaim_account_get_protocol_name(conv->account)); } @@ -2473,7 +2473,6 @@ gtk_item_factory_get_widget(win->menu.item_factory, N_("/Options/Show Buddy Icon")); - generate_send_as_items(win, NULL); win->menu.tray = gaim_gtk_menu_tray_new(); gtk_menu_shell_append(GTK_MENU_SHELL(win->menu.menubar), @@ -2558,18 +2557,13 @@ } static gboolean -update_send_as_selection(GaimGtkWindow *win) +update_send_to_selection(GaimGtkWindow *win) { GaimAccount *account; GaimConversation *conv; GtkWidget *menu; GList *child; - - /* what does this do again? */ - /* - if (g_list_find(gaim_gtk_get_windows(), win) == NULL) - return FALSE; - */ + GaimBuddy *b; conv = gaim_gtk_conv_window_get_active_conversation(win); @@ -2578,23 +2572,30 @@ account = gaim_conversation_get_account(conv); - if (win->menu.send_as == NULL) + if (win->menu.send_to == NULL) return FALSE; - gtk_widget_show(win->menu.send_as); + if (!(b = gaim_find_buddy(account, conv->name))) + return FALSE; + + + gtk_widget_show(win->menu.send_to); menu = gtk_menu_item_get_submenu( - GTK_MENU_ITEM(win->menu.send_as)); + GTK_MENU_ITEM(win->menu.send_to)); for (child = gtk_container_get_children(GTK_CONTAINER(menu)); child != NULL; child = child->next) { GtkWidget *item = child->data; - GaimAccount *item_account = g_object_get_data(G_OBJECT(item), - "gaim_account"); - - if (account == item_account) { + GaimBuddy *item_buddy; + GaimAccount *item_account = g_object_get_data(G_OBJECT(item), "gaim_account"); + gchar *buddy_name = g_object_get_data(G_OBJECT(item), + "gaim_buddy_name"); + item_buddy = gaim_find_buddy(item_account, buddy_name); + + if (b == item_buddy) { gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item), TRUE); break; } @@ -2604,209 +2605,116 @@ } static void -generate_send_as_items(GaimGtkWindow *win, GaimConversation *deleted_conv) +create_sendto_item(GtkWidget *menu, GtkSizeGroup *sg, GSList **group, GaimBuddy *bud) +{ + GaimAccount *account; + GtkWidget *box; + GtkWidget *label; + GtkWidget *image; + GtkWidget *menuitem; + GdkPixbuf *pixbuf, *scale; + + + account = bud->account; + + /* Create a pixmap for the protocol icon. */ + pixbuf = gaim_gtk_create_prpl_icon(account); + scale = gdk_pixbuf_scale_simple(pixbuf, 16, 16, GDK_INTERP_BILINEAR); + + /* Now convert it to GtkImage */ + if (pixbuf == NULL) + image = gtk_image_new(); + else + image = gtk_image_new_from_pixbuf(scale); + + gtk_size_group_add_widget(sg, image); + + g_object_unref(G_OBJECT(scale)); + g_object_unref(G_OBJECT(pixbuf)); + + /* Make our menu item */ + menuitem = gtk_radio_menu_item_new_with_label(*group, + gaim_buddy_get_name(bud)); + *group = gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(menuitem)); + + /* Do some evil, see some evil, speak some evil. */ + box = gtk_hbox_new(FALSE, 0); + + label = gtk_bin_get_child(GTK_BIN(menuitem)); + g_object_ref(label); + gtk_container_remove(GTK_CONTAINER(menuitem), label); + + gtk_box_pack_start(GTK_BOX(box), image, FALSE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(box), label, TRUE, TRUE, 4); + + g_object_unref(label); + + gtk_container_add(GTK_CONTAINER(menuitem), box); + + gtk_widget_show(label); + gtk_widget_show(image); + gtk_widget_show(box); + + /* Set our data and callbacks. */ + g_object_set_data(G_OBJECT(menuitem), "gaim_account", account); + g_object_set_data_full(G_OBJECT(menuitem), "gaim_buddy_name", g_strdup(gaim_buddy_get_name(bud)), g_free); + + g_signal_connect(G_OBJECT(menuitem), "activate", + G_CALLBACK(menu_conv_sel_send_cb), NULL); + + gtk_widget_show(menuitem); + gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); +} + +static void +generate_send_to_items(GaimGtkWindow *win) { GtkWidget *menu; - GtkWidget *menuitem; - GList *gcs; - GList *convs; GSList *group = NULL; - gboolean first_offline = TRUE; - gboolean found_online = FALSE; GtkSizeGroup *sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); - - if (win->menu.send_as != NULL) - gtk_widget_destroy(win->menu.send_as); - - /* See if we have > 1 connection active. */ - if (g_list_length(gaim_connections_get_all()) < 2) { - /* Now make sure we don't have any Offline entries. */ - gboolean found_offline = FALSE; - - for (convs = gaim_get_conversations(); - convs != NULL; - convs = convs->next) { - - GaimConversation *conv; - GaimAccount *account; - - conv = (GaimConversation *)convs->data; - account = gaim_conversation_get_account(conv); - - if (account != NULL && account->gc == NULL) { - found_offline = TRUE; - break; - } - } - - if (!found_offline) { - win->menu.send_as = NULL; - return; - } - } + GaimGtkConversation *gtkconv; + GSList *l, *buds; + + g_return_if_fail(win != NULL); + + gtkconv = gaim_gtk_conv_window_get_active_gtkconv(win); + + if (win->menu.send_to != NULL) + gtk_widget_destroy(win->menu.send_to); + /* Build the Send As menu */ - win->menu.send_as = gtk_menu_item_new_with_mnemonic(_("_Send As")); - gtk_widget_show(win->menu.send_as); + win->menu.send_to = gtk_menu_item_new_with_mnemonic(_("_Send To")); + gtk_widget_show(win->menu.send_to); menu = gtk_menu_new(); gtk_menu_shell_insert(GTK_MENU_SHELL(win->menu.menubar), - win->menu.send_as, 2); - gtk_menu_item_set_submenu(GTK_MENU_ITEM(win->menu.send_as), menu); + win->menu.send_to, 2); + gtk_menu_item_set_submenu(GTK_MENU_ITEM(win->menu.send_to), menu); gtk_widget_show(menu); - /* Fill it with entries. */ - for (gcs = gaim_connections_get_all(); gcs != NULL; gcs = gcs->next) { - - GaimConnection *gc; - GaimAccount *account; - GtkWidget *box; - GtkWidget *label; - GtkWidget *image; - GdkPixbuf *pixbuf, *scale; - - found_online = TRUE; - - gc = (GaimConnection *)gcs->data; - - /* Create a pixmap for the protocol icon. */ - pixbuf = gaim_gtk_create_prpl_icon(gc->account); - scale = gdk_pixbuf_scale_simple(pixbuf, 16, 16, GDK_INTERP_BILINEAR); - - /* Now convert it to GtkImage */ - if (pixbuf == NULL) - image = gtk_image_new(); - else - image = gtk_image_new_from_pixbuf(scale); - - gtk_size_group_add_widget(sg, image); - - g_object_unref(G_OBJECT(scale)); - g_object_unref(G_OBJECT(pixbuf)); - - account = gaim_connection_get_account(gc); - - /* Make our menu item */ - menuitem = gtk_radio_menu_item_new_with_label(group, - gaim_account_get_username(account)); - group = gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(menuitem)); - - /* Do some evil, see some evil, speak some evil. */ - box = gtk_hbox_new(FALSE, 0); - - label = gtk_bin_get_child(GTK_BIN(menuitem)); - g_object_ref(label); - gtk_container_remove(GTK_CONTAINER(menuitem), label); - - gtk_box_pack_start(GTK_BOX(box), image, FALSE, FALSE, 0); - gtk_box_pack_start(GTK_BOX(box), label, TRUE, TRUE, 4); - - g_object_unref(label); - - gtk_container_add(GTK_CONTAINER(menuitem), box); - - gtk_widget_show(label); - gtk_widget_show(image); - gtk_widget_show(box); - - /* Set our data and callbacks. */ - g_object_set_data(G_OBJECT(menuitem), "user_data", win); - g_object_set_data(G_OBJECT(menuitem), "gaim_account", gc->account); - - g_signal_connect(G_OBJECT(menuitem), "activate", - G_CALLBACK(menu_conv_sel_send_cb), NULL); - - gtk_widget_show(menuitem); - gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); + buds = gaim_find_buddies(gtkconv->active_conv->account, gtkconv->active_conv->name); + for (l = buds; l != NULL; l = l->next) { + GaimBuddy *b; + GaimBlistNode *node; + + b = l->data; + node = (GaimBlistNode *) gaim_buddy_get_contact(b); + + for (node = node->child; node != NULL; node = node->next) + if (GAIM_BLIST_NODE_IS_BUDDY(node) && gaim_account_is_connected(((GaimBuddy *)node)->account)) + create_sendto_item(menu, sg, &group, (GaimBuddy *) node); } - /* - * Fill it with any accounts that still has an open (yet disabled) window - * (signed off accounts with a window open). - */ - for (convs = gaim_get_conversations(); - convs != NULL; - convs = convs->next) { - - GaimConversation *conv; - GaimAccount *account; - GtkWidget *box; - GtkWidget *label; - GtkWidget *image; - GdkPixbuf *pixbuf, *scale; - - conv = (GaimConversation *)convs->data; - - if (conv == deleted_conv) - continue; - - account = gaim_conversation_get_account(conv); - - if (account != NULL && account->gc == NULL) { - if (first_offline && found_online) { - menuitem = gtk_separator_menu_item_new(); - gtk_widget_show(menuitem); - gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); - - first_offline = FALSE; - } - - /* Create a pixmap for the protocol icon. */ - pixbuf = gaim_gtk_create_prpl_icon(account); - scale = gdk_pixbuf_scale_simple(pixbuf, 16, 16, - GDK_INTERP_BILINEAR); - - /* Now convert it to GtkImage */ - if (pixbuf == NULL) - image = gtk_image_new(); - else - image = gtk_image_new_from_pixbuf(scale); - - gtk_size_group_add_widget(sg, image); - - if (scale != NULL) g_object_unref(scale); - if (pixbuf != NULL) g_object_unref(pixbuf); - - /* Make our menu item */ - menuitem = gtk_radio_menu_item_new_with_label(group, - account->username); - group = gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(menuitem)); - - /* Do some evil, see some evil, speak some evil. */ - box = gtk_hbox_new(FALSE, 0); - - label = gtk_bin_get_child(GTK_BIN(menuitem)); - g_object_ref(label); - gtk_container_remove(GTK_CONTAINER(menuitem), label); - - gtk_box_pack_start(GTK_BOX(box), image, FALSE, FALSE, 0); - gtk_box_pack_start(GTK_BOX(box), label, TRUE, TRUE, 4); - - g_object_unref(label); - - gtk_container_add(GTK_CONTAINER(menuitem), box); - - gtk_widget_show(label); - gtk_widget_show(image); - gtk_widget_show(box); - - gtk_widget_set_sensitive(menuitem, FALSE); - g_object_set_data(G_OBJECT(menuitem), "user_data", win); - g_object_set_data(G_OBJECT(menuitem), "gaim_account", account); - - g_signal_connect(G_OBJECT(menuitem), "activate", - G_CALLBACK(menu_conv_sel_send_cb), NULL); - - gtk_widget_show(menuitem); - gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); - } - } + g_slist_free(buds); g_object_unref(sg); - gtk_widget_show(win->menu.send_as); - update_send_as_selection(win); + gtk_widget_show(win->menu.send_to); + if (!group) + gtk_widget_set_sensitive(win->menu.send_to, FALSE); + update_send_to_selection(win); } static GList * @@ -4750,8 +4658,8 @@ if (gc != NULL) prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl); - if (win->menu.send_as != NULL) - g_timeout_add(0, (GSourceFunc)update_send_as_selection, win); + if (win->menu.send_to != NULL) + g_timeout_add(0, (GSourceFunc)update_send_to_selection, win); /* * Handle hiding and showing stuff based on what type of conv this is. @@ -4940,7 +4848,7 @@ gaim_gtkconv_update_buttons_by_protocol(conv); - g_timeout_add(0, (GSourceFunc)update_send_as_selection, win); + g_timeout_add(0, (GSourceFunc)update_send_to_selection, win); gaim_gtkthemes_smiley_themeize(gtkconv->imhtml); @@ -5033,7 +4941,7 @@ type == GAIM_CONV_ACCOUNT_OFFLINE) { gray_stuff_out(GAIM_GTK_CONVERSATION(gaim_gtk_conv_window_get_active_conversation(win))); - generate_send_as_items(win, NULL); + generate_send_to_items(win); update_tab_icon(conv); gaim_conversation_autoset_title(conv); } @@ -6136,6 +6044,8 @@ /* Update the menubar */ gray_stuff_out(gtkconv); + generate_send_to_items(win); + update_typing_icon(gtkconv); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(win->menu.logging), @@ -6404,7 +6314,7 @@ gtk_widget_grab_focus(focus_gtkconv->entry); if (gaim_gtk_conv_window_get_gtkconv_count(win) == 1) - g_timeout_add(0, (GSourceFunc)update_send_as_selection, win); + g_timeout_add(0, (GSourceFunc)update_send_to_selection, win); } void @@ -6427,14 +6337,6 @@ gaim_prefs_get_bool("/gaim/gtk/conversations/tabs")); } - - /* If this window is setup with an inactive gc, regenerate the menu. */ - - if (conv_type == GAIM_CONV_TYPE_IM && - gaim_conversation_get_gc(gtkconv->active_conv) == NULL) { - generate_send_as_items(win, gtkconv->active_conv); - } - win->gtkconvs = g_list_remove(win->gtkconvs, gtkconv); if (!win->gtkconvs)