diff options
Diffstat (limited to 'libempathy-gtk')
-rw-r--r-- | libempathy-gtk/empathy-chat.c | 29 | ||||
-rw-r--r-- | libempathy-gtk/empathy-contact-list-store.c | 56 |
2 files changed, 85 insertions, 0 deletions
diff --git a/libempathy-gtk/empathy-chat.c b/libempathy-gtk/empathy-chat.c index 07bd35711..cc946b1e1 100644 --- a/libempathy-gtk/empathy-chat.c +++ b/libempathy-gtk/empathy-chat.c @@ -1791,6 +1791,8 @@ chat_members_changed_cb (EmpathyTpChat *tp_chat, gboolean is_member, EmpathyChat *chat) { + g_return_if_fail (TP_CHANNEL_GROUP_CHANGE_REASON_RENAMED != reason); + EmpathyChatPriv *priv = GET_PRIV (chat); const gchar *name = empathy_contact_get_name (contact); gchar *str; @@ -1809,6 +1811,30 @@ chat_members_changed_cb (EmpathyTpChat *tp_chat, g_free (str); } +static void +chat_member_renamed_cb (EmpathyTpChat *tp_chat, + EmpathyContact *old_contact, + EmpathyContact *new_contact, + guint reason, + gchar *message, + EmpathyChat *chat) +{ + g_return_if_fail (TP_CHANNEL_GROUP_CHANGE_REASON_RENAMED == reason); + + EmpathyChatPriv *priv = GET_PRIV (chat); + + if (priv->block_events_timeout_id == 0) { + gchar *str; + + str = g_strdup_printf (_("%s is now known as %s"), + empathy_contact_get_name (old_contact), + empathy_contact_get_name (new_contact)); + empathy_chat_view_append_event (chat->view, str); + g_free (str); + } + +} + static gboolean chat_reset_size_request (gpointer widget) { @@ -2536,6 +2562,9 @@ empathy_chat_set_tp_chat (EmpathyChat *chat, g_signal_connect (tp_chat, "members-changed", G_CALLBACK (chat_members_changed_cb), chat); + g_signal_connect (tp_chat, "member-renamed", + G_CALLBACK (chat_member_renamed_cb), + chat); g_signal_connect_swapped (tp_chat, "notify::remote-contact", G_CALLBACK (chat_remote_contact_changed_cb), chat); diff --git a/libempathy-gtk/empathy-contact-list-store.c b/libempathy-gtk/empathy-contact-list-store.c index 6572b4c90..417250fcd 100644 --- a/libempathy-gtk/empathy-contact-list-store.c +++ b/libempathy-gtk/empathy-contact-list-store.c @@ -103,6 +103,12 @@ static void contact_list_store_members_changed_cb (EmpathyCon gchar *message, gboolean is_member, EmpathyContactListStore *store); +static void contact_list_store_member_renamed_cb (EmpathyContactList *list_iface, + EmpathyContact *old_contact, + EmpathyContact *new_contact, + guint reason, + gchar *message, + EmpathyContactListStore *store); static void contact_list_store_groups_changed_cb (EmpathyContactList *list_iface, EmpathyContact *contact, gchar *group, @@ -175,6 +181,10 @@ contact_list_store_iface_setup (gpointer user_data) /* Signal connection. */ g_signal_connect (priv->list, + "member-renamed", + G_CALLBACK (contact_list_store_member_renamed_cb), + store); + g_signal_connect (priv->list, "members-changed", G_CALLBACK (contact_list_store_members_changed_cb), store); @@ -309,6 +319,9 @@ contact_list_store_dispose (GObject *object) g_list_free (contacts); g_signal_handlers_disconnect_by_func (priv->list, + G_CALLBACK (contact_list_store_member_renamed_cb), + object); + g_signal_handlers_disconnect_by_func (priv->list, G_CALLBACK (contact_list_store_members_changed_cb), object); g_signal_handlers_disconnect_by_func (priv->list, @@ -835,6 +848,49 @@ contact_list_store_members_changed_cb (EmpathyContactList *list_iface, } static void +contact_list_store_member_renamed_cb (EmpathyContactList *list_iface, + EmpathyContact *old_contact, + EmpathyContact *new_contact, + guint reason, + gchar *message, + EmpathyContactListStore *store) +{ + EmpathyContactListStorePriv *priv; + + priv = GET_PRIV (store); + + DEBUG ("Contact %s (%d) renamed to %s (%d)", + empathy_contact_get_id (old_contact), + empathy_contact_get_handle (old_contact), + empathy_contact_get_id (new_contact), + empathy_contact_get_handle (new_contact)); + + /* connect to signals of new contact */ + g_signal_connect (new_contact, "notify::presence", + G_CALLBACK (contact_list_store_contact_updated_cb), + store); + g_signal_connect (new_contact, "notify::presence-message", + G_CALLBACK (contact_list_store_contact_updated_cb), + store); + g_signal_connect (new_contact, "notify::name", + G_CALLBACK (contact_list_store_contact_updated_cb), + store); + g_signal_connect (new_contact, "notify::avatar", + G_CALLBACK (contact_list_store_contact_updated_cb), + store); + g_signal_connect (new_contact, "notify::capabilities", + G_CALLBACK (contact_list_store_contact_updated_cb), + store); + contact_list_store_add_contact (store, new_contact); + + /* disconnect from old contact */ + g_signal_handlers_disconnect_by_func (old_contact, + G_CALLBACK (contact_list_store_contact_updated_cb), + store); + contact_list_store_remove_contact (store, old_contact); +} + +static void contact_list_store_groups_changed_cb (EmpathyContactList *list_iface, EmpathyContact *contact, gchar *group, |