changeset 682:54980ddfe1ce

Memorize text to display in the log window when the window is not yet created. On log window display, the memorized text is then recalled and displayed.
author zas_
date Sun, 18 May 2008 11:39:58 +0000
parents ac0ede6a53cf
children fece9ff5c624
files src/logwindow.c
diffstat 1 files changed, 56 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/src/logwindow.c	Sun May 18 07:36:57 2008 +0000
+++ b/src/logwindow.c	Sun May 18 11:39:58 2008 +0000
@@ -17,8 +17,6 @@
 
 #include <gdk/gdkkeysyms.h>
 
-#define TRIM_LINES	25
-
 
 typedef struct _LogWindow LogWindow;
 
@@ -166,6 +164,8 @@
 	gtk_text_view_scroll_mark_onscreen(text, mark);
 
 	gtk_window_present(GTK_WINDOW(logwin->window));
+
+	log_window_append("", LOG_NORMAL); // to flush memorized lines
 }
 
 
@@ -183,6 +183,13 @@
 	log_window_show(logwindow);
 }
 
+typedef struct _LogMsg LogMsg;
+
+struct _LogMsg {
+	gchar *text;
+	LogType type;
+};
+
 void log_window_append(const gchar *str, LogType type)
 {
 	GtkTextView *text;
@@ -190,8 +197,28 @@
 	GtkTextIter iter;
 	gint line_limit = 1000; //FIXME: option
 	gchar *str_utf8;
+	static GList *memory = NULL;
 
-	if (logwindow == NULL) return;
+	if (logwindow == NULL && *str)
+		{
+		LogMsg *msg = g_new(LogMsg, 1);
+
+		msg->text = g_strdup(str);
+		msg->type = type;
+
+		memory = g_list_prepend(memory, msg);
+
+		while (g_list_length(memory) >= line_limit)
+			{
+			GList *work = g_list_last(memory);
+			LogMsg *oldest_msg = work->data;
+			
+			g_free(oldest_msg->text);
+			memory = g_list_delete_link(memory, work);
+			}
+
+		return;
+		}
 
 	text = GTK_TEXT_VIEW(logwindow->text);
 	buffer = gtk_text_view_get_buffer(text);
@@ -202,16 +229,36 @@
 
 		gtk_text_buffer_get_start_iter(buffer, &start);
 		end = start;
-		gtk_text_iter_forward_lines(&end, TRIM_LINES);
+		gtk_text_iter_forward_lines(&end, logwindow->lines - line_limit);
 		gtk_text_buffer_delete(buffer, &start, &end);
-		logwindow->lines = gtk_text_buffer_get_line_count(buffer);
 		}
 
 	gtk_text_buffer_get_end_iter(buffer, &iter);
 
-	str_utf8 = utf8_validate_or_convert((gchar *)str);
-	gtk_text_buffer_insert_with_tags_by_name
-			(buffer, &iter, str_utf8, -1, logdefs[type].tag, NULL);
+	{
+	GList *work = g_list_last(memory);
+
+	while (work)
+		{
+		GList *prev;
+		LogMsg *oldest_msg = work->data;
+		
+		str_utf8 = utf8_validate_or_convert((gchar *)oldest_msg->text);
+		gtk_text_buffer_insert_with_tags_by_name
+			(buffer, &iter, str_utf8, -1, logdefs[oldest_msg->type].tag, NULL);
+	
+		prev = work->prev;
+		memory = g_list_delete_link(memory, work);
+		work = prev;
+		}
+	}
+
+	if (*str)
+		{
+		str_utf8 = utf8_validate_or_convert((gchar *)str);
+		gtk_text_buffer_insert_with_tags_by_name
+				(buffer, &iter, str_utf8, -1, logdefs[type].tag, NULL);
+		}
 
 	if (GTK_WIDGET_VISIBLE(text))
 		{
@@ -221,5 +268,5 @@
 		gtk_text_view_scroll_mark_onscreen(text, mark);
 		}
 
-	logwindow->lines++;
+	logwindow->lines = gtk_text_buffer_get_line_count(buffer);
 }