diff --git a/docs/signals.txt b/docs/signals.txt index 6525ec24..81eaa527 100644 --- a/docs/signals.txt +++ b/docs/signals.txt @@ -224,7 +224,7 @@ FE common "gui window goto", int number (Can be used to determine when all "gui print text"s are sent (not required)) - "print text finished", WINDOW_REC + "gui print text finished", WINDOW_REC * Provides signals: diff --git a/src/fe-common/core/formats.c b/src/fe-common/core/formats.c index b933c068..a88a1f2b 100644 --- a/src/fe-common/core/formats.c +++ b/src/fe-common/core/formats.c @@ -59,11 +59,51 @@ int format_find_tag(const char *module, const char *tag) return -1; } -int format_expand_styles(GString *out, char format) +static void format_expand_code(const char **format, int *flags) { - char *p; + int set; - switch (format) { + if (flags == NULL) { + /* flags are being ignored - skip the code */ + while (**format != ']') + (*format)++; + return; + } + + set = TRUE; + (*format)++; + while (**format != ']') { + if (**format == '+') + set = TRUE; + else if (**format == '-') + set = FALSE; + else switch (**format) { + case 's': + case 'S': + *flags |= !set ? PRINT_FLAG_UNSET_LINE_START : + **format == 's' ? PRINT_FLAG_SET_LINE_START : + PRINT_FLAG_SET_LINE_START_IRSSI; + break; + case 't': + *flags |= set ? PRINT_FLAG_SET_TIMESTAMP : + PRINT_FLAG_UNSET_TIMESTAMP; + break; + case 'T': + *flags |= set ? PRINT_FLAG_SET_SERVERTAG : + PRINT_FLAG_UNSET_SERVERTAG; + break; + } + + (*format)++; + } +} + +int format_expand_styles(GString *out, const char **format, int *flags) +{ + char *p, fmt; + + fmt = **format; + switch (fmt) { case 'U': /* Underline on/off */ g_string_append_c(out, 4); @@ -103,9 +143,13 @@ int format_expand_styles(GString *out, char format) g_string_append_c(out, 4); g_string_append_c(out, FORMAT_STYLE_DEFAULTS); break; + case '[': + /* code */ + format_expand_code(format, flags); + break; default: /* check if it's a background color */ - p = strchr(format_backs, format); + p = strchr(format_backs, fmt); if (p != NULL) { g_string_append_c(out, 4); g_string_append_c(out, FORMAT_COLOR_NOCHANGE); @@ -114,8 +158,8 @@ int format_expand_styles(GString *out, char format) } /* check if it's a foreground color */ - if (format == 'p') format = 'm'; - p = strchr(format_fores, format); + if (fmt == 'p') fmt = 'm'; + p = strchr(format_fores, fmt); if (p != NULL) { g_string_append_c(out, 4); g_string_append_c(out, (char) ((int) (p-format_fores)+'0')); @@ -124,8 +168,8 @@ int format_expand_styles(GString *out, char format) } /* check if it's a bold foreground color */ - if (format == 'P') format = 'M'; - p = strchr(format_boldfores, format); + if (fmt == 'P') fmt = 'M'; + p = strchr(format_boldfores, fmt); if (p != NULL) { g_string_append_c(out, 4); g_string_append_c(out, (char) (8+(int) (p-format_boldfores)+'0')); @@ -208,14 +252,13 @@ void format_create_dest(TEXT_DEST_REC *dest, void *server, const char *target, int level, WINDOW_REC *window) { + memset(dest, 0, sizeof(TEXT_DEST_REC)); + dest->server = server; dest->target = target; dest->level = level; dest->window = window != NULL ? window : window_find_closest(server, target, level); - - dest->hilight_priority = 0; - dest->hilight_color = NULL; } /* Return length of text part in string (ie. without % codes) */ @@ -231,7 +274,8 @@ int format_get_length(const char *str) while (*str != '\0') { if (*str == '%' && str[1] != '\0') { str++; - if (*str != '%' && format_expand_styles(tmp, *str)) { + if (*str != '%' && + format_expand_styles(tmp, &str, NULL)) { str++; continue; } @@ -265,7 +309,8 @@ int format_real_length(const char *str, int len) while (*str != '\0' && len > 0) { if (*str == '%' && str[1] != '\0') { str++; - if (*str != '%' && format_expand_styles(tmp, *str)) { + if (*str != '%' && + format_expand_styles(tmp, &str, NULL)) { str++; continue; } @@ -285,7 +330,7 @@ int format_real_length(const char *str, int len) return (int) (str-start); } -char *format_string_expand(const char *text) +char *format_string_expand(const char *text, int *flags) { GString *out; char code, *ret; @@ -294,11 +339,12 @@ char *format_string_expand(const char *text) out = g_string_new(NULL); + if (flags != NULL) *flags = 0; code = 0; while (*text != '\0') { if (code == '%') { /* color code */ - if (!format_expand_styles(out, *text)) { + if (!format_expand_styles(out, &text, flags)) { g_string_append_c(out, '%'); g_string_append_c(out, '%'); g_string_append_c(out, *text); @@ -332,7 +378,7 @@ static char *format_get_text_args(TEXT_DEST_REC *dest, while (*text != '\0') { if (code == '%') { /* color code */ - if (!format_expand_styles(out, *text)) { + if (!format_expand_styles(out, &text, &dest->flags)) { g_string_append_c(out, '%'); g_string_append_c(out, '%'); g_string_append_c(out, *text); @@ -487,19 +533,29 @@ char *format_get_level_tag(THEME_REC *theme, TEXT_DEST_REC *dest) { int format; - if (dest->level & LINE_START_IRSSI_LEVEL) - format = TXT_LINE_START_IRSSI; - else if ((dest->level & NOT_LINE_START_LEVEL) == 0) - format = TXT_LINE_START; - else + /* check for flags if we want to override defaults */ + if (dest->flags & PRINT_FLAG_UNSET_LINE_START) return NULL; + if (dest->flags & PRINT_FLAG_SET_LINE_START) + format = TXT_LINE_START; + else if (dest->flags & PRINT_FLAG_SET_LINE_START_IRSSI) + format = TXT_LINE_START_IRSSI; + else { + /* use defaults */ + if (dest->level & LINE_START_IRSSI_LEVEL) + format = TXT_LINE_START_IRSSI; + else if ((dest->level & NOT_LINE_START_LEVEL) == 0) + format = TXT_LINE_START; + else + return NULL; + } + 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)))) + (timestamps || (msgs_timestamps && ((level) & MSGLEVEL_MSGS))) static char *get_timestamp(THEME_REC *theme, TEXT_DEST_REC *dest, time_t t) { @@ -509,6 +565,15 @@ static char *get_timestamp(THEME_REC *theme, TEXT_DEST_REC *dest, time_t t) if (!show_timestamp(dest->level)) return NULL; + /* check for flags if we want to override defaults */ + if (dest->flags & PRINT_FLAG_UNSET_TIMESTAMP) + return NULL; + + if ((dest->flags & PRINT_FLAG_SET_TIMESTAMP) == 0 && + (dest->level & (MSGLEVEL_NEVER|MSGLEVEL_LASTLOG)) != 0) + return NULL; + + if (timestamp_timeout > 0) { diff = t - dest->window->last_timestamp; dest->window->last_timestamp = t; @@ -530,25 +595,35 @@ static char *get_server_tag(THEME_REC *theme, TEXT_DEST_REC *dest) server = dest->server; - if (server == NULL || hide_server_tags || - (dest->window->active != NULL && - dest->window->active->server == server)) + if (server == NULL || hide_server_tags) + return NULL; + + /* check for flags if we want to override defaults */ + if (dest->flags & PRINT_FLAG_UNSET_SERVERTAG) return NULL; - if (servers != NULL) { - count++; - if (servers->next != NULL) + if ((dest->flags & PRINT_FLAG_SET_SERVERTAG) == 0) { + if (dest->window->active != NULL && + dest->window->active->server == server) + return NULL; + + if (servers != NULL) { count++; - } - if (count < 2 && lookup_servers != NULL) { - count++; - if (lookup_servers->next != NULL) + if (servers->next != NULL) + count++; + } + if (count < 2 && lookup_servers != NULL) { count++; + if (lookup_servers->next != NULL) + count++; + } + + if (count < 2) + return NULL; } - return count < 2 ? NULL : - format_get_text_theme(theme, MODULE_NAME, dest, - TXT_SERVERTAG, server->tag); + return format_get_text_theme(theme, MODULE_NAME, dest, + TXT_SERVERTAG, server->tag); } char *format_get_line_start(THEME_REC *theme, TEXT_DEST_REC *dest, time_t t) @@ -576,7 +651,7 @@ void format_newline(WINDOW_REC *window) signal_emit_id(signal_gui_print_text, 6, window, GINT_TO_POINTER(-1), GINT_TO_POINTER(-1), - GINT_TO_POINTER(PRINTFLAG_NEWLINE), + GINT_TO_POINTER(GUI_PRINT_FLAG_NEWLINE), "", GINT_TO_POINTER(-1)); } @@ -613,19 +688,19 @@ static char *get_ansi_color(THEME_REC *theme, char *str, /* reset colors back to default */ fg = theme->default_color; bg = -1; - flags &= ~PRINTFLAG_INDENT; + flags &= ~GUI_PRINT_FLAG_INDENT; break; case 1: /* hilight */ - flags |= PRINTFLAG_BOLD; + flags |= GUI_PRINT_FLAG_BOLD; break; case 5: /* blink */ - flags |= PRINTFLAG_BLINK; + flags |= GUI_PRINT_FLAG_BLINK; break; case 7: /* reverse */ - flags |= PRINTFLAG_REVERSE; + flags |= GUI_PRINT_FLAG_REVERSE; break; default: if (num >= 30 && num <= 37) @@ -817,7 +892,7 @@ void format_send_to_gui(TEXT_DEST_REC *dest, const char *text) GINT_TO_POINTER(bgcolor), GINT_TO_POINTER(flags), str, dest->level); - flags &= ~PRINTFLAG_INDENT; + flags &= ~GUI_PRINT_FLAG_INDENT; } if (type == '\n') @@ -831,7 +906,7 @@ void format_send_to_gui(TEXT_DEST_REC *dest, const char *text) case 2: /* bold */ if (!hide_text_style) - flags ^= PRINTFLAG_BOLD; + flags ^= GUI_PRINT_FLAG_BOLD; break; case 3: /* MIRC color */ @@ -839,40 +914,40 @@ void format_send_to_gui(TEXT_DEST_REC *dest, const char *text) hide_text_style ? NULL : &fgcolor, hide_text_style ? NULL : &bgcolor); if (!hide_text_style) - flags |= PRINTFLAG_MIRC_COLOR; + flags |= GUI_PRINT_FLAG_MIRC_COLOR; break; case 4: /* user specific colors */ - flags &= ~PRINTFLAG_MIRC_COLOR; + flags &= ~GUI_PRINT_FLAG_MIRC_COLOR; switch (*ptr) { case FORMAT_STYLE_BLINK: - flags ^= PRINTFLAG_BLINK; + flags ^= GUI_PRINT_FLAG_BLINK; break; case FORMAT_STYLE_UNDERLINE: - flags ^= PRINTFLAG_UNDERLINE; + flags ^= GUI_PRINT_FLAG_UNDERLINE; break; case FORMAT_STYLE_BOLD: - flags ^= PRINTFLAG_BOLD; + flags ^= GUI_PRINT_FLAG_BOLD; break; case FORMAT_STYLE_REVERSE: - flags ^= PRINTFLAG_REVERSE; + flags ^= GUI_PRINT_FLAG_REVERSE; break; case FORMAT_STYLE_INDENT: - flags |= PRINTFLAG_INDENT; + flags |= GUI_PRINT_FLAG_INDENT; break; case FORMAT_STYLE_DEFAULTS: fgcolor = bgcolor = -1; - flags &= PRINTFLAG_INDENT; + flags &= GUI_PRINT_FLAG_INDENT; break; default: if (*ptr != FORMAT_COLOR_NOCHANGE) { fgcolor = (unsigned char) *ptr-'0'; if (fgcolor <= 7) - flags &= ~PRINTFLAG_BOLD; + flags &= ~GUI_PRINT_FLAG_BOLD; else { /* bold */ if (fgcolor != 8) fgcolor -= 8; - flags |= PRINTFLAG_BOLD; + flags |= GUI_PRINT_FLAG_BOLD; } } ptr++; @@ -884,22 +959,22 @@ void format_send_to_gui(TEXT_DEST_REC *dest, const char *text) case 6: /* blink */ if (!hide_text_style) - flags ^= PRINTFLAG_BLINK; + flags ^= GUI_PRINT_FLAG_BLINK; break; case 15: /* remove all styling */ fgcolor = bgcolor = -1; - flags &= PRINTFLAG_INDENT; + flags &= GUI_PRINT_FLAG_INDENT; break; case 22: /* reverse */ if (!hide_text_style) - flags ^= PRINTFLAG_REVERSE; + flags ^= GUI_PRINT_FLAG_REVERSE; break; case 31: /* underline */ if (!hide_text_style) - flags ^= PRINTFLAG_UNDERLINE; + flags ^= GUI_PRINT_FLAG_UNDERLINE; break; case 27: /* ansi color code */ diff --git a/src/fe-common/core/formats.h b/src/fe-common/core/formats.h index 86c53e69..4678b6f4 100644 --- a/src/fe-common/core/formats.h +++ b/src/fe-common/core/formats.h @@ -4,13 +4,13 @@ #include "themes.h" #include "fe-windows.h" -#define PRINTFLAG_BOLD 0x01 -#define PRINTFLAG_REVERSE 0x02 -#define PRINTFLAG_UNDERLINE 0x04 -#define PRINTFLAG_BLINK 0x08 -#define PRINTFLAG_MIRC_COLOR 0x10 -#define PRINTFLAG_INDENT 0x20 -#define PRINTFLAG_NEWLINE 0x40 +#define GUI_PRINT_FLAG_BOLD 0x01 +#define GUI_PRINT_FLAG_REVERSE 0x02 +#define GUI_PRINT_FLAG_UNDERLINE 0x04 +#define GUI_PRINT_FLAG_BLINK 0x08 +#define GUI_PRINT_FLAG_MIRC_COLOR 0x10 +#define GUI_PRINT_FLAG_INDENT 0x20 +#define GUI_PRINT_FLAG_NEWLINE 0x40 #define MAX_FORMAT_PARAMS 10 #define DEFAULT_FORMAT_ARGLIST_SIZE 200 @@ -30,6 +30,16 @@ struct _FORMAT_REC { int paramtypes[MAX_FORMAT_PARAMS]; }; +#define PRINT_FLAG_SET_LINE_START 0x0001 +#define PRINT_FLAG_SET_LINE_START_IRSSI 0x0002 +#define PRINT_FLAG_UNSET_LINE_START 0x0003 + +#define PRINT_FLAG_SET_TIMESTAMP 0x0004 +#define PRINT_FLAG_UNSET_TIMESTAMP 0x0008 + +#define PRINT_FLAG_SET_SERVERTAG 0x0010 +#define PRINT_FLAG_UNSET_SERVERTAG 0x0020 + typedef struct { WINDOW_REC *window; SERVER_REC *server; @@ -38,6 +48,7 @@ typedef struct { int hilight_priority; char *hilight_color; + int flags; } TEXT_DEST_REC; int format_find_tag(const char *module, const char *tag); @@ -49,7 +60,7 @@ int format_get_length(const char *str); handles %codes. */ int format_real_length(const char *str, int len); -char *format_string_expand(const char *text); +char *format_string_expand(const char *text, int *flags); char *format_get_text(const char *module, WINDOW_REC *window, void *server, const char *target, @@ -107,7 +118,7 @@ void format_send_to_gui(TEXT_DEST_REC *dest, const char *text); #define FORMAT_STYLE_REVERSE (0x04 + FORMAT_STYLE_SPECIAL) #define FORMAT_STYLE_INDENT (0x05 + FORMAT_STYLE_SPECIAL) #define FORMAT_STYLE_DEFAULTS (0x06 + FORMAT_STYLE_SPECIAL) -int format_expand_styles(GString *out, char format); +int format_expand_styles(GString *out, const char **format, int *flags); void formats_init(void); void formats_deinit(void); diff --git a/src/fe-common/core/hilight-text.c b/src/fe-common/core/hilight-text.c index 0a16c5b2..25dbcd67 100644 --- a/src/fe-common/core/hilight-text.c +++ b/src/fe-common/core/hilight-text.c @@ -263,7 +263,7 @@ static char *hilight_get_color(HILIGHT_REC *rec) color = rec->color != NULL ? rec->color : settings_get_str("hilight_color"); - return format_string_expand(color); + return format_string_expand(color, NULL); } static void hilight_update_text_dest(TEXT_DEST_REC *dest, HILIGHT_REC *rec) diff --git a/src/fe-common/core/printtext.c b/src/fe-common/core/printtext.c index 70e88be3..6c35c326 100644 --- a/src/fe-common/core/printtext.c +++ b/src/fe-common/core/printtext.c @@ -34,11 +34,10 @@ static int beep_msg_level, beep_when_away, beep_when_window_active; -static int signal_gui_print_text; -static int signal_print_text; -static int signal_print_text_finished; -static int signal_print_format; +static int signal_gui_print_text, signal_gui_print_text_finished; static int signal_print_starting; +static int signal_print_text; +static int signal_print_format; static int sending_print_starting; @@ -235,7 +234,7 @@ static char *printtext_get_args(TEXT_DEST_REC *dest, const char *str, break; } default: - if (!format_expand_styles(out, *str)) { + if (!format_expand_styles(out, &str, &dest->flags)) { g_string_append_c(out, '%'); g_string_append_c(out, *str); } @@ -248,7 +247,7 @@ static char *printtext_get_args(TEXT_DEST_REC *dest, const char *str, return ret; } -static char *printtext_expand_formats(const char *str) +static char *printtext_expand_formats(const char *str, int *flags) { GString *out; char *ret; @@ -263,7 +262,7 @@ static char *printtext_expand_formats(const char *str) if (*++str == '\0') break; - if (!format_expand_styles(out, *str)) { + if (!format_expand_styles(out, &str, flags)) { g_string_append_c(out, '%'); g_string_append_c(out, *str); } @@ -320,7 +319,7 @@ void printtext_string(void *server, const char *target, int level, const char *t sending_print_starting = FALSE; } - str = printtext_expand_formats(text); + str = printtext_expand_formats(text, &dest.flags); print_line(&dest, str); g_free(str); } @@ -349,7 +348,7 @@ void printtext_gui(const char *text) memset(&dest, 0, sizeof(dest)); - str = printtext_expand_formats(text); + str = printtext_expand_formats(text, &dest.flags); format_send_to_gui(&dest, str); g_free(str); } @@ -385,7 +384,7 @@ static void sig_print_text(TEXT_DEST_REC *dest, const char *text) format_send_to_gui(dest, str); g_free(str); - signal_emit_id(signal_print_text_finished, 1, dest->window); + signal_emit_id(signal_gui_print_text_finished, 1, dest->window); } static void sig_print_text_free(TEXT_DEST_REC *dest, const char *text) @@ -432,10 +431,10 @@ void printtext_init(void) { sending_print_starting = FALSE; signal_gui_print_text = signal_get_uniq_id("gui print text"); - signal_print_text = signal_get_uniq_id("print text"); - signal_print_text_finished = signal_get_uniq_id("print text finished"); - signal_print_format = signal_get_uniq_id("print format"); + signal_gui_print_text_finished = signal_get_uniq_id("gui print text finished"); signal_print_starting = signal_get_uniq_id("print starting"); + signal_print_text = signal_get_uniq_id("print text"); + signal_print_format = signal_get_uniq_id("print format"); read_settings(); signal_add("print text", (SIGNAL_FUNC) sig_print_text); diff --git a/src/fe-text/gui-printtext.c b/src/fe-text/gui-printtext.c index fd82a697..330eb66c 100644 --- a/src/fe-text/gui-printtext.c +++ b/src/fe-text/gui-printtext.c @@ -72,7 +72,7 @@ static void remove_old_lines(TEXT_BUFFER_VIEW_REC *view) static void get_colors(int flags, int *fg, int *bg) { - if (flags & PRINTFLAG_MIRC_COLOR) { + if (flags & GUI_PRINT_FLAG_MIRC_COLOR) { /* mirc colors - real range is 0..15, but after 16 colors wrap to 0, 1, ... */ *bg = *bg < 0 ? 0 : mirc_colors[*bg % 16]; @@ -88,19 +88,19 @@ static void get_colors(int flags, int *fg, int *bg) current_theme->default_real_color; } - if (flags & PRINTFLAG_REVERSE) { + if (flags & GUI_PRINT_FLAG_REVERSE) { int tmp; tmp = *fg; *fg = *bg; *bg = tmp; } if (*fg == 8) *fg |= ATTR_COLOR8; - if (flags & PRINTFLAG_BOLD) { + if (flags & GUI_PRINT_FLAG_BOLD) { if (*fg == 0) *fg = current_theme->default_real_color; *fg |= 8; } - if (flags & PRINTFLAG_UNDERLINE) *fg |= ATTR_UNDERLINE; - if (flags & PRINTFLAG_BLINK) *bg |= 0x08; + if (flags & GUI_PRINT_FLAG_UNDERLINE) *fg |= ATTR_UNDERLINE; + if (flags & GUI_PRINT_FLAG_BLINK) *bg |= 0x08; } static void line_add_colors(TEXT_BUFFER_REC *buffer, LINE_REC **line, @@ -120,7 +120,7 @@ static void line_add_colors(TEXT_BUFFER_REC *buffer, LINE_REC **line, data[pos++] = color == 0 ? LINE_CMD_COLOR0 : color; } - if ((flags & PRINTFLAG_UNDERLINE) != (last_flags & PRINTFLAG_UNDERLINE)) { + if ((flags & GUI_PRINT_FLAG_UNDERLINE) != (last_flags & GUI_PRINT_FLAG_UNDERLINE)) { data[pos++] = 0; data[pos++] = LINE_CMD_UNDERLINE; } @@ -132,7 +132,7 @@ static void line_add_colors(TEXT_BUFFER_REC *buffer, LINE_REC **line, data[pos++] = 0; data[pos++] = LINE_CMD_BLINK; } - if (flags & PRINTFLAG_INDENT) { + if (flags & GUI_PRINT_FLAG_INDENT) { data[pos++] = 0; data[pos++] = LINE_CMD_INDENT; } @@ -182,14 +182,14 @@ static void sig_gui_print_text(WINDOW_REC *window, void *fgcolor, insert_after = WINDOW_GUI(window)->use_insert_after ? WINDOW_GUI(window)->insert_after : view->buffer->cur_line; - if (flags & PRINTFLAG_NEWLINE) + if (flags & GUI_PRINT_FLAG_NEWLINE) view_add_eol(view, &insert_after); line_add_colors(view->buffer, &insert_after, fg, bg, flags); textbuffer_insert(view->buffer, insert_after, str, strlen(str), &lineinfo); } -static void sig_printtext_finished(WINDOW_REC *window) +static void sig_gui_printtext_finished(WINDOW_REC *window) { TEXT_BUFFER_VIEW_REC *view; LINE_REC *insert_after; @@ -258,7 +258,7 @@ void gui_printtext_init(void) settings_add_bool("history", "scrollback_save_formats", FALSE); signal_add("gui print text", (SIGNAL_FUNC) sig_gui_print_text); - signal_add("print text finished", (SIGNAL_FUNC) sig_printtext_finished); + signal_add("gui print text finished", (SIGNAL_FUNC) sig_gui_printtext_finished); signal_add("print format", (SIGNAL_FUNC) sig_print_format); signal_add("setup changed", (SIGNAL_FUNC) read_settings); @@ -270,7 +270,7 @@ void gui_printtext_deinit(void) g_string_free(format, TRUE); signal_remove("gui print text", (SIGNAL_FUNC) sig_gui_print_text); - signal_remove("print text finished", (SIGNAL_FUNC) sig_printtext_finished); + signal_remove("print text finished", (SIGNAL_FUNC) sig_gui_printtext_finished); signal_remove("print format", (SIGNAL_FUNC) sig_print_format); signal_remove("setup changed", (SIGNAL_FUNC) read_settings); }