summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastien Helleu <flashcode@flashtux.org>2011-02-09 16:14:53 +0100
committerSebastien Helleu <flashcode@flashtux.org>2011-02-09 16:14:53 +0100
commit12879e913826fa92627e8f9433b55e2300a077a6 (patch)
tree288795f6b12986b640377d2975f1ca516edb2ca0
parentc232f855b9509c12096c59a9f6fe9e8157b4997a (diff)
downloadweechat-12879e913826fa92627e8f9433b55e2300a077a6.zip
Factorize code used to apply color codes in strings (for chat and bars)
-rw-r--r--src/gui/curses/gui-curses-bar-window.c261
-rw-r--r--src/gui/curses/gui-curses-chat.c289
-rw-r--r--src/gui/curses/gui-curses-window.c395
-rw-r--r--src/gui/curses/gui-curses.h18
4 files changed, 462 insertions, 501 deletions
diff --git a/src/gui/curses/gui-curses-bar-window.c b/src/gui/curses/gui-curses-bar-window.c
index 51457a7af..c4c7ab446 100644
--- a/src/gui/curses/gui-curses-bar-window.c
+++ b/src/gui/curses/gui-curses-bar-window.c
@@ -27,7 +27,6 @@
#include <stdlib.h>
#include <string.h>
-#include <ctype.h>
#include <limits.h>
#include "../../core/weechat.h"
@@ -155,10 +154,8 @@ gui_bar_window_print_string (struct t_gui_bar_window *bar_window,
int reset_color_before_display,
int hide_chars_if_scrolling)
{
- int weechat_color, x_with_hidden, size_on_screen, fg, bg, low_char, hidden;
- int pair;
- char str_fg[6], str_bg[6], str_pair[6], utf_char[16], *next_char, *output;
- char *error;
+ int x_with_hidden, size_on_screen, low_char, hidden;
+ char utf_char[16], *next_char, *output;
if (!string || !string[0])
return 1;
@@ -185,189 +182,45 @@ gui_bar_window_print_string (struct t_gui_bar_window *bar_window,
switch (string[0])
{
case GUI_COLOR_FG_CHAR: /* fg color */
- if (string[1] == GUI_COLOR_EXTENDED_CHAR)
- {
- if (string[2] && string[3] && string[4]
- && string[5] && string[6])
- {
- memcpy (str_fg, string + 2, 5);
- str_fg[5] = '\0';
- error = NULL;
- fg = (int)strtol (str_fg, &error, 10);
- if (error && !error[0])
- {
- gui_window_set_custom_color_fg (GUI_BAR_WINDOW_OBJECTS(bar_window)->win_bar,
- fg | GUI_COLOR_EXTENDED_FLAG);
- }
- string += 7;
- }
- }
- else
- {
- if (string[1] && string[2])
- {
- str_fg[0] = string[1];
- str_fg[1] = string[2];
- str_fg[2] = '\0';
- error = NULL;
- fg = (int)strtol (str_fg, &error, 10);
- if (error && !error[0])
- {
- gui_window_set_custom_color_fg (GUI_BAR_WINDOW_OBJECTS(bar_window)->win_bar,
- fg);
- }
- string += 3;
- }
- }
+ string++;
+ gui_window_string_apply_color_fg ((unsigned char **)&string,
+ GUI_BAR_WINDOW_OBJECTS(bar_window)->win_bar);
break;
case GUI_COLOR_BG_CHAR: /* bg color */
- if (string[1] == GUI_COLOR_EXTENDED_CHAR)
- {
- if (string[2] && string[3] && string[4]
- && string[5] && string[6])
- {
- memcpy (str_bg, string + 2, 5);
- str_bg[5] = '\0';
- error = NULL;
- bg = (int)strtol (str_bg, &error, 10);
- if (error && !error[0])
- {
- gui_window_set_custom_color_bg (GUI_BAR_WINDOW_OBJECTS(bar_window)->win_bar,
- bg | GUI_COLOR_EXTENDED_FLAG);
- }
- string += 7;
- }
- }
- else
- {
- if (string[1] && string[2])
- {
- str_bg[0] = string[1];
- str_bg[1] = string[2];
- str_bg[2] = '\0';
- error = NULL;
- bg = (int)strtol (str_bg, &error, 10);
- if (error && !error[0])
- {
- gui_window_set_custom_color_bg (GUI_BAR_WINDOW_OBJECTS(bar_window)->win_bar,
- bg);
- }
- string += 3;
- }
- }
+ string++;
+ gui_window_string_apply_color_bg ((unsigned char **)&string,
+ GUI_BAR_WINDOW_OBJECTS(bar_window)->win_bar);
break;
case GUI_COLOR_FG_BG_CHAR: /* fg + bg color */
- str_fg[0] = '\0';
- str_bg[0] = '\0';
- fg = -1;
- bg = -1;
- if (string[1] == GUI_COLOR_EXTENDED_CHAR)
- {
- if (string[2] && string[3] && string[4]
- && string[5] && string[6])
- {
- memcpy (str_fg, string + 2, 5);
- str_fg[5] = '\0';
- error = NULL;
- fg = (int)strtol (str_fg, &error, 10);
- if (!error || error[0])
- fg = -1;
- else
- fg |= GUI_COLOR_EXTENDED_FLAG;
- string += 7;
- }
- }
- else
- {
- if (string[1] && string[2])
- {
- str_fg[0] = string[1];
- str_fg[1] = string[2];
- str_fg[2] = '\0';
- error = NULL;
- fg = (int)strtol (str_fg, &error, 10);
- if (!error || error[0])
- fg = -1;
- string += 3;
- }
- }
- if (string[0] == ',')
- {
- string++;
- if (string[0] == GUI_COLOR_EXTENDED_CHAR)
- {
- if (string[1] && string[2] && string[3]
- && string[4] && string[5])
- {
- memcpy (str_bg, string + 1, 5);
- str_bg[5] = '\0';
- error = NULL;
- bg = (int)strtol (str_bg, &error, 10);
- if (!error || error[0])
- bg = -1;
- else
- bg |= GUI_COLOR_EXTENDED_FLAG;
- string += 6;
- }
- }
- else
- {
- if (string[0] && string[1])
- {
- str_bg[0] = string[0];
- str_bg[1] = string[1];
- str_bg[2] = '\0';
- error = NULL;
- bg = (int)strtol (str_bg, &error, 10);
- if (!error || error[0])
- bg = -1;
- string += 2;
- }
- }
- }
- if ((fg >= 0) && (bg >= 0))
- {
- gui_window_set_custom_color_fg_bg (GUI_BAR_WINDOW_OBJECTS(bar_window)->win_bar,
- fg, bg);
- }
+ string++;
+ gui_window_string_apply_color_fg_bg ((unsigned char **)&string,
+ GUI_BAR_WINDOW_OBJECTS(bar_window)->win_bar);
break;
case GUI_COLOR_EXTENDED_CHAR: /* pair number */
- if ((isdigit (string[1])) && (isdigit (string[2]))
- && (isdigit (string[3])) && (isdigit (string[4]))
- && (isdigit (string[5])))
- {
- memcpy (str_pair, string + 1, 5);
- str_pair[5] = '\0';
- error = NULL;
- pair = (int)strtol (str_pair, &error, 10);
- if (error && !error[0])
- {
- gui_window_set_custom_color_pair (GUI_BAR_WINDOW_OBJECTS(bar_window)->win_bar,
- pair);
- }
- string += 6;
- }
+ string++;
+ gui_window_string_apply_color_pair ((unsigned char **)&string,
+ GUI_BAR_WINDOW_OBJECTS(bar_window)->win_bar);
break;
case GUI_COLOR_BAR_CHAR: /* bar color */
switch (string[1])
{
case GUI_COLOR_BAR_FG_CHAR:
/* bar foreground */
+ string += 2;
gui_window_set_custom_color_fg (GUI_BAR_WINDOW_OBJECTS(bar_window)->win_bar,
CONFIG_COLOR(bar_window->bar->options[GUI_BAR_OPTION_COLOR_FG]));
- string += 2;
break;
case GUI_COLOR_BAR_DELIM_CHAR:
/* bar delimiter */
+ string += 2;
gui_window_set_custom_color_fg (GUI_BAR_WINDOW_OBJECTS(bar_window)->win_bar,
CONFIG_COLOR(bar_window->bar->options[GUI_BAR_OPTION_COLOR_DELIM]));
- string += 2;
break;
case GUI_COLOR_BAR_BG_CHAR:
/* bar background */
+ string += 2;
gui_window_set_custom_color_bg (GUI_BAR_WINDOW_OBJECTS(bar_window)->win_bar,
CONFIG_COLOR(bar_window->bar->options[GUI_BAR_OPTION_COLOR_BG]));
- string += 2;
break;
case GUI_COLOR_BAR_START_INPUT_CHAR:
string += 2;
@@ -379,12 +232,12 @@ gui_bar_window_print_string (struct t_gui_bar_window *bar_window,
break;
case GUI_COLOR_BAR_MOVE_CURSOR_CHAR:
/* move cursor to current position on screen */
+ string += 2;
getyx (GUI_BAR_WINDOW_OBJECTS(bar_window)->win_bar,
bar_window->cursor_y,
bar_window->cursor_x);
bar_window->cursor_x += bar_window->x;
bar_window->cursor_y += bar_window->y;
- string += 2;
break;
default:
string++;
@@ -392,81 +245,29 @@ gui_bar_window_print_string (struct t_gui_bar_window *bar_window,
}
break;
default:
- if (isdigit (string[0]) && isdigit (string[1]))
- {
- str_fg[0] = string[0];
- str_fg[1] = string[1];
- str_fg[2] = '\0';
- error = NULL;
- weechat_color = (int)strtol (str_fg, &error, 10);
- if (error && !error[0])
- {
- gui_window_set_weechat_color (GUI_BAR_WINDOW_OBJECTS(bar_window)->win_bar,
- weechat_color);
- }
- string += 2;
- }
+ gui_window_string_apply_color_weechat ((unsigned char **)&string,
+ GUI_BAR_WINDOW_OBJECTS(bar_window)->win_bar);
break;
}
break;
+ case GUI_COLOR_SET_WEECHAT_CHAR:
+ string++;
+ gui_window_string_apply_color_set ((unsigned char **)&string,
+ GUI_BAR_WINDOW_OBJECTS(bar_window)->win_bar);
+ break;
+ case GUI_COLOR_REMOVE_WEECHAT_CHAR:
+ string++;
+ gui_window_string_apply_color_remove ((unsigned char **)&string,
+ GUI_BAR_WINDOW_OBJECTS(bar_window)->win_bar);
+ break;
case GUI_COLOR_RESET_CHAR:
+ string++;
gui_window_set_custom_color_fg (GUI_BAR_WINDOW_OBJECTS(bar_window)->win_bar,
CONFIG_COLOR(bar_window->bar->options[GUI_BAR_OPTION_COLOR_FG]));
gui_window_set_custom_color_bg (GUI_BAR_WINDOW_OBJECTS(bar_window)->win_bar,
CONFIG_COLOR(bar_window->bar->options[GUI_BAR_OPTION_COLOR_BG]));
gui_window_remove_color_style (GUI_BAR_WINDOW_OBJECTS(bar_window)->win_bar,
A_BOLD | A_UNDERLINE | A_REVERSE);
- string++;
- break;
- case GUI_COLOR_SET_WEECHAT_CHAR:
- string++;
- switch (string[0])
- {
- case GUI_COLOR_ATTR_BOLD_CHAR:
- string++;
- gui_window_set_color_style (GUI_BAR_WINDOW_OBJECTS(bar_window)->win_bar,
- A_BOLD);
- break;
- case GUI_COLOR_ATTR_REVERSE_CHAR:
- string++;
- gui_window_set_color_style (GUI_BAR_WINDOW_OBJECTS(bar_window)->win_bar,
- A_REVERSE);
- break;
- case GUI_COLOR_ATTR_ITALIC_CHAR:
- /* not available in Curses GUI */
- string++;
- break;
- case GUI_COLOR_ATTR_UNDERLINE_CHAR:
- string++;
- gui_window_set_color_style (GUI_BAR_WINDOW_OBJECTS(bar_window)->win_bar,
- A_UNDERLINE);
- break;
- }
- break;
- case GUI_COLOR_REMOVE_WEECHAT_CHAR:
- string++;
- switch (string[0])
- {
- case GUI_COLOR_ATTR_BOLD_CHAR:
- string++;
- gui_window_remove_color_style (GUI_BAR_WINDOW_OBJECTS(bar_window)->win_bar,
- A_BOLD);
- break;
- case GUI_COLOR_ATTR_REVERSE_CHAR:
- string++;
- gui_window_remove_color_style (GUI_BAR_WINDOW_OBJECTS(bar_window)->win_bar,
- A_REVERSE);
- break;
- case GUI_COLOR_ATTR_ITALIC_CHAR:
- /* not available in Curses GUI */
- string++;
- break;
- case GUI_COLOR_ATTR_UNDERLINE_CHAR:
- string++;
- gui_window_remove_color_style (GUI_BAR_WINDOW_OBJECTS(bar_window)->win_bar,
- A_UNDERLINE);
- break;
- }
break;
default:
next_char = utf8_next_char (string);
diff --git a/src/gui/curses/gui-curses-chat.c b/src/gui/curses/gui-curses-chat.c
index 953a21825..f5632e6e7 100644
--- a/src/gui/curses/gui-curses-chat.c
+++ b/src/gui/curses/gui-curses-chat.c
@@ -27,7 +27,6 @@
#include <stdlib.h>
#include <string.h>
-#include <ctype.h>
#include "../../core/weechat.h"
#include "../../core/wee-config.h"
@@ -172,215 +171,37 @@ char *
gui_chat_string_next_char (struct t_gui_window *window,
const unsigned char *string, int apply_style)
{
- char str_fg[6], str_bg[6], str_pair[6], *error;
- int weechat_color, fg, bg, pair;
-
while (string[0])
{
switch (string[0])
{
- case GUI_COLOR_RESET_CHAR:
- string++;
- if (apply_style)
- gui_window_reset_style (GUI_WINDOW_OBJECTS(window)->win_chat, GUI_COLOR_CHAT);
- break;
case GUI_COLOR_COLOR_CHAR:
string++;
switch (string[0])
{
case GUI_COLOR_FG_CHAR: /* fg color */
- if (string[1] == GUI_COLOR_EXTENDED_CHAR)
- {
- if (string[2] && string[3] && string[4]
- && string[5] && string[6])
- {
- if (apply_style)
- {
- memcpy (str_fg, string + 2, 5);
- str_fg[5] = '\0';
- error = NULL;
- fg = (int)strtol (str_fg, &error, 10);
- if (error && !error[0])
- {
- gui_window_set_custom_color_fg (GUI_WINDOW_OBJECTS(window)->win_chat,
- fg | GUI_COLOR_EXTENDED_FLAG);
- }
- }
- string += 7;
- }
- }
- else
- {
- if (string[1] && string[2])
- {
- if (apply_style)
- {
- str_fg[0] = string[1];
- str_fg[1] = string[2];
- str_fg[2] = '\0';
- error = NULL;
- fg = (int)strtol (str_fg, &error, 10);
- if (error && !error[0])
- {
- gui_window_set_custom_color_fg (GUI_WINDOW_OBJECTS(window)->win_chat,
- fg);
- }
- }
- string += 3;
- }
- }
+ string++;
+ gui_window_string_apply_color_fg ((unsigned char **)&string,
+ (apply_style) ? GUI_WINDOW_OBJECTS(window)->win_chat : NULL);
break;
case GUI_COLOR_BG_CHAR: /* bg color */
- if (string[1] == GUI_COLOR_EXTENDED_CHAR)
- {
- if (string[2] && string[3] && string[4]
- && string[5] && string[6])
- {
- if (apply_style)
- {
- memcpy (str_bg, string + 2, 5);
- str_bg[5] = '\0';
- error = NULL;
- bg = (int)strtol (str_bg, &error, 10);
- if (error && !error[0])
- {
- gui_window_set_custom_color_bg (GUI_WINDOW_OBJECTS(window)->win_chat,
- bg | GUI_COLOR_EXTENDED_FLAG);
- }
- }
- string += 7;
- }
- }
- else
- {
- if (string[1] && string[2])
- {
- if (apply_style)
- {
- str_bg[0] = string[1];
- str_bg[1] = string[2];
- str_bg[2] = '\0';
- error = NULL;
- bg = (int)strtol (str_bg, &error, 10);
- if (error && !error[0])
- {
- gui_window_set_custom_color_bg (GUI_WINDOW_OBJECTS(window)->win_chat,
- bg);
- }
- }
- string += 3;
- }
- }
+ string++;
+ gui_window_string_apply_color_bg ((unsigned char **)&string,
+ (apply_style) ? GUI_WINDOW_OBJECTS(window)->win_chat : NULL);
break;
case GUI_COLOR_FG_BG_CHAR: /* fg + bg color */
- str_fg[0] = '\0';
- str_bg[0] = '\0';
- fg = -1;
- bg = -1;
- if (string[1] == GUI_COLOR_EXTENDED_CHAR)
- {
- if (string[2] && string[3] && string[4]
- && string[5] && string[6])
- {
- if (apply_style)
- {
- memcpy (str_fg, string + 2, 5);
- str_fg[5] = '\0';
- error = NULL;
- fg = (int)strtol (str_fg, &error, 10);
- if (!error || error[0])
- fg = -1;
- else
- fg |= GUI_COLOR_EXTENDED_FLAG;
- }
- string += 7;
- }
- }
- else
- {
- if (string[1] && string[2])
- {
- if (apply_style)
- {
- str_fg[0] = string[1];
- str_fg[1] = string[2];
- str_fg[2] = '\0';
- error = NULL;
- fg = (int)strtol (str_fg, &error, 10);
- if (!error || error[0])
- fg = -1;
- }
- string += 3;
- }
- }
- if (string[0] == ',')
- {
- string++;
- if (string[0] == GUI_COLOR_EXTENDED_CHAR)
- {
- if (string[1] && string[2] && string[3]
- && string[4] && string[5])
- {
- if (apply_style)
- {
- memcpy (str_bg, string + 1, 5);
- str_bg[5] = '\0';
- error = NULL;
- bg = (int)strtol (str_bg, &error, 10);
- if (!error || error[0])
- bg = -1;
- else
- bg |= GUI_COLOR_EXTENDED_FLAG;
- }
- string += 6;
- }
- }
- else
- {
- if (string[0] && string[1])
- {
- if (apply_style)
- {
- str_bg[0] = string[0];
- str_bg[1] = string[1];
- str_bg[2] = '\0';
- error = NULL;
- bg = (int)strtol (str_bg, &error, 10);
- if (!error || error[0])
- bg = -1;
- }
- string += 2;
- }
- }
- }
- if (apply_style && (fg >= 0) && (bg >= 0))
- {
- gui_window_set_custom_color_fg_bg (GUI_WINDOW_OBJECTS(window)->win_chat,
- fg, bg);
- }
+ string++;
+ gui_window_string_apply_color_fg_bg ((unsigned char **)&string,
+ (apply_style) ? GUI_WINDOW_OBJECTS(window)->win_chat : NULL);
break;
case GUI_COLOR_EXTENDED_CHAR: /* pair number */
- if ((isdigit (string[1])) && (isdigit (string[2]))
- && (isdigit (string[3])) && (isdigit (string[4]))
- && (isdigit (string[5])))
- {
- if (apply_style)
- {
- memcpy (str_pair, string + 1, 5);
- str_pair[5] = '\0';
- error = NULL;
- pair = (int)strtol (str_pair, &error, 10);
- if (error && !error[0])
- {
- gui_window_set_custom_color_pair (GUI_WINDOW_OBJECTS(window)->win_chat,
- pair);
- }
- }
- string += 6;
- }
+ string++;
+ gui_window_string_apply_color_pair ((unsigned char **)&string,
+ (apply_style) ? GUI_WINDOW_OBJECTS(window)->win_chat : NULL);
break;
case GUI_COLOR_BAR_CHAR: /* bar color */
- switch (string[1])
+ string++;
+ switch (string[0])
{
case GUI_COLOR_BAR_FG_CHAR:
case GUI_COLOR_BAR_DELIM_CHAR:
@@ -388,95 +209,35 @@ gui_chat_string_next_char (struct t_gui_window *window,
case GUI_COLOR_BAR_START_INPUT_CHAR:
case GUI_COLOR_BAR_START_INPUT_HIDDEN_CHAR:
case GUI_COLOR_BAR_MOVE_CURSOR_CHAR:
- string += 2;
- break;
- default:
string++;
break;
}
break;
default:
- if (isdigit (string[0]) && isdigit (string[1]))
- {
- if (apply_style)
- {
- str_fg[0] = string[0];
- str_fg[1] = string[1];
- str_fg[2] = '\0';
- error = NULL;
- weechat_color = (int)strtol (str_fg, &error, 10);
- if (error && !error[0])
- {
- gui_window_set_weechat_color (GUI_WINDOW_OBJECTS(window)->win_chat,
- weechat_color);
- }
- }
- string += 2;
- }
+ gui_window_string_apply_color_weechat ((unsigned char **)&string,
+ (apply_style) ? GUI_WINDOW_OBJECTS(window)->win_chat : NULL);
break;
}
break;
case GUI_COLOR_SET_WEECHAT_CHAR:
string++;
- switch (string[0])
- {
- case GUI_COLOR_ATTR_BOLD_CHAR:
- string++;
- if (apply_style)
- gui_window_set_color_style (GUI_WINDOW_OBJECTS(window)->win_chat,
- A_BOLD);
- break;
- case GUI_COLOR_ATTR_REVERSE_CHAR:
- string++;
- if (apply_style)
- gui_window_set_color_style (GUI_WINDOW_OBJECTS(window)->win_chat,
- A_REVERSE);
- break;
- case GUI_COLOR_ATTR_ITALIC_CHAR:
- /* not available in Curses GUI */
- string++;
- break;
- case GUI_COLOR_ATTR_UNDERLINE_CHAR:
- string++;
- if (apply_style)
- gui_window_set_color_style (GUI_WINDOW_OBJECTS(window)->win_chat,
- A_UNDERLINE);
- break;
- }
+ gui_window_string_apply_color_set ((unsigned char **)&string,
+ (apply_style) ? GUI_WINDOW_OBJECTS(window)->win_chat : NULL);
break;
case GUI_COLOR_REMOVE_WEECHAT_CHAR:
string++;
- switch (string[0])
- {
- case GUI_COLOR_ATTR_BOLD_CHAR:
- string++;
- if (apply_style)
- gui_window_remove_color_style (GUI_WINDOW_OBJECTS(window)->win_chat,
- A_BOLD);
- break;
- case GUI_COLOR_ATTR_REVERSE_CHAR:
- string++;
- if (apply_style)
- gui_window_remove_color_style (GUI_WINDOW_OBJECTS(window)->win_chat,
- A_REVERSE);
- break;
- case GUI_COLOR_ATTR_ITALIC_CHAR:
- /* not available in Curses GUI */
- string++;
- break;
- case GUI_COLOR_ATTR_UNDERLINE_CHAR:
- string++;
- if (apply_style)
- gui_window_remove_color_style (GUI_WINDOW_OBJECTS(window)->win_chat,
- A_UNDERLINE);
- break;
- }
+ gui_window_string_apply_color_remove ((unsigned char **)&string,
+ (apply_style) ? GUI_WINDOW_OBJECTS(window)->win_chat : NULL);
+ break;
+ case GUI_COLOR_RESET_CHAR:
+ string++;
+ if (apply_style)
+ gui_window_reset_style (GUI_WINDOW_OBJECTS(window)->win_chat, GUI_COLOR_CHAT);
break;
default:
return (char *)string;
break;
}
-
}
/* nothing found except color/attrib codes, so return NULL */
diff --git a/src/gui/curses/gui-curses-window.c b/src/gui/curses/gui-curses-window.c
index ac1458367..e22db0bfd 100644
--- a/src/gui/curses/gui-curses-window.c
+++ b/src/gui/curses/gui-curses-window.c
@@ -27,6 +27,7 @@
#include <stdlib.h>
#include <string.h>
+#include <ctype.h>
#include <stdarg.h>
#include <libgen.h>
#include <sys/ioctl.h>
@@ -206,6 +207,19 @@ gui_window_clear (WINDOW *window, int fg, int bg)
}
/*
+ * gui_window_clrtoeol: clear until end of line with current background
+ */
+
+void
+gui_window_clrtoeol (WINDOW *window)
+{
+ wbkgdset (window,
+ ' ' | COLOR_PAIR (gui_color_get_pair (window_current_style_fg,
+ window_current_style_bg)));
+ wclrtoeol (window);
+}
+
+/*
* gui_window_reset_style: reset style (color and attr) with a weechat color
* for a window
*/
@@ -427,16 +441,385 @@ gui_window_set_custom_color_pair (WINDOW *window, int pair)
}
/*
- * gui_window_clrtoeol: clear until end of line with current background
+ * gui_window_string_apply_color_fg: apply foreground color code in string and
+ * move string pointer after color in string
+ * If window is NULL, no color is applied but
+ * string pointer is moved anyway
*/
void
-gui_window_clrtoeol (WINDOW *window)
+gui_window_string_apply_color_fg (unsigned char **str, WINDOW *window)
{
- wbkgdset (window,
- ' ' | COLOR_PAIR (gui_color_get_pair (window_current_style_fg,
- window_current_style_bg)));
- wclrtoeol (window);
+ unsigned char *ptr_string;
+ char str_fg[6], *error;
+ int fg;
+
+ ptr_string = *str;
+
+ if (ptr_string[0] == GUI_COLOR_EXTENDED_CHAR)
+ {
+ if (ptr_string[1] && ptr_string[2] && ptr_string[3]
+ && ptr_string[4] && ptr_string[5])
+ {
+ if (window)
+ {
+ memcpy (str_fg, ptr_string + 1, 5);
+ str_fg[5] = '\0';
+ error = NULL;
+ fg = (int)strtol (str_fg, &error, 10);
+ if (error && !error[0])
+ {
+ gui_window_set_custom_color_fg (window,
+ fg | GUI_COLOR_EXTENDED_FLAG);
+ }
+ }
+ ptr_string += 6;
+ }
+ }
+ else
+ {
+ if (ptr_string[0] && ptr_string[1])
+ {
+ if (window)
+ {
+ str_fg[0] = ptr_string[0];
+ str_fg[1] = ptr_string[1];
+ str_fg[2] = '\0';
+ error = NULL;
+ fg = (int)strtol (str_fg, &error, 10);
+ if (error && !error[0])
+ {
+ gui_window_set_custom_color_fg (window, fg);
+ }
+ }
+ ptr_string += 2;
+ }
+ }
+
+ *str = ptr_string;
+}
+
+/*
+ * gui_window_string_apply_color_bg: apply background color code in string and
+ * move string pointer after color in string
+ * If window is NULL, no color is applied but
+ * string pointer is moved anyway
+ */
+
+void
+gui_window_string_apply_color_bg (unsigned char **str, WINDOW *window)
+{
+ unsigned char *ptr_string;
+ char str_bg[6], *error;
+ int bg;
+
+ ptr_string = *str;
+
+ if (ptr_string[0] == GUI_COLOR_EXTENDED_CHAR)
+ {
+ if (ptr_string[1] && ptr_string[2] && ptr_string[3]
+ && ptr_string[4] && ptr_string[5])
+ {
+ if (window)
+ {
+ memcpy (str_bg, ptr_string + 1, 5);
+ str_bg[5] = '\0';
+ error = NULL;
+ bg = (int)strtol (str_bg, &error, 10);
+ if (error && !error[0])
+ {
+ gui_window_set_custom_color_bg (window,
+ bg | GUI_COLOR_EXTENDED_FLAG);
+ }
+ }
+ ptr_string += 6;
+ }
+ }
+ else
+ {
+ if (ptr_string[0] && ptr_string[1])
+ {
+ if (window)
+ {
+ str_bg[0] = ptr_string[0];
+ str_bg[1] = ptr_string[1];
+ str_bg[2] = '\0';
+ error = NULL;
+ bg = (int)strtol (str_bg, &error, 10);
+ if (error && !error[0])
+ {
+ gui_window_set_custom_color_bg (window, bg);
+ }
+ }
+ ptr_string += 2;
+ }
+ }
+
+ *str = ptr_string;
+}
+
+/*
+ * gui_window_string_apply_color_fg_bg: apply foreground + background color
+ * code in string and move string pointer
+ * after color in string
+ * If window is NULL, no color is applied
+ * but string pointer is moved anyway
+ */
+
+void
+gui_window_string_apply_color_fg_bg (unsigned char **str, WINDOW *window)
+{
+ unsigned char *ptr_string;
+ char str_fg[6], str_bg[6], *error;
+ int fg, bg;
+
+ ptr_string = *str;
+
+ str_fg[0] = '\0';
+ str_bg[0] = '\0';
+ fg = -1;
+ bg = -1;
+ if (ptr_string[0] == GUI_COLOR_EXTENDED_CHAR)
+ {
+ if (ptr_string[1] && ptr_string[2] && ptr_string[3]
+ && ptr_string[4] && ptr_string[5])
+ {
+ if (window)
+ {
+ memcpy (str_fg, ptr_string + 1, 5);
+ str_fg[5] = '\0';
+ error = NULL;
+ fg = (int)strtol (str_fg, &error, 10);
+ if (!error || error[0])
+ fg = -1;
+ else
+ fg |= GUI_COLOR_EXTENDED_FLAG;
+ }
+ ptr_string += 6;
+ }
+ }
+ else
+ {
+ if (ptr_string[0] && ptr_string[1])
+ {
+ if (window)
+ {
+ str_fg[0] = ptr_string[0];
+ str_fg[1] = ptr_string[1];
+ str_fg[2] = '\0';
+ error = NULL;
+ fg = (int)strtol (str_fg, &error, 10);
+ if (!error || error[0])
+ fg = -1;
+ }
+ ptr_string += 2;
+ }
+ }
+ if (ptr_string[0] == ',')
+ {
+ ptr_string++;
+ if (ptr_string[0] == GUI_COLOR_EXTENDED_CHAR)
+ {
+ if (ptr_string[1] && ptr_string[2] && ptr_string[3]
+ && ptr_string[4] && ptr_string[5])
+ {
+ if (window)
+ {
+ memcpy (str_bg, ptr_string + 1, 5);
+ str_bg[5] = '\0';
+ error = NULL;
+ bg = (int)strtol (str_bg, &error, 10);
+ if (!error || error[0])
+ bg = -1;
+ else
+ bg |= GUI_COLOR_EXTENDED_FLAG;
+ }
+ ptr_string += 6;
+ }
+ }
+ else
+ {
+ if (ptr_string[0] && ptr_string[1])
+ {
+ if (window)
+ {
+ str_bg[0] = ptr_string[0];
+ str_bg[1] = ptr_string[1];
+ str_bg[2] = '\0';
+ error = NULL;
+ bg = (int)strtol (str_bg, &error, 10);
+ if (!error || error[0])
+ bg = -1;
+ }
+ ptr_string += 2;
+ }
+ }
+ }
+ if (window && (fg >= 0) && (bg >= 0))
+ {
+ gui_window_set_custom_color_fg_bg (window, fg, bg);
+ }
+
+ *str = ptr_string;
+}
+
+/*
+ * gui_window_string_apply_color_pair: apply pair color code in string and
+ * move string pointer after color in
+ * string
+ * If window is NULL, no color is applied
+ * but string pointer is moved anyway
+ */
+
+void
+gui_window_string_apply_color_pair (unsigned char **str, WINDOW *window)
+{
+ unsigned char *ptr_string;
+ char str_pair[6], *error;
+ int pair;
+
+ ptr_string = *str;
+
+ if ((isdigit (ptr_string[0])) && (isdigit (ptr_string[1]))
+ && (isdigit (ptr_string[2])) && (isdigit (ptr_string[3]))
+ && (isdigit (ptr_string[4])))
+ {
+ if (window)
+ {
+ memcpy (str_pair, ptr_string, 5);
+ str_pair[5] = '\0';
+ error = NULL;
+ pair = (int)strtol (str_pair, &error, 10);
+ if (error && !error[0])
+ {
+ gui_window_set_custom_color_pair (window, pair);
+ }
+ }
+ ptr_string += 5;
+ }
+
+ *str = ptr_string;
+}
+
+/*
+ * gui_window_string_apply_color_weechat: apply weechat color code in string
+ * and move string pointer after color
+ * in string
+ * If window is NULL, no color is
+ * applied but string pointer is moved
+ * anyway
+ */
+
+void
+gui_window_string_apply_color_weechat (unsigned char **str, WINDOW *window)
+{
+ unsigned char *ptr_string;
+ char str_number[3], *error;
+ int weechat_color;
+
+ ptr_string = *str;
+
+ if (isdigit (ptr_string[0]) && isdigit (ptr_string[1]))
+ {
+ if (window)
+ {
+ str_number[0] = ptr_string[0];
+ str_number[1] = ptr_string[1];
+ str_number[2] = '\0';
+ error = NULL;
+ weechat_color = (int)strtol (str_number, &error, 10);
+ if (error && !error[0])
+ {
+ gui_window_set_weechat_color (window,
+ weechat_color);
+ }
+ }
+ ptr_string += 2;
+ }
+
+ *str = ptr_string;
+}
+
+/*
+ * gui_window_string_apply_color_set: apply "set attribute" color code in
+ * string and move string pointer after
+ * color in string
+ * If window is NULL, no color is applied
+ * but string pointer is moved anyway
+ */
+
+void
+gui_window_string_apply_color_set (unsigned char **str, WINDOW *window)
+{
+ unsigned char *ptr_string;
+
+ ptr_string = *str;
+
+ switch (ptr_string[0])
+ {
+ case GUI_COLOR_ATTR_BOLD_CHAR:
+ ptr_string++;
+ if (window)
+ gui_window_set_color_style (window, A_BOLD);
+ break;
+ case GUI_COLOR_ATTR_REVERSE_CHAR:
+ ptr_string++;
+ if (window)
+ gui_window_set_color_style (window, A_REVERSE);
+ break;
+ case GUI_COLOR_ATTR_ITALIC_CHAR:
+ /* not available in Curses GUI */
+ ptr_string++;
+ break;
+ case GUI_COLOR_ATTR_UNDERLINE_CHAR:
+ ptr_string++;
+ if (window)
+ gui_window_set_color_style (window, A_UNDERLINE);
+ break;
+ }
+
+ *str = ptr_string;
+}
+
+/*
+ * gui_window_string_apply_color_remove: apply "remove attribute" color code in
+ * string and move string pointer after
+ * color in string
+ * If window is NULL, no color is applied
+ * but string pointer is moved anyway
+ */
+
+void
+gui_window_string_apply_color_remove (unsigned char **str, WINDOW *window)
+{
+ unsigned char *ptr_string;
+
+ ptr_string = *str;
+
+ switch (ptr_string[0])
+ {
+ case GUI_COLOR_ATTR_BOLD_CHAR:
+ ptr_string++;
+ if (window)
+ gui_window_remove_color_style (window, A_BOLD);
+ break;
+ case GUI_COLOR_ATTR_REVERSE_CHAR:
+ ptr_string++;
+ if (window)
+ gui_window_remove_color_style (window, A_REVERSE);
+ break;
+ case GUI_COLOR_ATTR_ITALIC_CHAR:
+ /* not available in Curses GUI */
+ ptr_string++;
+ break;
+ case GUI_COLOR_ATTR_UNDERLINE_CHAR:
+ ptr_string++;
+ if (window)
+ gui_window_remove_color_style (window, A_UNDERLINE);
+ break;
+ }
+
+ *str = ptr_string;
}
/*
diff --git a/src/gui/curses/gui-curses.h b/src/gui/curses/gui-curses.h
index 69481bd78..f3fad901d 100644
--- a/src/gui/curses/gui-curses.h
+++ b/src/gui/curses/gui-curses.h
@@ -81,6 +81,7 @@ extern int gui_keyboard_read_cb (void *data, int fd);
extern void gui_window_read_terminal_size ();
extern void gui_window_redraw_buffer (struct t_gui_buffer *buffer);
extern void gui_window_clear (WINDOW *window, int fg, int bg);
+extern void gui_window_clrtoeol (WINDOW *window);
extern void gui_window_reset_style (WINDOW *window, int num_color);
extern void gui_window_set_color_style (WINDOW *window, int style);
extern void gui_window_remove_color_style (WINDOW *window, int style);
@@ -90,7 +91,22 @@ extern void gui_window_set_custom_color_fg_bg (WINDOW *window, int fg, int bg);
extern void gui_window_set_custom_color_pair (WINDOW *window, int pair);
extern void gui_window_set_custom_color_fg (WINDOW *window, int fg);
extern void gui_window_set_custom_color_bg (WINDOW *window, int bg);
-extern void gui_window_clrtoeol (WINDOW *window);
+extern void gui_window_string_apply_color_fg (unsigned char **str,
+ WINDOW *window);
+extern void gui_window_string_apply_color_bg (unsigned char **str,
+ WINDOW *window);
+extern void gui_window_string_apply_color_fg_bg (unsigned char **str,
+ WINDOW *window);
+extern void gui_window_string_apply_color_pair (unsigned char **str,
+ WINDOW *window);
+extern void gui_window_string_apply_color_weechat (unsigned char **str,
+ WINDOW *window);
+extern void gui_window_string_apply_color_set (unsigned char **str,
+ WINDOW *window);
+extern void gui_window_string_apply_color_remove (unsigned char **str,
+ WINDOW *window);
+extern void gui_window_apply_color (unsigned char **str, WINDOW *window,
+ int apply_bar_colors);
extern void gui_window_set_title (const char *title);
#endif /* __WEECHAT_GUI_CURSES_H */