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] [-] - [-targets ] [] */ + [-targets ] [-mirccolors | -ansicolors] + [] */ 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; }