summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGary Kramlich <grim@reaperworld.com>2018-04-26 05:27:49 +0000
committerGary Kramlich <grim@reaperworld.com>2018-04-26 05:27:49 +0000
commitc8717ff143d5af609f70d43462817cf37e62fdfb (patch)
tree0665677b9d3488c37852d8768c940b5c97a56b9b
parenta2e487cbfb43b68c8ca6b37cc71c6b8d8f80a12b (diff)
parentb55bcb9fd4afc6ee4c5485532d07fd327675dc17 (diff)
downloadpidgin-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.c3
-rw-r--r--libpurple/blist.c9
-rw-r--r--libpurple/blist.h4
-rw-r--r--libpurple/conversation.c97
-rw-r--r--libpurple/protocols/bonjour/bonjour.c3
-rw-r--r--libpurple/protocols/gg/gg.c3
-rw-r--r--libpurple/protocols/irc/irc.c3
-rw-r--r--libpurple/protocols/jabber/libxmpp.c3
-rw-r--r--libpurple/protocols/novell/novell.c3
-rw-r--r--libpurple/protocols/null/nullprpl.c3
-rw-r--r--libpurple/protocols/oscar/libaim.c3
-rw-r--r--libpurple/protocols/oscar/libicq.c3
-rw-r--r--libpurple/protocols/silc/silc.c3
-rw-r--r--libpurple/protocols/silc10/silc.c3
-rw-r--r--libpurple/protocols/simple/simple.c3
-rw-r--r--libpurple/protocols/zephyr/zephyr.c3
-rw-r--r--libpurple/prpl.h22
-rw-r--r--pidgin/gtkblist.c7
-rw-r--r--pidgin/gtkconv.c59
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);