summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/core/log.c15
-rw-r--r--src/core/log.h3
-rw-r--r--src/fe-common/core/fe-log.c54
-rw-r--r--src/fe-common/core/formats.c24
4 files changed, 77 insertions, 19 deletions
diff --git a/src/core/log.c b/src/core/log.c
index d2f1e7bf..743121f7 100644
--- a/src/core/log.c
+++ b/src/core/log.c
@@ -184,6 +184,7 @@ static void log_rotate_check(LOG_REC *log)
void log_write_rec(LOG_REC *log, const char *str, int level)
{
+ char *colorstr;
struct tm *tm;
time_t now;
int hour, day;
@@ -215,6 +216,11 @@ void log_write_rec(LOG_REC *log, const char *str, int level)
log->last = now;
+ if (log->colorizer == NULL)
+ colorstr = NULL;
+ else
+ str = colorstr = log->colorizer(str);
+
if ((level & MSGLEVEL_LASTLOG) == 0)
log_write_timestamp(log->handle, log_timestamp, str, now);
else
@@ -222,6 +228,8 @@ void log_write_rec(LOG_REC *log, const char *str, int level)
write_buffer(log->handle, "\n", 1);
signal_emit("log written", 2, log, str);
+
+ g_free_not_null(colorstr);
}
LOG_ITEM_REC *log_item_find(LOG_REC *log, int type, const char *item,
@@ -344,6 +352,8 @@ static void log_update_config(LOG_REC *log)
if (log->items != NULL)
log_items_update_config(log, node);
+
+ signal_emit("log config save", 2, log, node);
}
static void log_remove_config(LOG_REC *log)
@@ -515,6 +525,8 @@ static void log_read_config(void)
log->autoopen = config_node_get_bool(node, "auto_open", FALSE);
log->level = level2bits(config_node_get_str(node, "level", 0));
+ signal_emit("log config read", 2, log, node);
+
node = config_node_section(node, "items", -1);
if (node != NULL)
log_items_read_config(node, log);
@@ -549,9 +561,9 @@ void log_init(void)
"--- Day changed %a %b %d %Y");
read_settings();
- log_read_config();
signal_add("setup changed", (SIGNAL_FUNC) read_settings);
signal_add("setup reread", (SIGNAL_FUNC) log_read_config);
+ signal_add("irssi init finished", (SIGNAL_FUNC) log_read_config);
}
void log_deinit(void)
@@ -563,4 +575,5 @@ void log_deinit(void)
signal_remove("setup changed", (SIGNAL_FUNC) read_settings);
signal_remove("setup reread", (SIGNAL_FUNC) log_read_config);
+ signal_remove("irssi init finished", (SIGNAL_FUNC) log_read_config);
}
diff --git a/src/core/log.h b/src/core/log.h
index 7361b6a0..0bca0820 100644
--- a/src/core/log.h
+++ b/src/core/log.h
@@ -6,6 +6,8 @@ enum {
LOG_ITEM_WINDOW_REFNUM
};
+typedef char *(*COLORIZE_FUNC)(const char *str);
+
typedef struct {
int type;
char *name;
@@ -22,6 +24,7 @@ typedef struct {
GSList *items; /* log only on these items */
time_t last; /* when last message was written */
+ COLORIZE_FUNC colorizer;
unsigned int autoopen:1; /* automatically start logging at startup */
unsigned int failed:1; /* opening log failed last time */
diff --git a/src/fe-common/core/fe-log.c b/src/fe-common/core/fe-log.c
index eb7f9bec..0ee94a01 100644
--- a/src/fe-common/core/fe-log.c
+++ b/src/fe-common/core/fe-log.c
@@ -28,6 +28,7 @@
#include "log.h"
#include "special-vars.h"
#include "settings.h"
+#include "lib-config/iconfig.h"
#include "fe-windows.h"
#include "window-items.h"
@@ -48,6 +49,11 @@ static THEME_REC *log_theme;
static int skip_next_printtext;
static const char *log_theme_name;
+static char *log_colorizer_strip(const char *str)
+{
+ return strip_codes(str);
+}
+
static void log_add_targets(LOG_REC *log, const char *targets, const char *tag)
{
char **tmp, **items;
@@ -64,7 +70,8 @@ static void log_add_targets(LOG_REC *log, const char *targets, const char *tag)
}
/* SYNTAX: LOG OPEN [-noopen] [-autoopen] [-window] [-<server tag>]
- [-targets <targets>] <fname> [<levels>] */
+ [-targets <targets>] [-mirccolors | -ansicolors]
+ <fname> [<levels>] */
static void cmd_log_open(const char *data)
{
SERVER_REC *server;
@@ -102,6 +109,9 @@ static void cmd_log_open(const char *data)
if (g_hash_table_lookup(optlist, "autoopen"))
log->autoopen = TRUE;
+ if (g_hash_table_lookup(optlist, "colors") == NULL)
+ log->colorizer = log_colorizer_strip;
+
log_update(log);
if (log->handle == -1 && g_hash_table_lookup(optlist, "noopen") == NULL) {
@@ -448,7 +458,9 @@ static void log_single_line(WINDOW_REC *window, void *server,
ltoa(windownum, window->refnum);
log = logs_find_item(LOG_ITEM_WINDOW_REFNUM,
windownum, NULL, NULL);
- if (log != NULL) log_write_rec(log, text, level);
+ if (log != NULL) {
+ log_write_rec(log, text, level);
+ }
if (target == NULL)
log_file_write(server, NULL, level, text, FALSE);
@@ -492,13 +504,13 @@ static void sig_printtext(TEXT_DEST_REC *dest, const char *text,
}
log_line(dest->window, dest->server, dest->target,
- dest->level, stripped);
+ dest->level, text);
}
static void sig_print_format(THEME_REC *theme, const char *module,
TEXT_DEST_REC *dest, void *formatnum, char **args)
{
- char *str, *stripped, *linestart, *tmp;
+ char *str, *linestart, *tmp;
if (log_theme == NULL) {
/* theme isn't loaded for some reason (/reload destroys it),
@@ -523,10 +535,8 @@ static void sig_print_format(THEME_REC *theme, const char *module,
g_free(tmp);
/* strip colors from text, log it. */
- stripped = strip_codes(str);
log_line(dest->window, dest->server, dest->target,
- dest->level, stripped);
- g_free(stripped);
+ dest->level, str);
}
g_free(str);
@@ -584,6 +594,27 @@ static void sig_log_create_failed(LOG_REC *log)
TXT_LOG_CREATE_FAILED, log->fname, g_strerror(errno));
}
+static void sig_log_new(LOG_REC *log)
+{
+ if (!settings_get_bool("awaylog_colors") &&
+ strcmp(log->fname, settings_get_str("awaylog_file")) == 0)
+ log->colorizer = log_colorizer_strip;
+}
+
+static void sig_log_config_read(LOG_REC *log, CONFIG_NODE *node)
+{
+ if (!config_node_get_bool(node, "colors", FALSE))
+ log->colorizer = log_colorizer_strip;
+}
+
+static void sig_log_config_save(LOG_REC *log, CONFIG_NODE *node)
+{
+ if (log->colorizer == NULL)
+ iconfig_node_set_bool(node, "colors", TRUE);
+ else
+ iconfig_node_set_str(node, "colors", NULL);
+}
+
static void sig_awaylog_show(LOG_REC *log, gpointer pmsgs, gpointer pfilepos)
{
char *str;
@@ -638,6 +669,7 @@ void fe_log_init(void)
autoremove_tag = g_timeout_add(60000, (GSourceFunc) sig_autoremove, NULL);
skip_next_printtext = FALSE;
+ settings_add_bool("log", "awaylog_colors", TRUE);
settings_add_str("log", "autolog_path", "~/irclogs/$tag/$0.log");
settings_add_str("log", "autolog_level", "all -crap -clientcrap -ctcps");
settings_add_bool("log", "autolog", FALSE);
@@ -660,11 +692,14 @@ void fe_log_init(void)
signal_add("server disconnected", (SIGNAL_FUNC) sig_server_disconnected);
signal_add("log locked", (SIGNAL_FUNC) sig_log_locked);
signal_add("log create failed", (SIGNAL_FUNC) sig_log_create_failed);
+ signal_add("log new", (SIGNAL_FUNC) sig_log_new);
+ signal_add("log config read", (SIGNAL_FUNC) sig_log_config_read);
+ signal_add("log config save", (SIGNAL_FUNC) sig_log_config_save);
signal_add("awaylog show", (SIGNAL_FUNC) sig_awaylog_show);
signal_add("theme destroyed", (SIGNAL_FUNC) sig_theme_destroyed);
signal_add("setup changed", (SIGNAL_FUNC) read_settings);
- command_set_options("log open", "noopen autoopen -targets window");
+ command_set_options("log open", "noopen autoopen -targets window colors");
}
void fe_log_deinit(void)
@@ -686,6 +721,9 @@ void fe_log_deinit(void)
signal_remove("server disconnected", (SIGNAL_FUNC) sig_server_disconnected);
signal_remove("log locked", (SIGNAL_FUNC) sig_log_locked);
signal_remove("log create failed", (SIGNAL_FUNC) sig_log_create_failed);
+ signal_remove("log new", (SIGNAL_FUNC) sig_log_new);
+ signal_remove("log config read", (SIGNAL_FUNC) sig_log_config_read);
+ signal_remove("log config save", (SIGNAL_FUNC) sig_log_config_save);
signal_remove("awaylog show", (SIGNAL_FUNC) sig_awaylog_show);
signal_remove("theme destroyed", (SIGNAL_FUNC) sig_theme_destroyed);
signal_remove("setup changed", (SIGNAL_FUNC) read_settings);
diff --git a/src/fe-common/core/formats.c b/src/fe-common/core/formats.c
index d5b9f3a4..cdc064d8 100644
--- a/src/fe-common/core/formats.c
+++ b/src/fe-common/core/formats.c
@@ -653,11 +653,11 @@ void format_newline(WINDOW_REC *window)
}
/* parse ANSI color string */
-static char *get_ansi_color(THEME_REC *theme, char *str,
- int *fg_ret, int *bg_ret, int *flags_ret)
+static const char *get_ansi_color(THEME_REC *theme, const char *str,
+ int *fg_ret, int *bg_ret, int *flags_ret)
{
static char ansitab[8] = { 0, 4, 2, 6, 1, 5, 3, 7 };
- char *start;
+ const char *start;
int fg, bg, flags, num;
if (*str != '[')
@@ -844,7 +844,10 @@ char *strip_codes(const char *input)
p += 2;
continue;
}
- }
+ }
+
+ if (*p == 27 && p[1] != '\0')
+ p = get_ansi_color(current_theme, p, NULL, NULL, NULL);
if (!IS_COLOR_CODE(*p))
*out++ = *p;
@@ -975,12 +978,13 @@ void format_send_to_gui(TEXT_DEST_REC *dest, const char *text)
break;
case 27:
/* ansi color code */
- ptr = get_ansi_color(dest->window == NULL || dest->window->theme == NULL ?
- current_theme : dest->window->theme,
- ptr,
- hide_text_style ? NULL : &fgcolor,
- hide_text_style ? NULL : &bgcolor,
- hide_text_style ? NULL : &flags);
+ ptr = (char *)
+ get_ansi_color(dest->window == NULL || dest->window->theme == NULL ?
+ current_theme : dest->window->theme,
+ ptr,
+ hide_text_style ? NULL : &fgcolor,
+ hide_text_style ? NULL : &bgcolor,
+ hide_text_style ? NULL : &flags);
break;
}