Update log window output
authorColin Clark <colin.clark@cclark.uk>
Sat, 16 Sep 2017 19:30:53 +0000 (20:30 +0100)
committerColin Clark <colin.clark@cclark.uk>
Sat, 16 Sep 2017 19:30:53 +0000 (20:30 +0100)
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

src/debug.c
src/logwindow.c

index 3f965b4..3fb889f 100644 (file)
@@ -40,11 +40,38 @@ static gboolean log_msg_cb(gpointer data)
        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;
 }
 
index 21b7223..eabeecc 100644 (file)
@@ -37,7 +37,11 @@ struct _LogWindow
        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 @@ struct _LogWindow
        GtkWidget *debug_level;
 };
 
+#if !GTK_CHECK_VERSION(3,0,0)
 typedef struct _LogDef LogDef;
 struct _LogDef
 {
@@ -63,6 +68,7 @@ static LogDef logdefs[LOG_COUNT] = {
        { LOG_WARN,     "warning",      "orange" },
        { LOG_ERROR,    "error",        "red"    },
 };
+#endif
 
 static LogWindow *logwindow = NULL;
 
@@ -210,12 +216,10 @@ static void log_window_init(LogWindow *logwin)
 #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 @@ static void log_window_init(LogWindow *logwin)
                        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 @@ struct _LogMsg {
        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 @@ static void log_window_insert_text(GtkTextBuffer *buffer, GtkTextIter *iter,
        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 @@ void log_window_append(const gchar *str, LogType type)
                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 @@ void log_window_append(const gchar *str, LogType type)
                }
        }
 
+#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)
                {