updates.
[silc.git] / apps / irssi / src / fe-common / core / formats.c
index 8991164a8597c9177f2b2af11defa112fbabf078..983a849e04304c3f7e09135976ec5c1a06d35676 100644 (file)
@@ -38,7 +38,7 @@ static const char *format_fores = "kbgcrmyw";
 static const char *format_boldfores = "KBGCRMYW";
 
 static int signal_gui_print_text;
-static int hide_text_style, hide_server_tags, hide_mirc_colors;
+static int hide_text_style, hide_server_tags, hide_colors;
 
 static int timestamp_level;
 static int timestamp_timeout;
@@ -169,6 +169,10 @@ int format_expand_styles(GString *out, const char **format, int *flags)
                g_string_append_c(out, 4);
                g_string_append_c(out, FORMAT_STYLE_CLRTOEOL);
                break;
+       case '#':
+               g_string_append_c(out, 4);
+               g_string_append_c(out, FORMAT_STYLE_MONOSPACE);
+               break;
        case '[':
                /* code */
                 format_expand_code(format, out, flags);
@@ -223,10 +227,8 @@ void format_read_arglist(va_list va, FORMAT_REC *format,
                switch (format->paramtypes[num]) {
                case FORMAT_STRING:
                        arglist[num] = (char *) va_arg(va, char *);
-                       if (arglist[num] == NULL) {
-                               g_warning("format_read_arglist() : parameter %d is NULL", num);
+                       if (arglist[num] == NULL)
                                arglist[num] = "";
-                       }
                        break;
                case FORMAT_INT: {
                        int d = (int) va_arg(va, int);
@@ -549,6 +551,31 @@ char *format_add_linestart(const char *text, const char *linestart)
         return ret;
 }
 
+char *format_add_lineend(const char *text, const char *linestart)
+{
+       GString *str;
+       char *ret;
+
+       if (linestart == NULL)
+               return g_strdup(text);
+
+       if (strchr(text, '\n') == NULL)
+               return g_strconcat(text, linestart, NULL);
+
+       str = g_string_new(NULL);
+       while (*text != '\0') {
+               if (*text == '\n')
+                       g_string_append(str, linestart);
+               g_string_append_c(str, *text);
+               text++;
+       }
+       g_string_append(str, linestart);
+
+       ret = str->str;
+       g_string_free(str, FALSE);
+        return ret;
+}
+
 #define LINE_START_IRSSI_LEVEL \
        (MSGLEVEL_CLIENTERROR | MSGLEVEL_CLIENTNOTICE)
 
@@ -678,7 +705,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(GUI_PRINT_FLAG_NEWLINE),
-                      "", GINT_TO_POINTER(-1));
+                      "", NULL);
 }
 
 /* parse ANSI color string */
@@ -729,8 +756,10 @@ static const char *get_ansi_color(THEME_REC *theme, const char *str,
                        flags |= GUI_PRINT_FLAG_REVERSE;
                        break;
                default:
-                       if (num >= 30 && num <= 37)
+                       if (num >= 30 && num <= 37) {
+                               if (fg == -1) fg = 0;
                                fg = (fg & 0xf8) | ansitab[num-30];
+                       }
                        if (num >= 40 && num <= 47) {
                                if (bg == -1) bg = 0;
                                bg = (bg & 0xf8) | ansitab[num-40];
@@ -875,8 +904,10 @@ char *strip_codes(const char *input)
                         }
                }
 
-               if (*p == 27 && p[1] != '\0')
+               if (*p == 27 && p[1] != '\0') {
+                        p++;
                        p = get_ansi_color(current_theme, p, NULL, NULL, NULL);
+               }
 
                 if (!IS_COLOR_CODE(*p))
                         *out++ = *p;   
