# HG changeset patch # User Richard Laager # Date 1130248574 0 # Node ID 821f40e1912f58e9b2c949cd7a7254bc6cea06c1 # Parent fa17fc619f17e37ccfd9d0ea1077508566acdd2a [gaim-migrate @ 14106] SF Patch #1336924 from sadrul 'From the wiki: "If you have a tab open for a given contact, and then drag an additional buddy into that contact, the send to menu does not update." This patch updates all the focused-conversations in every window (note that not all conversation in every tab). This wouldn't be necessary if it was possible to tell which contact a buddy was removed from. But that info is not available, so this is the way I can think of. It works, and will probably not cause too much overhead for most users -- assuming most of them use tabbed convs and hence number of windows won't be too great.' To track which contact was updated would be problematic, I think. This doesn't seem like too much overhead to me and it keeps the code clean. committer: Tailor Script diff -r fa17fc619f17 -r 821f40e1912f src/gtkconv.c --- a/src/gtkconv.c Tue Oct 25 13:29:28 2005 +0000 +++ b/src/gtkconv.c Tue Oct 25 13:56:14 2005 +0000 @@ -3800,6 +3800,26 @@ return NULL; } +static void +buddy_update_cb(GaimBlistNode *bnode) +{ + GList *list; + + g_return_if_fail(bnode); + g_return_if_fail(GAIM_BLIST_NODE_IS_BUDDY(bnode)); + + for (list = gaim_gtk_conv_windows_get_list(); list; list = list->next) + { + GaimGtkWindow *win = list->data; + GaimConversation *conv = gaim_gtk_conv_window_get_active_conversation(win); + + if (gaim_conversation_get_type(conv) != GAIM_CONV_TYPE_IM) + continue; + + gaim_conversation_update(conv, GAIM_CONV_ACCOUNT_ONLINE); + } +} + /************************************************************************** * Conversation UI operations **************************************************************************/ @@ -3897,6 +3917,14 @@ G_CALLBACK(gtk_widget_grab_focus), gtkconv->entry); + if (conv_type == GAIM_CONV_TYPE_IM) + { + gaim_signal_connect(gaim_blist_get_handle(), "buddy-added", gtkconv, + G_CALLBACK(buddy_update_cb), conv); + gaim_signal_connect(gaim_blist_get_handle(), "buddy-removed", gtkconv, + G_CALLBACK(buddy_update_cb), conv); + } + gaim_gtkconv_placement_place(gtkconv); }