diff options
author | Timo Sirainen <cras@irssi.org> | 2000-11-21 03:00:05 +0000 |
---|---|---|
committer | cras <cras@dbcabf3a-b0e7-0310-adc4-f8d773084564> | 2000-11-21 03:00:05 +0000 |
commit | e923b1651afc995cf75caf7c63cdf8b246272801 (patch) | |
tree | e640425514a26d764587d574bfe2335dfdde4538 /src/fe-common | |
parent | e3084d3ffae3e57ddf89507e69f61b83c5ceaf90 (diff) | |
download | irssi-e923b1651afc995cf75caf7c63cdf8b246272801.zip |
/SCROLLBACK REDRAW - redraw the contents of current window according to
active formats, ie. changing theme changes scrollback.
It's still a bit buggy (can crash) with multiline formats, need to fix
it as soon as I figure out where the problem is..
git-svn-id: http://svn.irssi.org/repos/irssi/trunk@852 dbcabf3a-b0e7-0310-adc4-f8d773084564
Diffstat (limited to 'src/fe-common')
-rw-r--r-- | src/fe-common/core/fe-common-core.c | 2 | ||||
-rw-r--r-- | src/fe-common/core/fe-log.c | 2 | ||||
-rw-r--r-- | src/fe-common/core/formats.c | 105 | ||||
-rw-r--r-- | src/fe-common/core/formats.h | 5 | ||||
-rw-r--r-- | src/fe-common/core/module-formats.c | 4 | ||||
-rw-r--r-- | src/fe-common/core/printtext.c | 80 | ||||
-rw-r--r-- | src/fe-common/core/themes.c | 23 |
7 files changed, 129 insertions, 92 deletions
diff --git a/src/fe-common/core/fe-common-core.c b/src/fe-common/core/fe-common-core.c index a44bea51..8e1b4070 100644 --- a/src/fe-common/core/fe-common-core.c +++ b/src/fe-common/core/fe-common-core.c @@ -162,7 +162,9 @@ void fe_common_core_finish_init(void) signal_emit("irssi init read settings", 0); +#ifdef SIGPIPE signal(SIGPIPE, SIG_IGN); +#endif windows_restore(); if (windows != NULL) diff --git a/src/fe-common/core/fe-log.c b/src/fe-common/core/fe-log.c index 33b20f43..95ab07e4 100644 --- a/src/fe-common/core/fe-log.c +++ b/src/fe-common/core/fe-log.c @@ -461,7 +461,7 @@ static void sig_print_format(THEME_REC *theme, const char *module, if (*str != '\0') { /* add the line start format */ - linestart = format_get_line_start(log_theme, dest); + linestart = format_get_level_tag(log_theme, dest); tmp = str; str = format_add_linestart(tmp, linestart); g_free_not_null(linestart); diff --git a/src/fe-common/core/formats.c b/src/fe-common/core/formats.c index 205ffec1..8d8ccaac 100644 --- a/src/fe-common/core/formats.c +++ b/src/fe-common/core/formats.c @@ -34,6 +34,27 @@ static int signal_gui_print_text; static int hide_text_style; +static int timestamps, msgs_timestamps; +static int timestamp_timeout; + +int format_find_tag(const char *module, const char *tag) +{ + FORMAT_REC *formats; + int n; + + formats = g_hash_table_lookup(default_formats, module); + if (formats == NULL) + return -1; + + for (n = 0; formats[n].def != NULL; n++) { + if (formats[n].tag != NULL && + g_strcasecmp(formats[n].tag, tag) == 0) + return n; + } + + return -1; +} + int format_expand_styles(GString *out, char format, TEXT_DEST_REC *dest) { static const char *backs = "04261537"; @@ -286,11 +307,11 @@ char *format_get_text_theme_charargs(THEME_REC *theme, const char *module, char **args) { MODULE_THEME_REC *module_theme; - FORMAT_REC *formats; char *text; module_theme = g_hash_table_lookup(theme->modules, module); - formats = g_hash_table_lookup(default_formats, module); + if (module_theme == NULL) + return NULL; text = module_theme->expanded_formats[formatnum]; return format_get_text_args(dest, text, args); @@ -351,7 +372,7 @@ char *format_add_linestart(const char *text, const char *linestart) MSGLEVEL_ACTIONS | MSGLEVEL_NOTICES | MSGLEVEL_SNOTES | MSGLEVEL_CTCPS) /* return the "-!- " text at the start of the line */ -char *format_get_line_start(THEME_REC *theme, TEXT_DEST_REC *dest) +char *format_get_level_tag(THEME_REC *theme, TEXT_DEST_REC *dest) { int format; @@ -365,6 +386,81 @@ char *format_get_line_start(THEME_REC *theme, TEXT_DEST_REC *dest) return format_get_text_theme(theme, MODULE_NAME, dest, format); } +#define show_timestamp(level) \ + ((level & (MSGLEVEL_NEVER|MSGLEVEL_LASTLOG)) == 0 && \ + (timestamps || (msgs_timestamps && ((level) & MSGLEVEL_MSGS)))) + +static char *get_timestamp(THEME_REC *theme, TEXT_DEST_REC *dest) +{ + struct tm *tm; + time_t t; + int diff; + + if (!show_timestamp(dest->level)) + return NULL; + + t = time(NULL); + + if (timestamp_timeout > 0) { + diff = t - dest->window->last_timestamp; + dest->window->last_timestamp = t; + if (diff < timestamp_timeout) + return NULL; + } + + tm = localtime(&t); + return format_get_text_theme(theme, MODULE_NAME, dest, IRCTXT_TIMESTAMP, + tm->tm_year+1900, + tm->tm_mon+1, tm->tm_mday, + tm->tm_hour, tm->tm_min, tm->tm_sec); +} + +static char *get_server_tag(THEME_REC *theme, TEXT_DEST_REC *dest) +{ + SERVER_REC *server; + int count = 0; + + server = dest->server; + + if (server == NULL || (dest->window->active != NULL && + dest->window->active->server == server)) + return NULL; + + if (servers != NULL) { + count++; + if (servers->next != NULL) + count++; + } + if (count == 2 || lookup_servers != NULL) { + count++; + if (lookup_servers->next != NULL) + count++; + } + + return count < 2 ? NULL : + format_get_text_theme(theme, MODULE_NAME, dest, + IRCTXT_SERVERTAG, server->tag); +} + +char *format_get_line_start(THEME_REC *theme, TEXT_DEST_REC *dest) +{ + char *timestamp, *servertag; + char *linestart; + + timestamp = get_timestamp(theme, dest); + servertag = get_server_tag(theme, dest); + + if (timestamp == NULL && servertag == NULL) + return NULL; + + linestart = g_strconcat(timestamp != NULL ? timestamp : "", + servertag, NULL); + + g_free_not_null(timestamp); + g_free_not_null(servertag); + return linestart; +} + void format_newline(WINDOW_REC *window) { window->lines++; @@ -665,6 +761,9 @@ void format_send_to_gui(TEXT_DEST_REC *dest, const char *text) static void read_settings(void) { hide_text_style = settings_get_bool("hide_text_style"); + timestamps = settings_get_bool("timestamps"); + timestamp_timeout = settings_get_int("timestamp_timeout"); + msgs_timestamps = settings_get_bool("msgs_timestamps"); } void formats_init(void) diff --git a/src/fe-common/core/formats.h b/src/fe-common/core/formats.h index 6a042156..7038b5ae 100644 --- a/src/fe-common/core/formats.h +++ b/src/fe-common/core/formats.h @@ -38,6 +38,8 @@ typedef struct { int level; } TEXT_DEST_REC; +int format_find_tag(const char *module, const char *tag); + char *format_get_text(const char *module, WINDOW_REC *window, void *server, const char *target, int formatnum, ...); @@ -60,6 +62,9 @@ char *format_get_text_theme_charargs(THEME_REC *theme, const char *module, char *format_add_linestart(const char *text, const char *linestart); /* return the "-!- " text at the start of the line */ +char *format_get_level_tag(THEME_REC *theme, TEXT_DEST_REC *dest); + +/* return timestamp + server tag */ char *format_get_line_start(THEME_REC *theme, TEXT_DEST_REC *dest); diff --git a/src/fe-common/core/module-formats.c b/src/fe-common/core/module-formats.c index 7a93ebe0..f90a4dee 100644 --- a/src/fe-common/core/module-formats.c +++ b/src/fe-common/core/module-formats.c @@ -27,8 +27,8 @@ FORMAT_REC fecommon_core_formats[] = { /* ---- */ { NULL, "Windows", 0 }, - { "line_start", "{line_start} ", 0 }, - { "line_start_irssi", "{line_start} {hilight Irssi:} ", 0 }, + { "line_start", "{line_start}", 0 }, + { "line_start_irssi", "{line_start}{hilight Irssi:} ", 0 }, { "timestamp", "$[-2.0]3:$[-2.0]4 ", 6, { 1, 1, 1, 1, 1, 1 } }, { "servertag", "[$0] ", 1, { 0 } }, { "daychange", "Day changed to $[-2.0]{0} $3 $2", 4, { 1, 1, 1, 0 } }, diff --git a/src/fe-common/core/printtext.c b/src/fe-common/core/printtext.c index fe05298c..d01508e7 100644 --- a/src/fe-common/core/printtext.c +++ b/src/fe-common/core/printtext.c @@ -33,8 +33,6 @@ #include "printtext.h" static int beep_msg_level, beep_when_away; -static int timestamps, msgs_timestamps; -static int timestamp_timeout; static int signal_gui_print_text; static int signal_print_text_stripped; @@ -120,7 +118,7 @@ static void print_line(TEXT_DEST_REC *dest, const char *text) g_return_if_fail(dest != NULL); g_return_if_fail(text != NULL); - tmp = format_get_line_start(current_theme, dest); + tmp = format_get_level_tag(current_theme, dest); str = format_add_linestart(text, tmp); g_free_not_null(tmp); @@ -250,49 +248,6 @@ void printtext_window(WINDOW_REC *window, int level, const char *text, ...) g_free(str); } -#define show_timestamp(level) \ - ((level & (MSGLEVEL_NEVER|MSGLEVEL_LASTLOG)) == 0 && \ - (timestamps || (msgs_timestamps && ((level) & MSGLEVEL_MSGS)))) - -static char *get_timestamp(TEXT_DEST_REC *dest) -{ - struct tm *tm; - time_t t; - int diff; - - if (!show_timestamp(dest->level)) - return NULL; - - t = time(NULL); - - if (timestamp_timeout > 0) { - diff = t - dest->window->last_timestamp; - dest->window->last_timestamp = t; - if (diff < timestamp_timeout) - return NULL; - } - - tm = localtime(&t); - return format_get_text_theme(NULL, MODULE_NAME, dest, IRCTXT_TIMESTAMP, - tm->tm_year+1900, - tm->tm_mon+1, tm->tm_mday, - tm->tm_hour, tm->tm_min, tm->tm_sec); -} - -static char *get_server_tag(TEXT_DEST_REC *dest) -{ - SERVER_REC *server; - - server = dest->server; - - if (server == NULL || servers == NULL || servers->next == NULL || - (dest->window->active != NULL && dest->window->active->server == server)) - return NULL; - - return format_get_text_theme(NULL, MODULE_NAME, dest, - IRCTXT_SERVERTAG, server->tag); -} - static void msg_beep_check(SERVER_REC *server, int level) { if (level != 0 && (level & MSGLEVEL_NOHILIGHT) == 0 && @@ -302,30 +257,9 @@ static void msg_beep_check(SERVER_REC *server, int level) } } -static char *fix_line_start(TEXT_DEST_REC *dest, const char *text) -{ - char *timestamp, *servertag; - char *linestart, *str; - - timestamp = get_timestamp(dest); - servertag = get_server_tag(dest); - - if (timestamp == NULL && servertag == NULL) - return g_strdup(text); - - linestart = g_strconcat(timestamp != NULL ? timestamp : "", - servertag, NULL); - str = format_add_linestart(text, linestart); - g_free(linestart); - - g_free_not_null(timestamp); - g_free_not_null(servertag); - return str; -} - static void sig_print_text(TEXT_DEST_REC *dest, const char *text) { - char *str; + char *str, *tmp; g_return_if_fail(dest != NULL); g_return_if_fail(text != NULL); @@ -335,7 +269,12 @@ static void sig_print_text(TEXT_DEST_REC *dest, const char *text) dest->window->last_line = time(NULL); format_newline(dest->window); - str = fix_line_start(dest, text); + /* add timestamp/server tag here - if it's done in print_line() + it would be written to log files too */ + tmp = format_get_line_start(current_theme, dest); + str = format_add_linestart(text, tmp); + g_free(tmp); + format_send_to_gui(dest, str); g_free(str); @@ -372,9 +311,6 @@ static void sig_gui_dialog(const char *type, const char *text) static void read_settings(void) { - timestamps = settings_get_bool("timestamps"); - timestamp_timeout = settings_get_int("timestamp_timeout"); - msgs_timestamps = settings_get_bool("msgs_timestamps"); beep_msg_level = level2bits(settings_get_str("beep_on_msg")); beep_when_away = settings_get_bool("beep_when_away"); } diff --git a/src/fe-common/core/themes.c b/src/fe-common/core/themes.c index 24685c17..076e0489 100644 --- a/src/fe-common/core/themes.c +++ b/src/fe-common/core/themes.c @@ -459,25 +459,20 @@ static void theme_read_abstracts(CONFIG_REC *config, THEME_REC *theme) } static void theme_set_format(THEME_REC *theme, MODULE_THEME_REC *rec, - FORMAT_REC *formats, + const char *module, const char *key, const char *value) { - int n; + int num; - for (n = 0; formats[n].def != NULL; n++) { - if (formats[n].tag != NULL && - g_strcasecmp(formats[n].tag, key) == 0) { - rec->formats[n] = g_strdup(value); - rec->expanded_formats[n] = - theme_format_expand(theme, value); - break; - } + num = format_find_tag(module, key); + if (num != -1) { + rec->formats[num] = g_strdup(value); + rec->expanded_formats[num] = theme_format_expand(theme, value); } } static void theme_read_formats(THEME_REC *theme, const char *module, - CONFIG_REC *config, FORMAT_REC *formats, - MODULE_THEME_REC *rec) + CONFIG_REC *config, MODULE_THEME_REC *rec) { CONFIG_NODE *node; GSList *tmp; @@ -491,7 +486,7 @@ static void theme_read_formats(THEME_REC *theme, const char *module, node = tmp->data; if (node->key != NULL && node->value != NULL) { - theme_set_format(theme, rec, formats, + theme_set_format(theme, rec, module, node->key, node->value); } } @@ -510,7 +505,7 @@ static void theme_init_module(THEME_REC *theme, const char *module, rec = theme_module_create(theme, module); if (config != NULL) - theme_read_formats(theme, module, config, formats, rec); + theme_read_formats(theme, module, config, rec); /* expand the remaining formats */ for (n = 0; n < rec->count; n++) { |