diff options
author | Xavier Claessens <xclaesse@src.gnome.org> | 2008-02-16 17:22:52 +0800 |
---|---|---|
committer | Xavier Claessens <xclaesse@src.gnome.org> | 2008-02-16 17:22:52 +0800 |
commit | 04462d2c6fbcbde891ec2a0d10cec540110517c7 (patch) | |
tree | 495581b0245cc1b454937326f63d277db56050d1 | |
parent | 542c9b73402e30b9d07ae19055babf0eb767366b (diff) | |
download | gsoc2013-empathy-04462d2c6fbcbde891ec2a0d10cec540110517c7.tar gsoc2013-empathy-04462d2c6fbcbde891ec2a0d10cec540110517c7.tar.gz gsoc2013-empathy-04462d2c6fbcbde891ec2a0d10cec540110517c7.tar.bz2 gsoc2013-empathy-04462d2c6fbcbde891ec2a0d10cec540110517c7.tar.lz gsoc2013-empathy-04462d2c6fbcbde891ec2a0d10cec540110517c7.tar.xz gsoc2013-empathy-04462d2c6fbcbde891ec2a0d10cec540110517c7.tar.zst gsoc2013-empathy-04462d2c6fbcbde891ec2a0d10cec540110517c7.zip |
Block events messages when the chat is connecting to a new Text channel. Fixes bug #507515 and #516198.
svn path=/trunk/; revision=641
-rw-r--r-- | libempathy-gtk/empathy-chat.c | 26 | ||||
-rw-r--r-- | libempathy-gtk/empathy-chat.h | 1 | ||||
-rw-r--r-- | libempathy-gtk/empathy-group-chat.c | 38 | ||||
-rw-r--r-- | libempathy-gtk/empathy-private-chat.c | 4 |
4 files changed, 48 insertions, 21 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, diff --git a/libempathy-gtk/empathy-chat.h b/libempathy-gtk/empathy-chat.h index 5bf456e48..bcf382e53 100644 --- a/libempathy-gtk/empathy-chat.h +++ b/libempathy-gtk/empathy-chat.h @@ -58,6 +58,7 @@ struct _EmpathyChat { /* Protected */ EmpathyChatView *view; GtkWidget *input_text_view; + gboolean block_events; }; struct _EmpathyChatClass { diff --git a/libempathy-gtk/empathy-group-chat.c b/libempathy-gtk/empathy-group-chat.c index 4f86ef2ba..a51b25228 100644 --- a/libempathy-gtk/empathy-group-chat.c +++ b/libempathy-gtk/empathy-group-chat.c @@ -355,20 +355,18 @@ group_chat_members_changed_cb (EmpathyTpChatroom *tp_chat, gboolean is_member, EmpathyGroupChat *chat) { - EmpathyGroupChatPriv *priv; - gchar *str; - - priv = GET_PRIV (chat); - - if (is_member) { - str = g_strdup_printf (_("%s has joined the room"), - empathy_contact_get_name (contact)); - } else { - str = g_strdup_printf (_("%s has left the room"), - empathy_contact_get_name (contact)); + if (!EMPATHY_CHAT (chat)->block_events) { + gchar *str; + if (is_member) { + str = g_strdup_printf (_("%s has joined the room"), + empathy_contact_get_name (contact)); + } else { + str = g_strdup_printf (_("%s has left the room"), + empathy_contact_get_name (contact)); + } + empathy_chat_view_append_event (EMPATHY_CHAT (chat)->view, str); + g_free (str); } - empathy_chat_view_append_event (EMPATHY_CHAT (chat)->view, str); - g_free (str); } static void @@ -571,13 +569,15 @@ group_chat_subject_notify_cb (EmpathyTpChat *tp_chat, priv->topic = str; gtk_label_set_text (GTK_LABEL (priv->label_topic), priv->topic); - if (!G_STR_EMPTY (priv->topic)) { - str = g_strdup_printf (_("Topic set to: %s"), priv->topic); - } else { - str = g_strdup (_("No topic defined")); + if (!EMPATHY_CHAT (chat)->block_events) { + if (!G_STR_EMPTY (priv->topic)) { + str = g_strdup_printf (_("Topic set to: %s"), priv->topic); + } else { + str = g_strdup (_("No topic defined")); + } + empathy_chat_view_append_event (EMPATHY_CHAT (chat)->view, str); + g_free (str); } - empathy_chat_view_append_event (EMPATHY_CHAT (chat)->view, str); - g_free (str); } static void diff --git a/libempathy-gtk/empathy-private-chat.c b/libempathy-gtk/empathy-private-chat.c index 2dd1ba755..0bcdd7844 100644 --- a/libempathy-gtk/empathy-private-chat.c +++ b/libempathy-gtk/empathy-private-chat.c @@ -223,7 +223,7 @@ private_chat_contact_presence_updated_cb (EmpathyContact *contact, empathy_contact_get_id (contact)); if (!empathy_contact_is_online (contact)) { - if (priv->is_online) { + if (priv->is_online && !EMPATHY_CHAT (chat)->block_events) { gchar *msg; msg = g_strdup_printf (_("%s went offline"), @@ -237,7 +237,7 @@ private_chat_contact_presence_updated_cb (EmpathyContact *contact, g_signal_emit_by_name (chat, "composing", FALSE); } else { - if (!priv->is_online) { + if (!priv->is_online && !EMPATHY_CHAT (chat)->block_events) { gchar *msg; msg = g_strdup_printf (_("%s has come online"), |