# HG changeset patch # User Sadrul Habib Chowdhury # Date 1188041314 0 # Node ID e8bd9d92202e17e4d27398cab8231c08a326a4df # Parent c1c260d413652f1fb9be66dcae0288bc60f5a2be Adding all the message from history in GtkIMHtml takes a bit long causing pidgin to freeze for a second or two. So instead of adding all the messages at one go, add some of them in an idle callback. diff -r c1c260d41365 -r e8bd9d92202e pidgin/gtkconv.c --- a/pidgin/gtkconv.c Sat Aug 25 11:18:26 2007 +0000 +++ b/pidgin/gtkconv.c Sat Aug 25 11:28:34 2007 +0000 @@ -5002,6 +5002,10 @@ g_list_foreach(gtkconv->send_history, (GFunc)g_free, NULL); g_list_free(gtkconv->send_history); + if (gtkconv->attach.timer) { + g_source_remove(gtkconv->attach.timer); + } + if (tooltip.gtkconv == gtkconv) reset_tooltip(); @@ -5218,6 +5222,15 @@ gtkconv = PIDGIN_CONVERSATION(conv); g_return_if_fail(gtkconv != NULL); + if (gtkconv->attach.timer) { + /* We are currently in the process of filling up the buffer with the message + * history of the conversation. So we do not need to add the message here. + * Instead, this message will be added to the message-list, which in turn will + * be processed and displayed by the attach-callback. + */ + return; + } + if (conv != gtkconv->active_conv) { if (flags & PURPLE_MESSAGE_ACTIVE_ONLY) @@ -7141,22 +7154,45 @@ pidgin_conv_update_fields(conv, PIDGIN_CONV_TOPIC); } +static gboolean +add_message_history_to_gtkconv(gpointer data) +{ + PidginConversation *gtkconv = data; + int count = 0; + int timer = gtkconv->attach.timer; + gtkconv->attach.timer = 0; + while (gtkconv->attach.current && count < 100) { /* XXX: 100 is a random value here */ + PurpleConvMessage *msg = gtkconv->attach.current->data; + pidgin_conv_write_conv(gtkconv->active_conv, msg->who, msg->who, msg->what, msg->flags, msg->when); + gtkconv->attach.current = gtkconv->attach.current->prev; + count++; + } + gtkconv->attach.timer = timer; + if (gtkconv->attach.current) + return TRUE; + + g_source_remove(gtkconv->attach.timer); + gtkconv->attach.timer = 0; + return FALSE; +} + gboolean pidgin_conv_attach_to_conversation(PurpleConversation *conv) { GList *list; + PidginConversation *gtkconv; if (PIDGIN_IS_PIDGIN_CONVERSATION(conv)) return FALSE; purple_conversation_set_ui_ops(conv, pidgin_conversations_get_conv_ui_ops()); private_gtkconv_new(conv, FALSE); + gtkconv = PIDGIN_CONVERSATION(conv); list = purple_conversation_get_message_history(conv); - list = g_list_last(list); - while (list) { - PurpleConvMessage *msg = list->data; - pidgin_conv_write_conv(conv, msg->who, msg->who, msg->what, msg->flags, msg->when); - list = list->prev; + if (list) { + list = g_list_last(list); + gtkconv->attach.current = list; + gtkconv->attach.timer = g_idle_add(add_message_history_to_gtkconv, gtkconv); } /* XXX: If this is a chat: diff -r c1c260d41365 -r e8bd9d92202e pidgin/gtkconv.h --- a/pidgin/gtkconv.h Sat Aug 25 11:18:26 2007 +0000 +++ b/pidgin/gtkconv.h Sat Aug 25 11:28:34 2007 +0000 @@ -162,6 +162,13 @@ GtkWidget *infopane; GtkListStore *infopane_model; GtkTreeIter infopane_iter; + + /* Used when attaching a PidginConversation to a PurpleConversation + * with message history */ + struct { + int timer; + GList *current; + } attach; }; /*@}*/