@@ -889,13 +920,17 @@ char *strip_codes(const char *input)
 /* send a fully parsed text string for GUI to print */
 void format_send_to_gui(TEXT_DEST_REC *dest, const char *text)
 {
+        THEME_REC *theme;
        char *dup, *str, *ptr, type;
        int fgcolor, bgcolor;
        int flags;
 
+        theme = dest->window != NULL && dest->window->theme != NULL ?
+               dest->window->theme : current_theme;
+
        dup = str = g_strdup(text);
 
-       flags = 0; fgcolor = -1; bgcolor = -1;
+       flags = 0; fgcolor = theme->default_color; bgcolor = -1;
        while (*str != '\0') {
                 type = '\0';
                for (ptr = str; *ptr != '\0'; ptr++) {
@@ -923,7 +958,7 @@ void format_send_to_gui(TEXT_DEST_REC *dest, const char *text)
                                       GINT_TO_POINTER(fgcolor),
                                       GINT_TO_POINTER(bgcolor),
                                       GINT_TO_POINTER(flags), str,
-                                      dest->level);
+                                      dest);
                        flags &= ~(GUI_PRINT_FLAG_INDENT|GUI_PRINT_FLAG_CLRTOEOL);
                }
 
@@ -943,9 +978,9 @@ void format_send_to_gui(TEXT_DEST_REC *dest, const char *text)
                case 3:
                        /* MIRC color */
                        get_mirc_color((const char **) &ptr,
-                                       hide_mirc_colors || hide_text_style ? NULL : &fgcolor,
-                                       hide_mirc_colors || hide_text_style ? NULL : &bgcolor);
-                       if (!hide_mirc_colors && !hide_text_style)
+                                       hide_colors ? NULL : &fgcolor,
+                                       hide_colors ? NULL : &bgcolor);
+                       if (!hide_colors)
                                flags |= GUI_PRINT_FLAG_MIRC_COLOR;
                        break;
                case 4:
@@ -964,6 +999,9 @@ void format_send_to_gui(TEXT_DEST_REC *dest, const char *text)
                        case FORMAT_STYLE_REVERSE:
                                flags ^= GUI_PRINT_FLAG_REVERSE;
                                break;
+                       case FORMAT_STYLE_MONOSPACE:
+                               flags ^= GUI_PRINT_FLAG_MONOSPACE;
+                               break;
                        case FORMAT_STYLE_INDENT:
                                flags |= GUI_PRINT_FLAG_INDENT;
                                break;
@@ -976,12 +1014,13 @@ void format_send_to_gui(TEXT_DEST_REC *dest, const char *text)
                                signal_emit_id(signal_gui_print_text, 6,
                                               dest->window, NULL, NULL,
                                               GINT_TO_POINTER(GUI_PRINT_FLAG_INDENT_FUNC),
-                                              str, start, dest->level);
+                                              str, start, dest);
                                break;
                        }
                        case FORMAT_STYLE_DEFAULTS:
-                               fgcolor = bgcolor = -1;
-                               flags &= GUI_PRINT_FLAG_INDENT;
+                                fgcolor = theme->default_color;
+                               bgcolor = -1;
+                               flags &= GUI_PRINT_FLAG_INDENT|GUI_PRINT_FLAG_MONOSPACE;
                                break;
                        case FORMAT_STYLE_CLRTOEOL:
                                 break;
@@ -1020,8 +1059,9 @@ void format_send_to_gui(TEXT_DEST_REC *dest, const char *text)
                        break;
                case 15:
                        /* remove all styling */
-                       fgcolor = bgcolor = -1;
-                       flags &= GUI_PRINT_FLAG_INDENT;
+                       fgcolor = theme->default_color;
+                       bgcolor = -1;
+                       flags &= GUI_PRINT_FLAG_INDENT|GUI_PRINT_FLAG_MONOSPACE;
                        break;
                case 22:
                        /* reverse */
@@ -1036,12 +1076,10 @@ void format_send_to_gui(TEXT_DEST_REC *dest, const char *text)
                case 27:
                        /* ansi color code */
                        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);
+                               get_ansi_color(theme, ptr,
+                                              hide_colors ? NULL : &fgcolor,
+                                              hide_colors ? NULL : &bgcolor,
+                                              hide_colors ? NULL : &flags);
                        break;
                }
 
@@ -1062,7 +1100,7 @@ static void read_settings(void)
 
        hide_server_tags = settings_get_bool("hide_server_tags");
        hide_text_style = settings_get_bool("hide_text_style");
-       hide_mirc_colors = settings_get_bool("hide_mirc_colors");
+       hide_colors = hide_text_style || settings_get_bool("hide_colors");
 }
 
 void formats_init(void)