aboutsummaryrefslogtreecommitdiffstats
path: root/libempathy-gtk/empathy-chat.c
diff options
context:
space:
mode:
Diffstat (limited to 'libempathy-gtk/empathy-chat.c')
-rw-r--r--libempathy-gtk/empathy-chat.c38
1 files changed, 31 insertions, 7 deletions
diff --git a/libempathy-gtk/empathy-chat.c b/libempathy-gtk/empathy-chat.c
index a568db03b..ae0825255 100644
--- a/libempathy-gtk/empathy-chat.c
+++ b/libempathy-gtk/empathy-chat.c
@@ -81,6 +81,7 @@ struct _EmpathyChatPriv {
time_t last_log_timestamp;
gboolean is_first_char;
guint block_events_timeout_id;
+ GList *pending_messages;
/* Used to automatically shrink a window that has temporarily
* grown due to long input.
*/
@@ -397,6 +398,9 @@ chat_finalize (GObject *object)
chat_composing_remove_timeout (chat);
g_object_unref (priv->log_manager);
+ g_list_foreach (priv->pending_messages, (GFunc) g_object_unref, NULL);
+ g_list_free (priv->pending_messages);
+
dbus_g_proxy_disconnect_signal (DBUS_G_PROXY (priv->mc), "AccountStatusChanged",
G_CALLBACK (chat_status_changed_cb),
chat);
@@ -441,6 +445,13 @@ chat_destroy_cb (EmpathyTpChat *tp_chat,
empathy_chat_view_append_event (chat->view, _("Disconnected"));
gtk_widget_set_sensitive (chat->input_text_view, FALSE);
+ if (priv->block_events_timeout_id != 0) {
+ g_source_remove (priv->block_events_timeout_id);
+ }
+
+ g_list_foreach (priv->pending_messages, (GFunc) g_object_unref, NULL);
+ g_list_free (priv->pending_messages);
+
if (EMPATHY_CHAT_GET_CLASS (chat)->set_tp_chat) {
EMPATHY_CHAT_GET_CLASS (chat)->set_tp_chat (chat, NULL);
}
@@ -524,6 +535,14 @@ chat_message_received_cb (EmpathyTpChat *tp_chat,
return;
}
+ if (chat->block_events) {
+ /* Wait until block_events cb before displaying
+ * them to have to chance to get alias/avatar of sender. */
+ priv->pending_messages = g_list_append (priv->pending_messages,
+ g_object_ref (message));
+ return;
+ }
+
sender = empathy_message_get_sender (message);
empathy_debug (DEBUG_DOMAIN, "Appending message ('%s')",
empathy_contact_get_name (sender));
@@ -1449,10 +1468,18 @@ chat_block_events_timeout_cb (gpointer data)
{
EmpathyChat *chat = EMPATHY_CHAT (data);
EmpathyChatPriv *priv = GET_PRIV (chat);
+ GList *l;
chat->block_events = FALSE;
priv->block_events_timeout_id = 0;
+ for (l = priv->pending_messages; l; l = l->next) {
+ chat_message_received_cb (priv->tp_chat, l->data, chat);
+ g_object_unref (l->data);
+ }
+ g_list_free (priv->pending_messages);
+ priv->pending_messages = NULL;
+
return FALSE;
}
@@ -1461,7 +1488,7 @@ empathy_chat_set_tp_chat (EmpathyChat *chat,
EmpathyTpChat *tp_chat)
{
EmpathyChatPriv *priv;
- GList *messages, *l;
+ GList *messages;
g_return_if_fail (EMPATHY_IS_CHAT (chat));
g_return_if_fail (EMPATHY_IS_TP_CHAT (tp_chat));
@@ -1520,14 +1547,11 @@ empathy_chat_set_tp_chat (EmpathyChat *chat,
G_CALLBACK (chat_destroy_cb),
chat);
- /* Get pending messages */
+ /* Get pending messages, wait until block_events cb before displaying
+ * them to have to chance to get alias/avatar of sender. */
empathy_tp_chat_set_acknowledge (tp_chat, TRUE);
messages = empathy_tp_chat_get_pendings (tp_chat);
- for (l = messages; l; l = l->next) {
- chat_message_received_cb (tp_chat, l->data, chat);
- g_object_unref (l->data);
- }
- g_list_free (messages);
+ priv->pending_messages = g_list_concat (priv->pending_messages, messages);
if (!priv->sensitive) {
gtk_widget_set_sensitive (chat->input_text_view, TRUE);