# HG changeset patch # User Christian Hammond # Date 1060808909 0 # Node ID ccfdf9f2cdd11574a2718d82a7ccf70bccd90654 # Parent cd0b5eaf946031bb84ecbdfd15b2e77c6dc33a08 [gaim-migrate @ 6965] Conversation placement by group now applies to chats in the buddy list as well. Also added functions for finding a chat by name, and getting its parent group. committer: Tailor Script diff -r cd0b5eaf9460 -r ccfdf9f2cdd1 ChangeLog --- a/ChangeLog Wed Aug 13 20:13:06 2003 +0000 +++ b/ChangeLog Wed Aug 13 21:08:29 2003 +0000 @@ -12,6 +12,8 @@ * Shows "hiptop" icon for AIM buddies using hiptop devices (Robey Pointer) * Privacy core/UI split. + * Conversation placement by group now applies to chats in the buddy + list as well. * Events in a conversation (user logged in, logged out, window closed, etc.) now grey the tab. * Various bug fixes (larne from irc, Tim Ringenbach, Bjoern diff -r cd0b5eaf9460 -r ccfdf9f2cdd1 src/blist.c --- a/src/blist.c Wed Aug 13 20:13:06 2003 +0000 +++ b/src/blist.c Wed Aug 13 21:08:29 2003 +0000 @@ -870,6 +870,57 @@ } return NULL; } + +struct chat * +gaim_blist_find_chat(GaimAccount *account, const char *name) +{ + char *chat_name; + struct chat *chat; + GaimPlugin *prpl; + GaimPluginProtocolInfo *prpl_info = NULL; + struct proto_chat_entry *pce; + GaimBlistNode *node, *group; + GList *parts; + + g_return_val_if_fail(gaim_get_blist() != NULL, NULL); + g_return_val_if_fail(name != NULL, NULL); + + for (group = gaimbuddylist->root; group != NULL; group = group->next) { + for (node = group->child; node != NULL; node = node->next) { + if (GAIM_BLIST_NODE_IS_CHAT(node)) { + + chat = (struct chat *)node; + + prpl = gaim_find_prpl(gaim_account_get_protocol(chat->account)); + prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(prpl); + + parts = prpl_info->chat_info( + gaim_account_get_connection(chat->account)); + + pce = parts->data; + chat_name = g_hash_table_lookup(chat->components, + pce->identifier); + + if (chat->account == account && + name != NULL && !strcmp(chat_name, name)) { + + return chat; + } + } + } + } + + return NULL; +} + +struct group * +gaim_blist_chat_get_group(struct chat *chat) +{ + g_return_val_if_fail(chat != NULL, NULL); + + return (struct group *)(((GaimBlistNode *)chat)->parent); +} + struct group *gaim_find_buddys_group(struct buddy *buddy) { if (!buddy) diff -r cd0b5eaf9460 -r ccfdf9f2cdd1 src/blist.h --- a/src/blist.h Wed Aug 13 20:13:06 2003 +0000 +++ b/src/blist.h Wed Aug 13 21:08:29 2003 +0000 @@ -433,6 +433,24 @@ struct group *gaim_find_group(const char *name); /** + * Finds a chat by name. + * + * @param name The chat's name. + * + * @return The chat, or @c NULL if the chat does not exist. + */ +struct chat *gaim_blist_find_chat(GaimAccount *account, const char *name); + +/** + * Returns the group of which the chat is a member. + * + * @param chat The chat. + * + * @return The parent group, or @c NULL if the chat is not in a group. + */ +struct group *gaim_blist_chat_get_group(struct chat *chat); + +/** * Returns the group of which the buddy is a member. * * @param buddy The buddy diff -r cd0b5eaf9460 -r ccfdf9f2cdd1 src/conversation.c --- a/src/conversation.c Wed Aug 13 20:13:06 2003 +0000 +++ b/src/conversation.c Wed Aug 13 21:08:29 2003 +0000 @@ -2220,15 +2220,7 @@ type = gaim_conversation_get_type(conv); - if (type != GAIM_CONV_IM) { - win = gaim_get_last_window_with_type(type); - - if (win == NULL) - conv_placement_new_window(conv); - else - gaim_window_add_conversation(win, conv); - } - else { + if (type == GAIM_CONV_IM) { struct buddy *b; struct group *grp = NULL; GList *wins, *convs; @@ -2271,6 +2263,58 @@ /* Make a new window. */ conv_placement_new_window(conv); } + else if (type == GAIM_CONV_CHAT) { + struct chat *chat; + struct group *group = NULL; + GList *wins, *convs; + + chat = gaim_blist_find_chat(gaim_conversation_get_account(conv), + gaim_conversation_get_name(conv)); + + if (chat != NULL) + group = gaim_blist_chat_get_group(chat); + + /* Go through the list of chats and find one with this group. */ + for (wins = gaim_get_windows(); wins != NULL; wins = wins->next) { + GaimWindow *win2; + GaimConversation *conv2; + struct chat *chat2; + struct group *group2 = NULL; + + win2 = (GaimWindow *)wins->data; + + for (convs = gaim_window_get_conversations(win2); + convs != NULL; + convs = convs->next) { + + conv2 = (GaimConversation *)convs->data; + + chat2 = gaim_blist_find_chat( + gaim_conversation_get_account(conv2), + gaim_conversation_get_name(conv2)); + + if (chat2 != NULL) + group2 = gaim_blist_chat_get_group(chat2); + + if (group == group2) { + gaim_window_add_conversation(win2, conv); + + return; + } + } + } + + /* Make a new window. */ + conv_placement_new_window(conv); + } + else { + win = gaim_get_last_window_with_type(type); + + if (win == NULL) + conv_placement_new_window(conv); + else + gaim_window_add_conversation(win, conv); + } } /* This groups things by account. Otherwise, the same semantics as above */ diff -r cd0b5eaf9460 -r ccfdf9f2cdd1 src/server.c --- a/src/server.c Wed Aug 13 20:13:06 2003 +0000 +++ b/src/server.c Wed Aug 13 21:08:29 2003 +0000 @@ -1192,13 +1192,12 @@ gaim_event_broadcast(event_got_typing, gc, name); - if (b != NULL) - if (state == GAIM_TYPING) - gaim_pounce_execute(gc->account, name, - GAIM_POUNCE_TYPING); - else - gaim_pounce_execute(gc->account, name, - GAIM_POUNCE_TYPING_STOPPED); + if (b != NULL) { + if (state == GAIM_TYPING) + gaim_pounce_execute(gc->account, name, GAIM_POUNCE_TYPING); + else + gaim_pounce_execute(gc->account, name, GAIM_POUNCE_TYPING_STOPPED); + } if (timeout > 0) gaim_im_start_typing_timeout(im, timeout);