diff options
author | Gary Kramlich <grim@reaperworld.com> | 2018-04-26 05:27:49 +0000 |
---|---|---|
committer | Gary Kramlich <grim@reaperworld.com> | 2018-04-26 05:27:49 +0000 |
commit | c8717ff143d5af609f70d43462817cf37e62fdfb (patch) | |
tree | 0665677b9d3488c37852d8768c940b5c97a56b9b | |
parent | a2e487cbfb43b68c8ca6b37cc71c6b8d8f80a12b (diff) | |
parent | b55bcb9fd4afc6ee4c5485532d07fd327675dc17 (diff) | |
download | pidgin-c8717ff143d5af609f70d43462817cf37e62fdfb.tar.gz |
Merged in dwmw2/pidgin/trac17295 (pull request #321)
Presence / name / photo support for non-buddy IM peers / chat room members (#17295)
Approved-by: Eion Robb <eionrobb@gmail.com>
Approved-by: Gary Kramlich <grim@reaperworld.com>
-rw-r--r-- | finch/gntblist.c | 3 | ||||
-rw-r--r-- | libpurple/blist.c | 9 | ||||
-rw-r--r-- | libpurple/blist.h | 4 | ||||
-rw-r--r-- | libpurple/conversation.c | 97 | ||||
-rw-r--r-- | libpurple/protocols/bonjour/bonjour.c | 3 | ||||
-rw-r--r-- | libpurple/protocols/gg/gg.c | 3 | ||||
-rw-r--r-- | libpurple/protocols/irc/irc.c | 3 | ||||
-rw-r--r-- | libpurple/protocols/jabber/libxmpp.c | 3 | ||||
-rw-r--r-- | libpurple/protocols/novell/novell.c | 3 | ||||
-rw-r--r-- | libpurple/protocols/null/nullprpl.c | 3 | ||||
-rw-r--r-- | libpurple/protocols/oscar/libaim.c | 3 | ||||
-rw-r--r-- | libpurple/protocols/oscar/libicq.c | 3 | ||||
-rw-r--r-- | libpurple/protocols/silc/silc.c | 3 | ||||
-rw-r--r-- | libpurple/protocols/silc10/silc.c | 3 | ||||
-rw-r--r-- | libpurple/protocols/simple/simple.c | 3 | ||||
-rw-r--r-- | libpurple/protocols/zephyr/zephyr.c | 3 | ||||
-rw-r--r-- | libpurple/prpl.h | 22 | ||||
-rw-r--r-- | pidgin/gtkblist.c | 7 | ||||
-rw-r--r-- | pidgin/gtkconv.c | 59 |
19 files changed, 177 insertions, 60 deletions
diff --git a/finch/gntblist.c b/finch/gntblist.c index 323e9e76d0..e9b0bd167f 100644 --- a/finch/gntblist.c +++ b/finch/gntblist.c @@ -167,6 +167,9 @@ static gboolean default_can_add_node(PurpleBlistNode *node) { gboolean offline = purple_prefs_get_bool(PREF_ROOT "/showoffline"); + if (!PURPLE_BLIST_NODE_IS_VISIBLE(node)) + return FALSE; + if (PURPLE_BLIST_NODE_IS_BUDDY(node)) { PurpleBuddy *buddy = (PurpleBuddy*)node; FinchBlistNode *fnode = FINCH_GET_DATA(node); diff --git a/libpurple/blist.c b/libpurple/blist.c index 2233835df6..3a7e36e5f6 100644 --- a/libpurple/blist.c +++ b/libpurple/blist.c @@ -2431,7 +2431,7 @@ const char *purple_chat_get_name(PurpleChat *chat) PurpleBuddy *purple_find_buddy(PurpleAccount *account, const char *name) { - PurpleBuddy *buddy; + PurpleBuddy *buddy, *fallback_buddy = NULL; struct _purple_hbuddy hb; PurpleBlistNode *group; @@ -2448,11 +2448,14 @@ PurpleBuddy *purple_find_buddy(PurpleAccount *account, const char *name) hb.group = group; if ((buddy = g_hash_table_lookup(purplebuddylist->buddies, &hb))) { - return buddy; + if (PURPLE_BLIST_NODE_IS_VISIBLE(buddy)) + return buddy; + /* Only return invisible buddies if there are no visible ones */ + fallback_buddy = buddy; } } - return NULL; + return fallback_buddy; } PurpleBuddy *purple_find_buddy_in_group(PurpleAccount *account, const char *name, diff --git a/libpurple/blist.h b/libpurple/blist.h index d3cae7a708..9db9fb371a 100644 --- a/libpurple/blist.h +++ b/libpurple/blist.h @@ -71,7 +71,8 @@ typedef enum typedef enum { - PURPLE_BLIST_NODE_FLAG_NO_SAVE = 1 << 0 /**< node should not be saved with the buddy list */ + PURPLE_BLIST_NODE_FLAG_NO_SAVE = 1 << 0, /**< node should not be saved with the buddy list */ + PURPLE_BLIST_NODE_FLAG_INVISIBLE = 1 << 1, /**< node should not be displayed */ } PurpleBlistNodeFlags; @@ -82,6 +83,7 @@ typedef enum #define PURPLE_BLIST_NODE_HAS_FLAG(b, f) (purple_blist_node_get_flags((PurpleBlistNode*)(b)) & (f)) #define PURPLE_BLIST_NODE_SHOULD_SAVE(b) (! PURPLE_BLIST_NODE_HAS_FLAG(b, PURPLE_BLIST_NODE_FLAG_NO_SAVE)) +#define PURPLE_BLIST_NODE_IS_VISIBLE(b) (! PURPLE_BLIST_NODE_HAS_FLAG(b, PURPLE_BLIST_NODE_FLAG_INVISIBLE)) #define PURPLE_BLIST_NODE_NAME(n) (purple_blist_node_get_type(n) == PURPLE_BLIST_CHAT_NODE ? purple_chat_get_name((PurpleChat*)n) : \ purple_blist_node_get_type(n) == PURPLE_BLIST_BUDDY_NODE ? purple_buddy_get_name((PurpleBuddy*)n) : NULL) diff --git a/libpurple/conversation.c b/libpurple/conversation.c index 9c7705c446..26c60f690f 100644 --- a/libpurple/conversation.c +++ b/libpurple/conversation.c @@ -327,6 +327,55 @@ purple_conversation_chat_cleanup_for_rejoin(PurpleConversation *conv) purple_conversation_update(conv, PURPLE_CONV_UPDATE_CHATLEFT); } +/* Meaningful name in case a UI doesn't actually honour the INVISIBLE flag */ +#define TRANSIENT_GROUP_NAME _("(internal) Temporary IM peers") + +static void +purple_conversation_ensure_buddy(PurpleAccount *account, PurpleConnection *gc, + const char *name) +{ + PurplePluginProtocolInfo *prpl_info; + PurpleBuddy *buddy; + PurpleGroup *group; + + prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(purple_connection_get_prpl(gc)); + + if ((prpl_info->options & OPT_PROTO_TRANSIENT_BUDDIES) && + !purple_find_buddy(account, name)) { + group = purple_find_group(TRANSIENT_GROUP_NAME); + if (!group) { + group = purple_group_new(TRANSIENT_GROUP_NAME); + purple_blist_node_set_flags(PURPLE_BLIST_NODE(group), + PURPLE_BLIST_NODE_FLAG_NO_SAVE | PURPLE_BLIST_NODE_FLAG_INVISIBLE); + purple_blist_add_group(group, NULL); + } + buddy = purple_buddy_new(account, name, NULL); + purple_blist_node_set_flags(PURPLE_BLIST_NODE(buddy), + PURPLE_BLIST_NODE_FLAG_NO_SAVE | PURPLE_BLIST_NODE_FLAG_INVISIBLE); + + purple_blist_add_buddy(buddy, NULL, group, NULL); + purple_account_add_buddy(account, buddy); + } +} + +static void +purple_conversation_release_buddy(PurpleAccount *account, const char *name) +{ + PurpleBuddy *buddy; + PurpleGroup *group; + + group = purple_find_group(TRANSIENT_GROUP_NAME); + if (!group) + return; + + buddy = purple_find_buddy_in_group(account, name, group); + if (!buddy) + return; + + purple_account_remove_buddy(account, buddy, group); + purple_blist_remove_buddy(buddy); +} + PurpleConversation * purple_conversation_new(PurpleConversationType type, PurpleAccount *account, const char *name) @@ -403,6 +452,8 @@ purple_conversation_new(PurpleConversationType type, PurpleAccount *account, purple_conversation_set_logging(conv, TRUE); open_log(conv); } + + purple_conversation_ensure_buddy(account, gc, name); } else if (type == PURPLE_CONV_TYPE_CHAT) { @@ -484,6 +535,8 @@ purple_conversation_destroy(PurpleConversation *conv) if (gc && prpl_info->convo_closed != NULL) prpl_info->convo_closed(gc, name); + + purple_conversation_release_buddy(conv->account, conv->name); } else if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_CHAT) { @@ -933,6 +986,7 @@ purple_conversation_write(PurpleConversation *conv, const char *who, PurpleConnection *gc = NULL; PurpleAccount *account; PurpleConversationUiOps *ops; + char *server_alias = NULL; const char *alias; char *displayed = NULL; PurpleBuddy *b; @@ -1006,6 +1060,13 @@ purple_conversation_write(PurpleConversation *conv, const char *who, alias = purple_buddy_get_contact_alias(b); } } + if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_CHAT && + alias == who && PURPLE_PROTOCOL_PLUGIN_HAS_FUNC(prpl_info, get_cb_alias)) { + int id = purple_conv_chat_get_id(PURPLE_CONV_CHAT(conv)); + server_alias = prpl_info->get_cb_alias(gc, id, who); + if (server_alias) + alias = server_alias; + } } if (!(flags & PURPLE_MESSAGE_NO_LOG) && purple_conversation_is_logging(conv)) { @@ -1031,6 +1092,7 @@ purple_conversation_write(PurpleConversation *conv, const char *who, account, who, displayed, conv, flags); g_free(displayed); + g_free(server_alias); } gboolean @@ -1678,6 +1740,7 @@ purple_conv_chat_add_users(PurpleConvChat *chat, GList *users, GList *extra_msgs while ((ul != NULL) && (fl != NULL)) { const char *user = (const char *)ul->data; const char *alias = user; + char *server_alias = NULL; gboolean quiet; PurpleConvChatBuddyFlags flag = GPOINTER_TO_INT(fl->data); const char *extra_msg = (extra_msgs ? extra_msgs->data : NULL); @@ -1699,6 +1762,12 @@ purple_conv_chat_add_users(PurpleConvChat *chat, GList *users, GList *extra_msgs alias = purple_buddy_get_contact_alias(buddy); } } + if (alias == user && PURPLE_PROTOCOL_PLUGIN_HAS_FUNC(prpl_info, get_cb_alias)) { + int id = purple_conv_chat_get_id(PURPLE_CONV_CHAT(conv)); + server_alias = prpl_info->get_cb_alias(gc, id, user); + if (server_alias) + alias = server_alias; + } quiet = GPOINTER_TO_INT(purple_signal_emit_return_1(purple_conversations_get_handle(), "chat-buddy-joining", conv, user, flag)) || @@ -1738,6 +1807,8 @@ purple_conv_chat_add_users(PurpleConvChat *chat, GList *users, GList *extra_msgs fl = fl->next; if (extra_msgs != NULL) extra_msgs = extra_msgs->next; + + g_free(server_alias); } cbuddies = g_list_sort(cbuddies, (GCompareFunc)purple_conv_chat_cb_compare); @@ -1759,6 +1830,7 @@ purple_conv_chat_rename_user(PurpleConvChat *chat, const char *old_user, PurpleConvChatBuddy *cb; PurpleConvChatBuddyFlags flags; const char *new_alias = new_user; + char *server_alias = NULL; char tmp[BUF_LONG]; gboolean is_me = FALSE; @@ -1791,10 +1863,18 @@ purple_conv_chat_rename_user(PurpleConvChat *chat, const char *old_user, alias = display_name; } } - } else if (!(prpl_info->options & OPT_PROTO_UNIQUE_CHATNAME)) { - PurpleBuddy *buddy; - if ((buddy = purple_find_buddy(gc->account, new_user)) != NULL) - new_alias = purple_buddy_get_contact_alias(buddy); + } else { + if (!(prpl_info->options & OPT_PROTO_UNIQUE_CHATNAME)) { + PurpleBuddy *buddy; + if ((buddy = purple_find_buddy(gc->account, new_user)) != NULL) + new_alias = purple_buddy_get_contact_alias(buddy); + } + if (new_alias == new_user && PURPLE_PROTOCOL_PLUGIN_HAS_FUNC(prpl_info, get_cb_alias)) { + int id = purple_conv_chat_get_id(PURPLE_CONV_CHAT(conv)); + server_alias = prpl_info->get_cb_alias(gc, id, new_user); + if (server_alias) + new_alias = server_alias; + } } flags = purple_conv_chat_user_get_flags(chat, old_user); @@ -1860,6 +1940,7 @@ purple_conv_chat_rename_user(PurpleConvChat *chat, const char *old_user, PURPLE_MESSAGE_SYSTEM | PURPLE_MESSAGE_NO_LINKIFY, time(NULL)); } + g_free(server_alias); } void @@ -1913,6 +1994,7 @@ purple_conv_chat_remove_users(PurpleConvChat *chat, GList *users, const char *re if (!quiet) { const char *alias = user; + char *server_alias = NULL; char *alias_esc; char *tmp; @@ -1922,6 +2004,12 @@ purple_conv_chat_remove_users(PurpleConvChat *chat, GList *users, const char *re if ((buddy = purple_find_buddy(gc->account, user)) != NULL) alias = purple_buddy_get_contact_alias(buddy); } + if (alias == user && PURPLE_PROTOCOL_PLUGIN_HAS_FUNC(prpl_info, get_cb_alias)) { + int id = purple_conv_chat_get_id(PURPLE_CONV_CHAT(conv)); + server_alias = prpl_info->get_cb_alias(gc, id, user); + if (server_alias) + alias = server_alias; + } alias_esc = g_markup_escape_text(alias, -1); @@ -1934,6 +2022,7 @@ purple_conv_chat_remove_users(PurpleConvChat *chat, GList *users, const char *re g_free(reason_esc); } g_free(alias_esc); + g_free(server_alias); purple_conversation_write(conv, NULL, tmp, PURPLE_MESSAGE_SYSTEM | PURPLE_MESSAGE_NO_LINKIFY, diff --git a/libpurple/protocols/bonjour/bonjour.c b/libpurple/protocols/bonjour/bonjour.c index ec0eb1d23a..6b59a6af0d 100644 --- a/libpurple/protocols/bonjour/bonjour.c +++ b/libpurple/protocols/bonjour/bonjour.c @@ -536,7 +536,8 @@ static PurplePluginProtocolInfo prpl_info = NULL, /* set_public_alias */ NULL, /* get_public_alias */ NULL, /* add_buddy_with_invite */ - NULL /* add_buddies_with_invite */ + NULL, /* add_buddies_with_invite */ + NULL /* get_cb_alias */ }; static PurplePluginInfo info = diff --git a/libpurple/protocols/gg/gg.c b/libpurple/protocols/gg/gg.c index b1e153eb16..e45eb97b48 100644 --- a/libpurple/protocols/gg/gg.c +++ b/libpurple/protocols/gg/gg.c @@ -2327,7 +2327,8 @@ static PurplePluginProtocolInfo prpl_info = NULL, /* set_public_alias */ NULL, /* get_public_alias */ NULL, /* add_buddy_with_invite */ - NULL /* add_buddies_with_invite */ + NULL, /* add_buddies_with_invite */ + NULL, /* get_cb_alias */ }; static PurplePluginInfo info = { diff --git a/libpurple/protocols/irc/irc.c b/libpurple/protocols/irc/irc.c index b93be2e0d1..a7cbbd8555 100644 --- a/libpurple/protocols/irc/irc.c +++ b/libpurple/protocols/irc/irc.c @@ -1008,7 +1008,8 @@ static PurplePluginProtocolInfo prpl_info = NULL, /* set_public_alias */ NULL, /* get_public_alias */ NULL, /* add_buddy_with_invite */ - NULL /* add_buddies_with_invite */ + NULL, /* add_buddies_with_invite */ + NULL, /* get_cb_alias */ }; static gboolean load_plugin (PurplePlugin *plugin) { diff --git a/libpurple/protocols/jabber/libxmpp.c b/libpurple/protocols/jabber/libxmpp.c index 0b696ff94d..220cdd6b65 100644 --- a/libpurple/protocols/jabber/libxmpp.c +++ b/libpurple/protocols/jabber/libxmpp.c @@ -131,7 +131,8 @@ static PurplePluginProtocolInfo prpl_info = NULL, /* set_public_alias */ NULL, /* get_public_alias */ NULL, /* add_buddy_with_invite */ - NULL /* add_buddies_with_invite */ + NULL, /* add_buddies_with_invite */ + NULL /* get_cb_alias */ }; static gboolean load_plugin(PurplePlugin *plugin) diff --git a/libpurple/protocols/novell/novell.c b/libpurple/protocols/novell/novell.c index d1f3279b13..3ece96ca2d 100644 --- a/libpurple/protocols/novell/novell.c +++ b/libpurple/protocols/novell/novell.c @@ -3525,7 +3525,8 @@ static PurplePluginProtocolInfo prpl_info = { NULL, /* set_public_alias */ NULL, /* get_public_alias */ NULL, /* add_buddy_with_invite */ - NULL /* add_buddies_with_invite */ + NULL, /* add_buddies_with_invite */ + NULL, /* get_cb_alias */ }; static PurplePluginInfo info = { diff --git a/libpurple/protocols/null/nullprpl.c b/libpurple/protocols/null/nullprpl.c index e2d8662f80..aa41738a59 100644 --- a/libpurple/protocols/null/nullprpl.c +++ b/libpurple/protocols/null/nullprpl.c @@ -1123,7 +1123,8 @@ static PurplePluginProtocolInfo prpl_info = NULL, /* set_public_alias */ NULL, /* get_public_alias */ NULL, /* add_buddy_with_invite */ - NULL /* add_buddies_with_invite */ + NULL, /* add_buddies_with_invite */ + NULL /* get_cb_alias */ }; static void nullprpl_init(PurplePlugin *plugin) diff --git a/libpurple/protocols/oscar/libaim.c b/libpurple/protocols/oscar/libaim.c index 0a169e9534..4e68220403 100644 --- a/libpurple/protocols/oscar/libaim.c +++ b/libpurple/protocols/oscar/libaim.c @@ -102,7 +102,8 @@ static PurplePluginProtocolInfo prpl_info = NULL, /* set_public_alias */ NULL, /* get_public_alias */ oscar_add_buddy, /* add_buddy_with_invite */ - NULL /* add_buddies_with_invite */ + NULL, /* add_buddies_with_invite */ + NULL, /* get_cb_alias */ }; static PurplePluginInfo info = diff --git a/libpurple/protocols/oscar/libicq.c b/libpurple/protocols/oscar/libicq.c index 18f5451e59..a35f846377 100644 --- a/libpurple/protocols/oscar/libicq.c +++ b/libpurple/protocols/oscar/libicq.c @@ -112,7 +112,8 @@ static PurplePluginProtocolInfo prpl_info = NULL, /* set_public_alias */ NULL, /* get_public_alias */ oscar_add_buddy, /* add_buddy_with_invite */ - NULL /* add_buddies_with_invite */ + NULL, /* add_buddies_with_invite */ + NULL, /* get_cb_alias */ }; static PurplePluginInfo info = diff --git a/libpurple/protocols/silc/silc.c b/libpurple/protocols/silc/silc.c index bbd892a67a..1d95869f05 100644 --- a/libpurple/protocols/silc/silc.c +++ b/libpurple/protocols/silc/silc.c @@ -2124,7 +2124,8 @@ static PurplePluginProtocolInfo prpl_info = NULL, /* set_public_alias */ NULL, /* get_public_alias */ NULL, /* add_buddy_with_invite */ - NULL /* add_buddies_with_invite */ + NULL, /* add_buddies_with_invite */ + NULL, /* get_cb_alias */ }; static PurplePluginInfo info = diff --git a/libpurple/protocols/silc10/silc.c b/libpurple/protocols/silc10/silc.c index 43e7589a37..53d48b5d11 100644 --- a/libpurple/protocols/silc10/silc.c +++ b/libpurple/protocols/silc10/silc.c @@ -1847,7 +1847,8 @@ static PurplePluginProtocolInfo prpl_info = NULL, /* set_public_alias */ NULL, /* get_public_alias */ NULL, /* add_buddy_with_invite */ - NULL /* add_buddies_with_invite */ + NULL, /* add_buddies_with_invite */ + NULL /* get_cb_alias */ }; static PurplePluginInfo info = diff --git a/libpurple/protocols/simple/simple.c b/libpurple/protocols/simple/simple.c index 2ee164656e..6909013615 100644 --- a/libpurple/protocols/simple/simple.c +++ b/libpurple/protocols/simple/simple.c @@ -2119,7 +2119,8 @@ static PurplePluginProtocolInfo prpl_info = NULL, /* set_public_alias */ NULL, /* get_public_alias */ NULL, /* add_buddy_with_invite */ - NULL /* add_buddies_with_invite */ + NULL, /* add_buddies_with_invite */ + NULL, /* get_cb_alias */ }; diff --git a/libpurple/protocols/zephyr/zephyr.c b/libpurple/protocols/zephyr/zephyr.c index e8f4f1c5c5..fa932283eb 100644 --- a/libpurple/protocols/zephyr/zephyr.c +++ b/libpurple/protocols/zephyr/zephyr.c @@ -2926,7 +2926,8 @@ static PurplePluginProtocolInfo prpl_info = { NULL, /* set_public_alias */ NULL, /* get_public_alias */ NULL, /* add_buddy_with_invite */ - NULL /* add_buddies_with_invite */ + NULL, /* add_buddies_with_invite */ + NULL, /* get_cb_alias */ }; static PurplePluginInfo info = { diff --git a/libpurple/prpl.h b/libpurple/prpl.h index 98d0d61a7b..c7af634173 100644 --- a/libpurple/prpl.h +++ b/libpurple/prpl.h @@ -209,7 +209,14 @@ typedef enum * along with an invitation. * @since 2.8.0 */ - OPT_PROTO_INVITE_MESSAGE = 0x00000800 + OPT_PROTO_INVITE_MESSAGE = 0x00000800, + + /** + * Indicates that this protocol supports creating invisible buddies for + * reporting presence/alias of IM peers. + * @since 2.14.0 + */ + OPT_PROTO_TRANSIENT_BUDDIES = 0x00001000, } PurpleProtocolOptions; @@ -646,6 +653,19 @@ struct _PurplePluginProtocolInfo */ void (*add_buddy_with_invite)(PurpleConnection *pc, PurpleBuddy *buddy, PurpleGroup *group, const char *message); void (*add_buddies_with_invite)(PurpleConnection *pc, GList *buddies, GList *groups, const char *message); + + /** + * Get the display alias of a participant in a chat. + * + * @param gc the connection on which the room is. + * @param id the ID of the chat room. + * @param who the nickname of the chat participant. + * @return the display alias of the participant. This string must be + * freed by the caller. + * + * @since 2.14.0 + */ + char *(*get_cb_alias)(PurpleConnection *gc, int id, const char *who); }; #define PURPLE_PROTOCOL_PLUGIN_HAS_FUNC(prpl, member) \ diff --git a/pidgin/gtkblist.c b/pidgin/gtkblist.c index f200eb4fd5..71361f7082 100644 --- a/pidgin/gtkblist.c +++ b/pidgin/gtkblist.c @@ -3202,7 +3202,7 @@ static gboolean buddy_is_displayable(PurpleBuddy *buddy) { struct _pidgin_blist_node *gtknode; - if(!buddy) + if(!buddy || !PURPLE_BLIST_NODE_IS_VISIBLE(buddy)) return FALSE; gtknode = ((PurpleBlistNode*)buddy)->ui_data; @@ -6386,14 +6386,15 @@ static void pidgin_blist_update_group(PurpleBuddyList *list, else count = purple_blist_get_group_online_count(group); - if (count > 0 || purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/blist/show_empty_groups")) + if (!PURPLE_BLIST_NODE_IS_VISIBLE(gnode) || !PURPLE_BLIST_NODE_IS_VISIBLE(node)) + show = FALSE; + else if (count > 0 || purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/blist/show_empty_groups")) show = TRUE; else if (PURPLE_BLIST_NODE_IS_BUDDY(node) && buddy_is_displayable((PurpleBuddy*)node)) { /* Or chat? */ show = TRUE; } else if (!show_offline) { show = pidgin_blist_group_has_show_offline_buddy(group); } - if (show) { gchar *title; gboolean biglist; diff --git a/pidgin/gtkconv.c b/pidgin/gtkconv.c index 5c3e2d5505..6b0553656c 100644 --- a/pidgin/gtkconv.c +++ b/pidgin/gtkconv.c @@ -632,7 +632,7 @@ add_remove_cb(GtkWidget *widget, PidginConversation *gtkconv) PurpleBuddy *b; b = purple_find_buddy(account, name); - if (b != NULL) + if (b != NULL && PURPLE_BLIST_NODE_IS_VISIBLE(b)) pidgin_dialogs_remove_buddy(b); else if (account != NULL && purple_account_is_connected(account)) purple_blist_request_add_buddy(account, (char *)name, NULL, NULL); @@ -1686,7 +1686,8 @@ create_chat_menu(PurpleConversation *conv, const char *who, PurpleConnection *gc } if (!is_me && prpl_info && !(prpl_info->options & OPT_PROTO_UNIQUE_CHATNAME) && (prpl_info->add_buddy != NULL)) { - if ((buddy = purple_find_buddy(conv->account, who)) != NULL) + if ((buddy = purple_find_buddy(conv->account, who)) != NULL && + PURPLE_BLIST_NODE_IS_VISIBLE(buddy)) button = pidgin_new_item_from_stock(menu, _("Remove"), GTK_STOCK_REMOVE, G_CALLBACK(menu_chat_add_remove_cb), PIDGIN_CONVERSATION(conv), 0, 0, NULL); else @@ -2331,7 +2332,6 @@ pidgin_conv_switch_active_conversation(PurpleConversation *conv) gray_stuff_out(gtkconv); update_typing_icon(gtkconv); - g_object_set_data(G_OBJECT(entry), "transient_buddy", NULL); regenerate_options_items(gtkconv->win); gtk_window_set_title(GTK_WINDOW(gtkconv->win->window), @@ -3222,22 +3222,6 @@ populate_menu_with_options(GtkWidget *menu, PidginConversation *gtkconv, gboolea return FALSE; buddy = purple_find_buddy(conv->account, conv->name); - - /* gotta remain bug-compatible :( libpurple < 2.0.2 didn't handle - * removing "isolated" buddy nodes well */ - if (purple_version_check(2, 0, 2) == NULL) { - if ((buddy == NULL) && (gtkconv->imhtml != NULL)) { - buddy = g_object_get_data(G_OBJECT(gtkconv->imhtml), "transient_buddy"); - } - - if ((buddy == NULL) && (gtkconv->imhtml != NULL)) { - buddy = purple_buddy_new(conv->account, conv->name, NULL); - purple_blist_node_set_flags((PurpleBlistNode *)buddy, - PURPLE_BLIST_NODE_FLAG_NO_SAVE); - g_object_set_data_full(G_OBJECT(gtkconv->imhtml), "transient_buddy", - buddy, (GDestroyNotify)purple_buddy_destroy); - } - } } if (chat) @@ -4418,13 +4402,16 @@ update_chat_alias(PurpleBuddy *buddy, PurpleConversation *conv, PurpleConnection const char *alias = name; char *tmp; char *alias_key = NULL; - PurpleBuddy *buddy2; if (!purple_strequal(chat->nick, purple_normalize(conv->account, name))) { /* This user is not me, so look into updating the alias. */ - - if ((buddy2 = purple_find_buddy(conv->account, name)) != NULL) { - alias = purple_buddy_get_contact_alias(buddy2); + GList *users = purple_conv_chat_get_users(PURPLE_CONV_CHAT(conv)); + for (; users; users = users->next) { + PurpleConvChatBuddy *cb = users->data; + if (purple_strequal(name, cb->name)) { + alias = cb->alias; + break; + } } tmp = g_utf8_casefold(alias, -1); @@ -4542,7 +4529,7 @@ buddy_cb_common(PurpleBuddy *buddy, PurpleConversation *conv, gboolean is_buddy) static void buddy_added_cb(PurpleBlistNode *node, PurpleConversation *conv) { - if (!PURPLE_BLIST_NODE_IS_BUDDY(node)) + if (!PURPLE_BLIST_NODE_IS_BUDDY(node) || !PURPLE_BLIST_NODE_IS_VISIBLE(node)) return; buddy_cb_common(PURPLE_BUDDY(node), conv, TRUE); @@ -4551,12 +4538,15 @@ buddy_added_cb(PurpleBlistNode *node, PurpleConversation *conv) static void buddy_removed_cb(PurpleBlistNode *node, PurpleConversation *conv) { + PurpleBuddy *buddy; + if (!PURPLE_BLIST_NODE_IS_BUDDY(node)) return; - /* If there's another buddy for the same "dude" on the list, do nothing. */ - if (purple_find_buddy(purple_buddy_get_account(PURPLE_BUDDY(node)), - purple_buddy_get_name(PURPLE_BUDDY(node))) != NULL) + /* If there's another real buddy for the same "dude" on the list, do nothing. */ + buddy = purple_find_buddy(purple_buddy_get_account(PURPLE_BUDDY(node)), + purple_buddy_get_name(PURPLE_BUDDY(node))); + if (buddy && PURPLE_BLIST_NODE_IS_VISIBLE(buddy)) return; buddy_cb_common(PURPLE_BUDDY(node), conv, FALSE); @@ -4839,11 +4829,6 @@ pidgin_conv_create_tooltip(GtkWidget *tipwindow, gpointer userdata, int *w, int node = g_object_get_data(G_OBJECT(gtkconv->imhtml), "transient_chat"); } else { node = (PurpleBlistNode*)(purple_find_buddy(conv->account, conv->name)); -#if 0 - /* Using the transient blist nodes to show the tooltip doesn't quite work yet. */ - if (!node) - node = g_object_get_data(G_OBJECT(gtkconv->imhtml), "transient_buddy"); -#endif } if (node) @@ -6544,6 +6529,7 @@ gray_stuff_out(PidginConversation *gtkconv) * is sensitive or not. */ if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM) { + PurpleBuddy *buddy; /* Show stuff that applies to IMs, hide stuff that applies to chats */ /* Deal with menu items */ @@ -6562,12 +6548,13 @@ gray_stuff_out(PidginConversation *gtkconv) gtk_widget_show(win->menu.unblock); } - if (purple_find_buddy(account, purple_conversation_get_name(conv)) == NULL) { - gtk_widget_show(win->menu.add); - gtk_widget_hide(win->menu.remove); - } else { + buddy = purple_find_buddy(account, purple_conversation_get_name(conv)); + if (buddy && PURPLE_BLIST_NODE_IS_VISIBLE(buddy)) { gtk_widget_show(win->menu.remove); gtk_widget_hide(win->menu.add); + } else { + gtk_widget_show(win->menu.add); + gtk_widget_hide(win->menu.remove); } gtk_widget_show(win->menu.insert_link); |