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.c26
1 files changed, 26 insertions, 0 deletions
diff --git a/libempathy-gtk/empathy-chat.c b/libempathy-gtk/empathy-chat.c
index f7c013820..a568db03b 100644
--- a/libempathy-gtk/empathy-chat.c
+++ b/libempathy-gtk/empathy-chat.c
@@ -80,6 +80,7 @@ struct _EmpathyChatPriv {
gboolean first_tp_chat;
time_t last_log_timestamp;
gboolean is_first_char;
+ guint block_events_timeout_id;
/* Used to automatically shrink a window that has temporarily
* grown due to long input.
*/
@@ -414,6 +415,10 @@ chat_finalize (GObject *object)
g_source_remove (priv->scroll_idle_id);
}
+ if (priv->block_events_timeout_id) {
+ g_source_remove (priv->block_events_timeout_id);
+ }
+
g_free (priv->id);
G_OBJECT_CLASS (empathy_chat_parent_class)->finalize (object);
@@ -1439,6 +1444,18 @@ empathy_chat_load_geometry (EmpathyChat *chat,
empathy_geometry_load (empathy_chat_get_id (chat), x, y, w, h);
}
+static gboolean
+chat_block_events_timeout_cb (gpointer data)
+{
+ EmpathyChat *chat = EMPATHY_CHAT (data);
+ EmpathyChatPriv *priv = GET_PRIV (chat);
+
+ chat->block_events = FALSE;
+ priv->block_events_timeout_id = 0;
+
+ return FALSE;
+}
+
void
empathy_chat_set_tp_chat (EmpathyChat *chat,
EmpathyTpChat *tp_chat)
@@ -1455,6 +1472,15 @@ empathy_chat_set_tp_chat (EmpathyChat *chat,
return;
}
+ /* Block events for some time to avoid having "has come online" or
+ * "joined" messages. */
+ chat->block_events = TRUE;
+ if (priv->block_events_timeout_id != 0) {
+ g_source_remove (priv->block_events_timeout_id);
+ }
+ priv->block_events_timeout_id =
+ g_timeout_add_seconds (1, chat_block_events_timeout_cb, chat);
+
if (priv->tp_chat) {
g_signal_handlers_disconnect_by_func (priv->tp_chat,
chat_message_received_cb,