[empathy] Adium: Also queue events when loading the page



commit af9137e60f178bcc5fe039c64ea5e7a762ffcc62
Author: Xavier Claessens <xclaesse gmail com>
Date:   Tue May 3 14:23:25 2011 +0200

    Adium: Also queue events when loading the page

 libempathy-gtk/empathy-theme-adium.c |   32 +++++++++++++++++++++-----------
 1 files changed, 21 insertions(+), 11 deletions(-)
---
diff --git a/libempathy-gtk/empathy-theme-adium.c b/libempathy-gtk/empathy-theme-adium.c
index 8d5b3b7..14c5447 100644
--- a/libempathy-gtk/empathy-theme-adium.c
+++ b/libempathy-gtk/empathy-theme-adium.c
@@ -59,7 +59,8 @@ typedef struct {
 	gint64                last_timestamp;
 	gboolean              last_is_backlog;
 	guint                 pages_loading;
-	GList                *message_queue;
+	/* Queue of GValue* containing an EmpathyMessage or string */
+	GQueue                message_queue;
 	GtkWidget            *inspector_window;
 	GSettings            *gsettings_chat;
 	gboolean              has_focus;
@@ -636,8 +637,9 @@ theme_adium_append_message (EmpathyChatView *view,
 	gboolean               consecutive;
 
 	if (priv->pages_loading != 0) {
-		priv->message_queue = g_list_prepend (priv->message_queue,
-						      g_object_ref (msg));
+		GValue *value = tp_g_value_slice_new (EMPATHY_TYPE_MESSAGE);
+		g_value_set_object (value, msg);
+		g_queue_push_tail (&priv->message_queue, value);
 		return;
 	}
 
@@ -837,8 +839,8 @@ theme_adium_append_event (EmpathyChatView *view,
 	gchar *str_escaped;
 
 	if (priv->pages_loading != 0) {
-		/* FIXME: events should be queued until page loaded */
-		DEBUG ("Error appending event (%s): Page not loaded", str);
+		g_queue_push_tail (&priv->message_queue,
+			tp_g_value_slice_new_string (str));
 		return;
 	}
 
@@ -1090,6 +1092,7 @@ theme_adium_load_finished_cb (WebKitWebView  *view,
 {
 	EmpathyThemeAdiumPriv *priv = GET_PRIV (view);
 	EmpathyChatView       *chat_view = EMPATHY_CHAT_VIEW (view);
+	GList                 *l;
 
 	DEBUG ("Page loaded");
 	priv->pages_loading--;
@@ -1098,14 +1101,20 @@ theme_adium_load_finished_cb (WebKitWebView  *view,
 		return;
 
 	/* Display queued messages */
-	priv->message_queue = g_list_reverse (priv->message_queue);
-	while (priv->message_queue) {
-		EmpathyMessage *message = priv->message_queue->data;
+	for (l = priv->message_queue.head; l != NULL; l = l->next) {
+		GValue *value = l->data;
 
-		theme_adium_append_message (chat_view, message);
-		priv->message_queue = g_list_remove (priv->message_queue, message);
-		g_object_unref (message);
+		if (G_VALUE_HOLDS_OBJECT (value)) {
+			theme_adium_append_message (chat_view,
+				g_value_get_object (value));
+		} else {
+			theme_adium_append_event (chat_view,
+				g_value_get_string (value));
+		}
+
+		tp_g_value_slice_free (value);
 	}
+	g_queue_clear (&priv->message_queue);
 }
 
 static void
@@ -1381,6 +1390,7 @@ empathy_theme_adium_init (EmpathyThemeAdium *theme)
 
 	theme->priv = priv;
 
+	g_queue_init (&priv->message_queue);
 	priv->allow_scrolling = TRUE;
 	priv->smiley_manager = empathy_smiley_manager_dup_singleton ();
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]