]> git.0d.be Git - empathy.git/blobdiff - libempathy-gtk/empathy-chat.c
Block events messages when the chat is connecting to a new Text channel. Fixes bug...
[empathy.git] / libempathy-gtk / empathy-chat.c
index f7c013820c18b6e43a26493a9bef532101d2ad0b..a568db03bf84f9de6de1e877f50f9c94a849f71c 100644 (file)
@@ -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,