diff options
-rw-r--r-- | src/gui/curses/gui-curses-color.c | 50 | ||||
-rw-r--r-- | src/gui/curses/gui-curses-window.c | 6 | ||||
-rw-r--r-- | src/gui/curses/gui-curses.h | 3 | ||||
-rw-r--r-- | src/gui/curses/headless/ncurses-fake.h | 8 | ||||
-rw-r--r-- | src/gui/gui-color.c | 479 | ||||
-rw-r--r-- | src/gui/gui-color.h | 3 | ||||
-rw-r--r-- | tests/unit/gui/test-gui-color.cpp | 140 |
7 files changed, 668 insertions, 21 deletions
diff --git a/src/gui/curses/gui-curses-color.c b/src/gui/curses/gui-curses-color.c index bc6118d95..fac3f6681 100644 --- a/src/gui/curses/gui-curses-color.c +++ b/src/gui/curses/gui-curses-color.c @@ -115,7 +115,7 @@ int gui_color_timer = 0; /* timer in seconds */ /* * Searches for a color by name. * - * Return index of color in WeeChat colors table, -1 if not found. + * Returns index of color in WeeChat colors table, -1 if not found. */ int @@ -134,11 +134,32 @@ gui_color_search (const char *color_name) } /* + * Searches for a color by index. + * + * Returns name of color in WeeChat colors table, NULL if not found. + */ + +const char * +gui_color_search_index (int index) +{ + int i; + + for (i = 0; gui_weechat_colors[i].string; i++) + { + if (i == index) + return gui_weechat_colors[i].string; + } + + /* color not found */ + return NULL; +} + +/* * Get Curses attributes corresponding to extended attributes flags in a color. */ int -gui_color_get_extended_attrs (int color) +gui_color_get_gui_attrs (int color) { int attributes; @@ -157,6 +178,29 @@ gui_color_get_extended_attrs (int color) } /* + * Get extended flags corresponding to Curses attributes in a color. + */ + +int +gui_color_get_extended_flags (int attrs) +{ + int flags; + + flags = 0; + + if (attrs & A_BOLD) + flags |= GUI_COLOR_EXTENDED_BOLD_FLAG; + if (attrs & A_REVERSE) + flags |= GUI_COLOR_EXTENDED_REVERSE_FLAG; + if (attrs & A_ITALIC) + flags |= GUI_COLOR_EXTENDED_ITALIC_FLAG; + if (attrs & A_UNDERLINE) + flags |= GUI_COLOR_EXTENDED_UNDERLINE_FLAG; + + return flags; +} + +/* * Assigns a WeeChat color (read from configuration). * * Returns: @@ -546,7 +590,7 @@ gui_color_build (int number, int foreground, int background) gui_color[number]->foreground = gui_weechat_colors[foreground & GUI_COLOR_EXTENDED_MASK].foreground; gui_color[number]->attributes = gui_weechat_colors[foreground & GUI_COLOR_EXTENDED_MASK].attributes; } - gui_color[number]->attributes |= gui_color_get_extended_attrs (foreground); + gui_color[number]->attributes |= gui_color_get_gui_attrs (foreground); /* set background */ if (background & GUI_COLOR_EXTENDED_FLAG) diff --git a/src/gui/curses/gui-curses-window.c b/src/gui/curses/gui-curses-window.c index d0c098957..57b779ca6 100644 --- a/src/gui/curses/gui-curses-window.c +++ b/src/gui/curses/gui-curses-window.c @@ -181,7 +181,7 @@ gui_window_clear (WINDOW *window, int fg, int bg) if (!gui_init_ok) return; - attrs = gui_color_get_extended_attrs (fg); + attrs = gui_color_get_gui_attrs (fg); if ((fg > 0) && (fg & GUI_COLOR_EXTENDED_FLAG)) fg &= GUI_COLOR_EXTENDED_MASK; @@ -420,7 +420,7 @@ gui_window_set_custom_color_fg (WINDOW *window, int fg) { if (!(fg & GUI_COLOR_EXTENDED_KEEPATTR_FLAG)) gui_window_remove_color_style (window, A_ALL_ATTR); - attributes = gui_color_get_extended_attrs (fg) | + attributes = gui_color_get_gui_attrs (fg) | gui_weechat_colors[fg & GUI_COLOR_EXTENDED_MASK].attributes; gui_window_set_color_style (window, attributes); fg = gui_weechat_colors[fg & GUI_COLOR_EXTENDED_MASK].foreground; @@ -505,7 +505,7 @@ gui_window_set_custom_color_fg_bg (WINDOW *window, int fg, int bg, { if (reset_attributes && !(fg & GUI_COLOR_EXTENDED_KEEPATTR_FLAG)) gui_window_remove_color_style (window, A_ALL_ATTR); - attributes = gui_color_get_extended_attrs (fg) | + attributes = gui_color_get_gui_attrs (fg) | gui_weechat_colors[fg & GUI_COLOR_EXTENDED_MASK].attributes; gui_window_set_color_style (window, attributes); fg = gui_weechat_colors[fg & GUI_COLOR_EXTENDED_MASK].foreground; diff --git a/src/gui/curses/gui-curses.h b/src/gui/curses/gui-curses.h index de2ac3672..5f938c7f3 100644 --- a/src/gui/curses/gui-curses.h +++ b/src/gui/curses/gui-curses.h @@ -91,7 +91,8 @@ extern void gui_main_init (); extern void gui_main_loop (); /* color functions */ -extern int gui_color_get_extended_attrs (int color); +extern int gui_color_get_gui_attrs (int color); +extern int gui_color_get_extended_flags (int attrs); extern int gui_color_get_pair (int fg, int bg); extern int gui_color_weechat_get_pair (int weechat_color); extern void gui_color_alloc (); diff --git a/src/gui/curses/headless/ncurses-fake.h b/src/gui/curses/headless/ncurses-fake.h index 30b2ee319..4b79f9be4 100644 --- a/src/gui/curses/headless/ncurses-fake.h +++ b/src/gui/curses/headless/ncurses-fake.h @@ -45,10 +45,10 @@ #define COLOR_WHITE 7 #define A_NORMAL 0 -#define A_BOLD 0 -#define A_UNDERLINE 0 -#define A_REVERSE 0 -#define A_ITALIC 0 +#define A_BOLD (1 << (13 + 8)) +#define A_UNDERLINE (1 << (9 + 8)) +#define A_REVERSE (1 << (10 + 8)) +#define A_ITALIC (1 << (23 + 8)) #define ACS_HLINE '-' #define ACS_VLINE '|' diff --git a/src/gui/gui-color.c b/src/gui/gui-color.c index cbebc317a..bf5538897 100644 --- a/src/gui/gui-color.c +++ b/src/gui/gui-color.c @@ -674,25 +674,30 @@ gui_color_decode (const char *string, const char *replacement) { if (ptr_string[1] == GUI_COLOR_EXTENDED_CHAR) { - if (ptr_string[2] && ptr_string[3] - && ptr_string[4] && ptr_string[5] - && ptr_string[6]) + ptr_string += 2; + if (ptr_string[0] && ptr_string[1] + && ptr_string[2] && ptr_string[3] + && ptr_string[4]) { - ptr_string += 7; + ptr_string += 5; } } else { - if (ptr_string[1] && ptr_string[2]) - ptr_string += 3; + ptr_string++; + if (ptr_string[0] && ptr_string[1]) + ptr_string += 2; } } break; case GUI_COLOR_EXTENDED_CHAR: - if ((isdigit (ptr_string[1])) && (isdigit (ptr_string[2])) - && (isdigit (ptr_string[3])) && (isdigit (ptr_string[4])) - && (isdigit (ptr_string[5]))) - ptr_string += 6; + ptr_string++; + if ((isdigit (ptr_string[0])) && (isdigit (ptr_string[1])) + && (isdigit (ptr_string[2])) && (isdigit (ptr_string[3])) + && (isdigit (ptr_string[4]))) + { + ptr_string += 5; + } break; case GUI_COLOR_EMPHASIS_CHAR: ptr_string++; @@ -1005,6 +1010,460 @@ gui_color_decode_ansi (const char *string, int keep_colors) } /* + * Adds an ANSI color code with a WeeChat attribute flag. + */ + +void +gui_color_add_ansi_flag (char **output, int flag) +{ + switch (flag) + { + case GUI_COLOR_EXTENDED_BOLD_FLAG: + string_dyn_concat (output, "\x1B[1m"); + break; + case GUI_COLOR_EXTENDED_REVERSE_FLAG: + string_dyn_concat (output, "\x1B[7m"); + break; + case GUI_COLOR_EXTENDED_ITALIC_FLAG: + string_dyn_concat (output, "\x1B[3m"); + break; + case GUI_COLOR_EXTENDED_UNDERLINE_FLAG: + string_dyn_concat (output, "\x1B[4m"); + break; + case GUI_COLOR_EXTENDED_KEEPATTR_FLAG: + /* nothing to do here (really? not sure) */ + break; + } +} + +/* + * Converts a WeeChat color number to an ANSI color number. + * + * Returns -1 if the color is not found. + */ + +int +gui_color_weechat_to_ansi (int color) +{ + const char *ptr_color_name; + int i; + + ptr_color_name = gui_color_search_index (color); + if (!ptr_color_name) + return -1; + + for (i = 0; i < 16; i++) + { + if (strcmp (gui_color_ansi[i], ptr_color_name) == 0) + return i; + } + + /* color not found */ + return -1; +} + +/* + * Replaces WeeChat colors by ANSI colors. + * + * Note: result must be freed after use. + */ + +char * +gui_color_encode_ansi (const char *string) +{ + const unsigned char *ptr_string; + char **out, str_concat[128], str_color[8], *error; + int flag, color, length, ansi_color, fg, bg, attrs; + + if (!string) + return NULL; + + out = string_dyn_alloc (((strlen (string) * 3) / 2) + 1); + + ptr_string = (unsigned char *)string; + while (ptr_string && ptr_string[0]) + { + switch (ptr_string[0]) + { + case GUI_COLOR_COLOR_CHAR: + ptr_string++; + switch (ptr_string[0]) + { + case GUI_COLOR_FG_CHAR: + ptr_string++; + if (ptr_string[0] == GUI_COLOR_EXTENDED_CHAR) + { + ptr_string++; + while ((flag = gui_color_attr_get_flag (ptr_string[0])) > 0) + { + gui_color_add_ansi_flag (out, flag); + ptr_string++; + } + if (ptr_string[0] && ptr_string[1] && ptr_string[2] + && ptr_string[3] && ptr_string[4]) + { + memcpy (str_color, ptr_string, 5); + str_color[5] = '\0'; + error = NULL; + color = (int)strtol (str_color, &error, 10); + if (error && !error[0]) + { + snprintf (str_concat, sizeof (str_concat), + "\x1B[38;5;%dm", + color); + string_dyn_concat (out, str_concat); + } + ptr_string += 5; + } + } + else + { + while ((flag = gui_color_attr_get_flag (ptr_string[0])) > 0) + { + gui_color_add_ansi_flag (out, flag); + ptr_string++; + } + if (ptr_string[0] && ptr_string[1]) + { + memcpy (str_color, ptr_string, 2); + str_color[2] = '\0'; + error = NULL; + color = (int)strtol (str_color, &error, 10); + if (error && !error[0]) + { + ansi_color = gui_color_weechat_to_ansi (color); + if (ansi_color >= 0) + { + snprintf (str_concat, sizeof (str_concat), + "\x1B[%dm", + (ansi_color < 8) ? + ansi_color + 30 : ansi_color - 8 + 90); + string_dyn_concat (out, str_concat); + } + } + ptr_string += 2; + } + } + break; + case GUI_COLOR_BG_CHAR: + ptr_string++; + if (ptr_string[0] == GUI_COLOR_EXTENDED_CHAR) + { + ptr_string++; + if (ptr_string[0] && ptr_string[1] && ptr_string[2] + && ptr_string[3] && ptr_string[4]) + { + memcpy (str_color, ptr_string, 5); + str_color[5] = '\0'; + error = NULL; + color = (int)strtol (str_color, &error, 10); + if (error && !error[0]) + { + snprintf (str_concat, sizeof (str_concat), + "\x1B[48;5;%dm", + color); + string_dyn_concat (out, str_concat); + } + ptr_string += 5; + } + } + else + { + if (ptr_string[0] && ptr_string[1]) + { + memcpy (str_color, ptr_string, 2); + str_color[2] = '\0'; + error = NULL; + color = (int)strtol (str_color, &error, 10); + if (error && !error[0]) + { + ansi_color = gui_color_weechat_to_ansi (color); + if (ansi_color >= 0) + { + snprintf (str_concat, sizeof (str_concat), + "\x1B[%dm", + (ansi_color < 8) ? + ansi_color + 40 : ansi_color - 8 + 100); + string_dyn_concat (out, str_concat); + } + } + ptr_string += 2; + } + } + break; + case GUI_COLOR_FG_BG_CHAR: + ptr_string++; + if (ptr_string[0] == GUI_COLOR_EXTENDED_CHAR) + { + ptr_string++; + while ((flag = gui_color_attr_get_flag (ptr_string[0])) > 0) + { + gui_color_add_ansi_flag (out, flag); + ptr_string++; + } + if (ptr_string[0] && ptr_string[1] && ptr_string[2] + && ptr_string[3] && ptr_string[4]) + { + memcpy (str_color, ptr_string, 5); + str_color[5] = '\0'; + error = NULL; + color = (int)strtol (str_color, &error, 10); + if (error && !error[0]) + { + snprintf (str_concat, sizeof (str_concat), + "\x1B[38;5;%dm", + color); + string_dyn_concat (out, str_concat); + } + ptr_string += 5; + } + } + else + { + while ((flag = gui_color_attr_get_flag (ptr_string[0])) > 0) + { + gui_color_add_ansi_flag (out, flag); + ptr_string++; + } + if (ptr_string[0] && ptr_string[1]) + { + memcpy (str_color, ptr_string, 2); + str_color[2] = '\0'; + error = NULL; + color = (int)strtol (str_color, &error, 10); + if (error && !error[0]) + { + ansi_color = gui_color_weechat_to_ansi (color); + if (ansi_color >= 0) + { + snprintf (str_concat, sizeof (str_concat), + "\x1B[%dm", + (ansi_color < 8) ? + ansi_color + 30 : ansi_color - 8 + 90); + string_dyn_concat (out, str_concat); + } + } + ptr_string += 2; + } + } + /* + * note: the comma is an old separator not used any + * more (since WeeChat 2.6), but we still use it here + * so in case of/upgrade this will not break colors in + * old messages + */ + if ((ptr_string[0] == ',') || (ptr_string[0] == '~')) + { + if (ptr_string[1] == GUI_COLOR_EXTENDED_CHAR) + { + ptr_string += 2; + if (ptr_string[0] && ptr_string[1] + && ptr_string[2] && ptr_string[3] + && ptr_string[4]) + { + memcpy (str_color, ptr_string, 5); + str_color[5] = '\0'; + error = NULL; + color = (int)strtol (str_color, &error, 10); + if (error && !error[0]) + { + snprintf (str_concat, sizeof (str_concat), + "\x1B[48;5;%dm", + color); + string_dyn_concat (out, str_concat); + } + ptr_string += 5; + } + } + else + { + ptr_string++; + if (ptr_string[0] && ptr_string[1]) + { + memcpy (str_color, ptr_string, 2); + str_color[2] = '\0'; + error = NULL; + color = (int)strtol (str_color, &error, 10); + if (error && !error[0]) + { + ansi_color = gui_color_weechat_to_ansi (color); + if (ansi_color >= 0) + { + snprintf (str_concat, sizeof (str_concat), + "\x1B[%dm", + (ansi_color < 8) ? + ansi_color + 40 : ansi_color - 8 + 100); + string_dyn_concat (out, str_concat); + } + } + ptr_string += 2; + } + } + } + break; + case GUI_COLOR_EXTENDED_CHAR: + ptr_string++; + if ((isdigit (ptr_string[0])) && (isdigit (ptr_string[1])) + && (isdigit (ptr_string[2])) && (isdigit (ptr_string[3])) + && (isdigit (ptr_string[4]))) + { + memcpy (str_color, ptr_string, 5); + str_color[5] = '\0'; + error = NULL; + color = (int)strtol (str_color, &error, 10); + if (error && !error[0]) + { + snprintf (str_concat, sizeof (str_concat), + "\x1B[38;5;%dm", + color); + string_dyn_concat (out, str_concat); + } + ptr_string += 5; + } + break; + case GUI_COLOR_EMPHASIS_CHAR: + ptr_string++; + break; + case GUI_COLOR_BAR_CHAR: + ptr_string++; + switch (ptr_string[0]) + { + case GUI_COLOR_BAR_FG_CHAR: + case GUI_COLOR_BAR_BG_CHAR: + case GUI_COLOR_BAR_DELIM_CHAR: + case GUI_COLOR_BAR_START_INPUT_CHAR: + case GUI_COLOR_BAR_START_INPUT_HIDDEN_CHAR: + case GUI_COLOR_BAR_MOVE_CURSOR_CHAR: + case GUI_COLOR_BAR_START_ITEM: + case GUI_COLOR_BAR_START_LINE_ITEM: + ptr_string++; + break; + } + break; + case GUI_COLOR_RESET_CHAR: + ptr_string++; + string_dyn_concat (out, "\x1B[39m\x1B[49m"); + break; + default: + if (isdigit (ptr_string[0]) && isdigit (ptr_string[1])) + { + memcpy (str_color, ptr_string, 2); + str_color[2] = '\0'; + error = NULL; + color = (int)strtol (str_color, &error, 10); + if (error && !error[0] + && (color >= 0) + && (color < GUI_COLOR_NUM_COLORS)) + { + fg = gui_color[color]->foreground; + bg = gui_color[color]->background; + attrs = gui_color_get_extended_flags ( + gui_color[color]->attributes); + string_dyn_concat (out, "\x1B[0m"); + if (attrs & GUI_COLOR_EXTENDED_BOLD_FLAG) + string_dyn_concat (out, "\x1B[1m"); + if (attrs & GUI_COLOR_EXTENDED_REVERSE_FLAG) + string_dyn_concat (out, "\x1B[7m"); + if (attrs & GUI_COLOR_EXTENDED_ITALIC_FLAG) + string_dyn_concat (out, "\x1B[3m"); + if (attrs & GUI_COLOR_EXTENDED_UNDERLINE_FLAG) + string_dyn_concat (out, "\x1B[4m"); + if ((fg > 0) && (fg & GUI_COLOR_EXTENDED_FLAG)) + fg &= GUI_COLOR_EXTENDED_MASK; + if ((bg > 0) && (bg & GUI_COLOR_EXTENDED_FLAG)) + bg &= GUI_COLOR_EXTENDED_MASK; + if (fg < 0) + { + string_dyn_concat (out, "\x1B[39m"); + } + else + { + snprintf (str_concat, sizeof (str_concat), + "\x1B[38;5;%dm", + fg); + string_dyn_concat (out, str_concat); + } + if (bg < 0) + { + string_dyn_concat (out, "\x1B[49m"); + } + else + { + snprintf (str_concat, sizeof (str_concat), + "\x1B[48;5;%dm", + bg); + string_dyn_concat (out, str_concat); + } + } + ptr_string += 2; + } + break; + } + break; + case GUI_COLOR_SET_ATTR_CHAR: + ptr_string++; + if (ptr_string[0]) + { + switch (ptr_string[0]) + { + case GUI_COLOR_ATTR_BOLD_CHAR: + string_dyn_concat (out, "\x1B[1m"); + break; + case GUI_COLOR_ATTR_REVERSE_CHAR: + string_dyn_concat (out, "\x1B[7m"); + break; + case GUI_COLOR_ATTR_ITALIC_CHAR: + string_dyn_concat (out, "\x1B[3m"); + break; + case GUI_COLOR_ATTR_UNDERLINE_CHAR: + string_dyn_concat (out, "\x1B[4m"); + break; + } + ptr_string++; + } + break; + case GUI_COLOR_REMOVE_ATTR_CHAR: + ptr_string++; + if (ptr_string[0]) + { + switch (ptr_string[0]) + { + case GUI_COLOR_ATTR_BOLD_CHAR: + string_dyn_concat (out, "\x1B[21m"); + break; + case GUI_COLOR_ATTR_REVERSE_CHAR: + string_dyn_concat (out, "\x1B[27m"); + break; + case GUI_COLOR_ATTR_ITALIC_CHAR: + string_dyn_concat (out, "\x1B[23m"); + break; + case GUI_COLOR_ATTR_UNDERLINE_CHAR: + string_dyn_concat (out, "\x1B[24m"); + break; + } + ptr_string++; + } + break; + case GUI_COLOR_RESET_CHAR: + string_dyn_concat (out, "\x1B[0m"); + ptr_string++; + break; + default: + length = utf8_char_size ((char *)ptr_string); + if (length == 0) + length = 1; + memcpy (str_concat, ptr_string, length); + str_concat[length] = '\0'; + string_dyn_concat (out, str_concat); + ptr_string += length; + break; + } + } + + return string_dyn_free (out, 0); +} + +/* * Emphasizes a string or regular expression in a string (which can contain * colors). * diff --git a/src/gui/gui-color.h b/src/gui/gui-color.h index 90d8d6b30..1c3785fc2 100644 --- a/src/gui/gui-color.h +++ b/src/gui/gui-color.h @@ -188,6 +188,7 @@ extern int gui_color_convert_term_to_rgb (int color); extern int gui_color_convert_rgb_to_term (int rgb, int limit); extern char *gui_color_decode (const char *string, const char *replacement); extern char *gui_color_decode_ansi (const char *string, int keep_colors); +extern char *gui_color_encode_ansi (const char *string); extern char *gui_color_emphasize (const char *string, const char *search, int case_sensitive, regex_t *regex); extern void gui_color_free (struct t_gui_color *color); @@ -202,6 +203,8 @@ extern void gui_color_end (); /* color functions (GUI dependent) */ extern int gui_color_search (const char *color_name); +extern const char *gui_color_search_index (int index); +extern int gui_color_get_extended_flags (int attrs); extern int gui_color_assign (int *color, char const *color_name); extern int gui_color_assign_by_diff (int *color, const char *color_name, int diff); diff --git a/tests/unit/gui/test-gui-color.cpp b/tests/unit/gui/test-gui-color.cpp index 8dd9203bd..7f13d224d 100644 --- a/tests/unit/gui/test-gui-color.cpp +++ b/tests/unit/gui/test-gui-color.cpp @@ -23,6 +23,7 @@ extern "C" { +#include "src/core/wee-config.h" #include "src/core/wee-string.h" #include "src/gui/gui-color.h" } @@ -37,6 +38,11 @@ extern "C" STRCMP_EQUAL(__result, decoded); \ free (decoded); +#define WEE_CHECK_ENCODE_ANSI(__result, __string) \ + encoded = gui_color_encode_ansi (__string); \ + STRCMP_EQUAL(__result, encoded); \ + free (encoded); + #define WEE_CHECK_EMPHASIZE(__result, __string, __search, \ __case_sensitive, __regex) \ emphasized = gui_color_emphasize (__string, __search, \ @@ -388,6 +394,14 @@ TEST(GuiColor, ColorDecode) WEE_CHECK_DECODE("test_227,blue", string, NULL); WEE_CHECK_DECODE("test_227,blue", string, ""); WEE_CHECK_DECODE("test_?227,blue", string, "?"); + + /* WeeChat color */ + snprintf (string, sizeof (string), + "test_%soption_weechat.color.chat_host", + GUI_COLOR(GUI_COLOR_CHAT_HOST)); + WEE_CHECK_DECODE("test_option_weechat.color.chat_host", string, NULL); + WEE_CHECK_DECODE("test_option_weechat.color.chat_host", string, ""); + WEE_CHECK_DECODE("test_?option_weechat.color.chat_host", string, "?"); } /* @@ -552,6 +566,132 @@ TEST(GuiColor, ColorDecodeAnsi) /* * Tests functions: + * gui_color_encode_ansi + */ + +TEST(GuiColor, ColorEncodeAnsi) +{ + char string[256], *encoded; + + /* NULL/empty string */ + POINTERS_EQUAL(NULL, gui_color_encode_ansi (NULL)); + WEE_CHECK_ENCODE_ANSI("", ""); + + /* reset */ + snprintf (string, sizeof (string), + "test_%sreset", gui_color_get_custom ("reset")); + WEE_CHECK_ENCODE_ANSI("test_\x1B[0mreset", string); + + /* bold */ + snprintf (string, sizeof (string), + "test_%sbold%s_end", + gui_color_get_custom ("bold"), + gui_color_get_custom ("-bold")); + WEE_CHECK_ENCODE_ANSI("test_\x1B[1mbold\x1B[21m_end", string); + + /* reverse */ + snprintf (string, sizeof (string), + "test_%sreverse%s_end", + gui_color_get_custom ("reverse"), + gui_color_get_custom ("-reverse")); + WEE_CHECK_ENCODE_ANSI("test_\x1B[7mreverse\x1B[27m_end", string); + + /* italic */ + snprintf (string, sizeof (string), + "test_%sitalic%s_end", + gui_color_get_custom ("italic"), + gui_color_get_custom ("-italic")); + WEE_CHECK_ENCODE_ANSI("test_\x1B[3mitalic\x1B[23m_end", string); + + /* underline */ + snprintf (string, sizeof (string), + "test_%sunderline%s_end", + gui_color_get_custom ("underline"), + gui_color_get_custom ("-underline")); + WEE_CHECK_ENCODE_ANSI("test_\x1B[4munderline\x1B[24m_end", string); + + /* text color */ + snprintf (string, sizeof (string), + "test_%sblue", + gui_color_get_custom ("blue")); + WEE_CHECK_ENCODE_ANSI("test_\x1B[34mblue", string); + + /* bright text color */ + snprintf (string, sizeof (string), + "test_%slightgreen", + gui_color_get_custom ("lightgreen")); + WEE_CHECK_ENCODE_ANSI("test_\x1B[92mlightgreen", string); + + /* text terminal color */ + snprintf (string, sizeof (string), + "test_%s214", + gui_color_get_custom ("214")); + WEE_CHECK_ENCODE_ANSI("test_\x1B[38;5;214m214", string); + + /* background color */ + snprintf (string, sizeof (string), + "test_%sbg_red", + gui_color_get_custom (",red")); + WEE_CHECK_ENCODE_ANSI("test_\x1B[41mbg_red", string); + + /* bright background color */ + snprintf (string, sizeof (string), + "test_%sbg_lightgreen", + gui_color_get_custom (",lightgreen")); + WEE_CHECK_ENCODE_ANSI("test_\x1B[102mbg_lightgreen", string); + + /* background terminal color */ + snprintf (string, sizeof (string), + "test_%sbg_240", + gui_color_get_custom (",240")); + WEE_CHECK_ENCODE_ANSI("test_\x1B[48;5;240mbg_240", string); + + /* WeeChat color */ + snprintf (string, sizeof (string), + "test_%soption_weechat.color.chat_host", + GUI_COLOR(GUI_COLOR_CHAT_HOST)); + WEE_CHECK_ENCODE_ANSI( + "test_\x1B[0m\x1B[38;5;6m\x1B[49m" + "option_weechat.color.chat_host", + string); + + /* WeeChat bright color */ + snprintf (string, sizeof (string), + "test_%soption_weechat.color.chat_nick", + GUI_COLOR(GUI_COLOR_CHAT_NICK)); + WEE_CHECK_ENCODE_ANSI( + "test_\x1B[0m\x1B[38;5;14m\x1B[49m" + "option_weechat.color.chat_nick", + string); + + /* WeeChat color with attributes */ + config_file_option_set (config_color_chat_host, "_green", 1); + snprintf (string, sizeof (string), + "test_%soption_weechat.color.chat_host", + GUI_COLOR(GUI_COLOR_CHAT_HOST)); + WEE_CHECK_ENCODE_ANSI( + "test_\x1B[0m\x1B[4m\x1B[38;5;2m\x1B[49m" + "option_weechat.color.chat_host", + string); + config_file_option_reset (config_color_chat_host, 1); + + /* multiple colors/attributes */ + snprintf (string, sizeof (string), + "%shello, %sthis is%s a test %sblue %sreset %syellow,red here!", + gui_color_get_custom (",blue"), + gui_color_get_custom ("bold"), + gui_color_get_custom ("-bold"), + gui_color_get_custom ("blue"), + gui_color_get_custom ("reset"), + gui_color_get_custom ("yellow,red")); + WEE_CHECK_ENCODE_ANSI( + "\x1B[44mhello, \x1B[1mthis is\x1B[21m a test \x1B[34mblue \x1B[0m" + "reset \x1B[93m\x1B[41myellow,red here!", + string); +} + +/* + * Tests functions: * gui_color_emphasize */ |