diff gtk/gtkimhtml.c @ 15317:d928cf5ead1b

[gaim-migrate @ 18108] bug fix. Breaks 'don't scroll if you're not already scrolled at the bottom' and selecton. I'll look at those tomorrow, but amd committing it in case someone knowledgable wants to beat me to it. committer: Tailor Script <tailor@pidgin.im>
author Sean Egan <seanegan@gmail.com>
date Thu, 11 Jan 2007 08:43:34 +0000
parents d728da06e0e8
children 3abb476aab94
line wrap: on
line diff
--- a/gtk/gtkimhtml.c	Thu Jan 11 07:43:03 2007 +0000
+++ b/gtk/gtkimhtml.c	Thu Jan 11 08:43:34 2007 +0000
@@ -1220,6 +1220,8 @@
 	g_slist_free(imhtml->im_images);
 	g_free(imhtml->protocol_name);
 	g_free(imhtml->search_string);
+	g_object_unref(imhtml->empty_buffer);
+	g_object_unref(imhtml->text_buffer);
 	G_OBJECT_CLASS(parent_class)->finalize (object);
 }
 
@@ -1317,6 +1319,7 @@
 {
 	GtkTextIter iter;
 	imhtml->text_buffer = gtk_text_buffer_new(NULL);
+	imhtml->empty_buffer = gtk_text_buffer_new(NULL);
 	gtk_text_buffer_get_end_iter (imhtml->text_buffer, &iter);
 	gtk_text_view_set_buffer(GTK_TEXT_VIEW(imhtml), imhtml->text_buffer);
 	gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(imhtml), GTK_WRAP_WORD_CHAR);
@@ -2355,12 +2358,21 @@
 	}
 }
 
+static gboolean
+set_adj_idle_cb(gpointer data)
+{
+	GtkIMHtml *imhtml = data;
+	gtk_adjustment_set_value(GTK_TEXT_VIEW(imhtml)->vadjustment, imhtml->adj);
+	return FALSE;
+}
+
 void gtk_imhtml_insert_html_at_iter(GtkIMHtml        *imhtml,
                                     const gchar      *text,
                                     GtkIMHtmlOptions  options,
                                     GtkTextIter      *iter)
 {
 	GdkRectangle rect;
+	GtkAdjustment *adj = GTK_TEXT_VIEW(imhtml)->vadjustment;
 	gint pos = 0;
 	gchar *ws;
 	gchar *tag;
@@ -2372,6 +2384,7 @@
 	gchar *amp;
 	gint len_protocol;
 
+
 	guint	bold = 0,
 		italics = 0,
 		underline = 0,
@@ -2395,6 +2408,9 @@
 	ws = g_malloc(len + 1);
 	ws[0] = 0;
 
+	imhtml->adj = gtk_adjustment_get_value(adj);
+	gtk_text_view_set_buffer(GTK_TEXT_VIEW(imhtml), imhtml->empty_buffer);
+
 	while (pos < len) {
 		if (*c == '<' && gtk_imhtml_is_tag (c + 1, &tag, &tlen, &type)) {
 			c++;
@@ -3052,6 +3068,8 @@
 		gtk_imhtml_close_tags(imhtml, iter);
 
 	object = g_object_ref(G_OBJECT(imhtml));
+	gtk_text_view_set_buffer(GTK_TEXT_VIEW(imhtml), imhtml->text_buffer);
+	g_idle_add(set_adj_idle_cb, imhtml);
 	g_signal_emit(object, signals[UPDATE_FORMAT], 0);
 	g_object_unref(object);