changeset 2601:5d2e634fd54f

Update log window output Implement message text colors in GTK3 For log_printf(), if the first word of the message is "error" or "warning" (case insensitive), display the message with the appropriate color-coding
author Colin Clark <colin.clark@cclark.uk>
date Sat, 16 Sep 2017 20:30:53 +0100
parents c6a11c0bade8
children 0f9a732f4205
files src/debug.c src/logwindow.c
diffstat 2 files changed, 75 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/src/debug.c	Sat Sep 16 20:18:35 2017 +0100
+++ b/src/debug.c	Sat Sep 16 20:30:53 2017 +0100
@@ -40,11 +40,38 @@
 	return FALSE;
 }
 
+/**
+ * @brief Appends a user information message to the log window queue
+ * @param data The message
+ * @returns FALSE
+ * 
+ * If the first word of the message is either "error" or "warning"
+ * (case insensitive) the message is color-coded appropriately
+ */
 static gboolean log_normal_cb(gpointer data)
 {
 	gchar *buf = data;
-	log_window_append(buf, LOG_NORMAL);
+	gchar *buf_casefold = g_utf8_casefold(buf, -1);
+	gchar *error_casefold = g_utf8_casefold(_("error"), -1);
+	gchar *warning_casefold = g_utf8_casefold(_("warning"), -1);
+
+	if (buf_casefold == g_strstr_len(buf_casefold, -1, error_casefold))
+		{
+		log_window_append(buf, LOG_ERROR);
+		}
+	else if (buf_casefold == g_strstr_len(buf_casefold, -1, warning_casefold))
+		{
+		log_window_append(buf, LOG_WARN);
+		}
+	else
+		{
+		log_window_append(buf, LOG_NORMAL);
+		}
+
 	g_free(buf);
+	g_free(buf_casefold);
+	g_free(error_casefold);
+	g_free(warning_casefold);
 	return FALSE;
 }
 
--- a/src/logwindow.c	Sat Sep 16 20:18:35 2017 +0100
+++ b/src/logwindow.c	Sat Sep 16 20:30:53 2017 +0100
@@ -37,7 +37,11 @@
 	GtkWidget *scrolledwin;
 	GtkWidget *text;
 
+#if !GTK_CHECK_VERSION(3,0,0)
 	GdkColor colors[LOG_COUNT];
+#else
+	GtkTextTag *color_tags[LOG_COUNT];
+#endif
 
 	guint lines;
 	GtkWidget *regexp_box;
@@ -48,6 +52,7 @@
 	GtkWidget *debug_level;
 };
 
+#if !GTK_CHECK_VERSION(3,0,0)
 typedef struct _LogDef LogDef;
 struct _LogDef
 {
@@ -63,6 +68,7 @@
 	{ LOG_WARN,	"warning",	"orange" },
 	{ LOG_ERROR,	"error",	"red"	 },
 };
+#endif
 
 static LogWindow *logwindow = NULL;
 
@@ -210,12 +216,10 @@
 #if !GTK_CHECK_VERSION(3,0,0)
 	GdkColormap *colormap;
 	gboolean success[LOG_COUNT];
-#endif
 	gint i;
 
 	g_assert(logwin != NULL);
 	g_assert(logwin->colors != NULL);
-#if !GTK_CHECK_VERSION(3,0,0)
 	for (i = LOG_NORMAL; i < LOG_COUNT; i++)
 		{
 		gboolean ok = gdk_color_parse(logdefs[i].color, &logwin->colors[i]);
@@ -242,13 +246,31 @@
 			break;
 			}
 		}
-#endif
+
 	buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(logwin->text));
 	for (i = LOG_NORMAL; i < LOG_COUNT; i++)
 		gtk_text_buffer_create_tag(buffer, logdefs[i].tag,
 				   	   "foreground-gdk", &logwin->colors[i],
 					   "family", "MonoSpace",
 				   	   NULL);
+#else
+	g_assert(logwin != NULL);
+
+	buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(logwin->text));
+
+	logwin->color_tags[LOG_NORMAL] = gtk_text_buffer_create_tag (buffer,
+							"black_foreground", "foreground", "black",
+							"family", "MonoSpace", NULL);
+	logwin->color_tags[LOG_MSG] = gtk_text_buffer_create_tag (buffer,
+							"blue_foreground", "foreground", "blue",
+							"family", "MonoSpace", NULL);
+	logwin->color_tags[LOG_WARN] = gtk_text_buffer_create_tag (buffer,
+							"orange_foreground", "foreground", "orange",
+							"family", "MonoSpace", NULL);
+	logwin->color_tags[LOG_ERROR] = gtk_text_buffer_create_tag (buffer,
+							"red_foreground", "foreground", "red",
+							"family", "MonoSpace", NULL);
+#endif
 }
 
 static void log_window_show(LogWindow *logwin)
@@ -297,7 +319,7 @@
 	LogType type;
 };
 
-
+#if !GTK_CHECK_VERSION(3,0,0)
 static void log_window_insert_text(GtkTextBuffer *buffer, GtkTextIter *iter,
 				   const gchar *text, const gchar *tag)
 {
@@ -309,7 +331,19 @@
 	gtk_text_buffer_insert_with_tags_by_name(buffer, iter, str_utf8, -1, tag, NULL);
 	g_free(str_utf8);
 }
+#else
+static void log_window_insert_text(GtkTextBuffer *buffer, GtkTextIter *iter,
+				   const gchar *text, GtkTextTag *tag)
+{
+	gchar *str_utf8;
 
+	if (!text || !*text) return;
+
+	str_utf8 = utf8_validate_or_convert(text);
+	gtk_text_buffer_insert_with_tags(buffer, iter, str_utf8, -1, tag, NULL);
+	g_free(str_utf8);
+}
+#endif
 
 void log_window_append(const gchar *str, LogType type)
 {
@@ -363,7 +397,12 @@
 		GList *prev;
 		LogMsg *oldest_msg = work->data;
 
+#if !GTK_CHECK_VERSION(3,0,0)
 		log_window_insert_text(buffer, &iter, oldest_msg->text, logdefs[oldest_msg->type].tag);
+#else
+		log_window_insert_text(buffer, &iter, oldest_msg->text,
+									logwindow->color_tags[oldest_msg->type]);
+#endif
 
 		prev = work->prev;
 		memory = g_list_delete_link(memory, work);
@@ -371,7 +410,11 @@
 		}
 	}
 
+#if !GTK_CHECK_VERSION(3,0,0)
 	log_window_insert_text(buffer, &iter, str, logdefs[type].tag);
+#else
+	log_window_insert_text(buffer, &iter, str, logwindow->color_tags[type]);
+#endif
 
 	if (!options->log_window.paused)
 		{