From da232b18c1da6b6c7d2f993bba881ef323ecb41f Mon Sep 17 00:00:00 2001 From: Emanuele Giaquinta Date: Mon, 10 Mar 2008 12:05:43 +0000 Subject: [PATCH] Make line_add_colors part of the textbuffer api. git-svn-id: http://svn.irssi.org/repos/irssi/trunk@4748 dbcabf3a-b0e7-0310-adc4-f8d773084564 --- src/fe-text/gui-printtext.c | 57 +------------------------------------ src/fe-text/textbuffer.c | 55 +++++++++++++++++++++++++++++++++++ src/fe-text/textbuffer.h | 3 ++ 3 files changed, 59 insertions(+), 56 deletions(-) diff --git a/src/fe-text/gui-printtext.c b/src/fe-text/gui-printtext.c index a22dfdc6..7fbf3d65 100644 --- a/src/fe-text/gui-printtext.c +++ b/src/fe-text/gui-printtext.c @@ -32,7 +32,6 @@ int mirc_colors[] = { 15, 0, 1, 2, 12, 4, 5, 6, 14, 10, 3, 11, 9, 13, 8, 7 }; static int scrollback_lines, scrollback_time, scrollback_burst_remove; -static int last_fg, last_bg, last_flags; static int next_xpos, next_ypos; static GHashTable *indent_functions; @@ -161,51 +160,6 @@ static void get_colors(int flags, int *fg, int *bg, int *attr) if (flags & GUI_PRINT_FLAG_BLINK) *attr |= ATTR_BLINK; } -static void line_add_colors(TEXT_BUFFER_REC *buffer, LINE_REC **line, - int fg, int bg, int flags) -{ - unsigned char data[20]; - int pos; - - /* get the fg & bg command chars */ - fg = fg < 0 ? LINE_COLOR_DEFAULT : fg & 0x0f; - bg = LINE_COLOR_BG | (bg < 0 ? LINE_COLOR_DEFAULT : bg & 0x0f); - if (flags & GUI_PRINT_FLAG_BOLD) - fg |= LINE_COLOR_BOLD; - if (flags & GUI_PRINT_FLAG_BLINK) - bg |= LINE_COLOR_BLINK; - - pos = 0; - if (fg != last_fg) { - last_fg = fg; - data[pos++] = 0; - data[pos++] = fg == 0 ? LINE_CMD_COLOR0 : fg; - } - if (bg != last_bg) { - last_bg = bg; - data[pos++] = 0; - data[pos++] = bg; - } - - if ((flags & GUI_PRINT_FLAG_UNDERLINE) != (last_flags & GUI_PRINT_FLAG_UNDERLINE)) { - data[pos++] = 0; - data[pos++] = LINE_CMD_UNDERLINE; - } - if ((flags & GUI_PRINT_FLAG_REVERSE) != (last_flags & GUI_PRINT_FLAG_REVERSE)) { - data[pos++] = 0; - data[pos++] = LINE_CMD_REVERSE; - } - if (flags & GUI_PRINT_FLAG_INDENT) { - data[pos++] = 0; - data[pos++] = LINE_CMD_INDENT; - } - - if (pos > 0) - *line = textbuffer_insert(buffer, *line, data, pos, NULL); - - last_flags = flags; -} - static void line_add_indent_func(TEXT_BUFFER_REC *buffer, LINE_REC **line, const char *function) { @@ -269,11 +223,8 @@ static void sig_gui_print_text(WINDOW_REC *window, void *fgcolor, if (flags & GUI_PRINT_FLAG_NEWLINE) { view_add_eol(view, &insert_after); - last_fg = LINE_COLOR_DEFAULT; - last_bg = LINE_COLOR_DEFAULT | LINE_COLOR_BG; - last_flags = 0; } - line_add_colors(view->buffer, &insert_after, fg, bg, flags); + textbuffer_line_add_colors(view->buffer, &insert_after, fg, bg, flags); if (flags & GUI_PRINT_FLAG_INDENT_FUNC) { /* specify the indentation function */ @@ -292,10 +243,6 @@ static void sig_gui_printtext_finished(WINDOW_REC *window) TEXT_BUFFER_VIEW_REC *view; LINE_REC *insert_after; - last_fg = LINE_COLOR_DEFAULT; - last_bg = LINE_COLOR_DEFAULT | LINE_COLOR_BG; - last_flags = 0; - view = WINDOW_GUI(window)->view; insert_after = WINDOW_GUI(window)->use_insert_after ? WINDOW_GUI(window)->insert_after : view->buffer->cur_line; @@ -313,8 +260,6 @@ static void read_settings(void) void gui_printtext_init(void) { - last_fg = LINE_COLOR_DEFAULT; - last_bg = LINE_COLOR_DEFAULT | LINE_COLOR_BG; next_xpos = next_ypos = -1; default_indent_func = NULL; indent_functions = g_hash_table_new((GHashFunc) g_str_hash, diff --git a/src/fe-text/textbuffer.c b/src/fe-text/textbuffer.c index ff5fe2f5..46251564 100644 --- a/src/fe-text/textbuffer.c +++ b/src/fe-text/textbuffer.c @@ -266,6 +266,53 @@ int textbuffer_line_exists_after(LINE_REC *line, LINE_REC *search) return FALSE; } +static int last_fg, last_bg, last_flags; + +void textbuffer_line_add_colors(TEXT_BUFFER_REC *buffer, LINE_REC **line, + int fg, int bg, int flags) +{ + unsigned char data[20]; + int pos; + + /* get the fg & bg command chars */ + fg = fg < 0 ? LINE_COLOR_DEFAULT : fg & 0x0f; + bg = LINE_COLOR_BG | (bg < 0 ? LINE_COLOR_DEFAULT : bg & 0x0f); + if (flags & GUI_PRINT_FLAG_BOLD) + fg |= LINE_COLOR_BOLD; + if (flags & GUI_PRINT_FLAG_BLINK) + bg |= LINE_COLOR_BLINK; + + pos = 0; + if (fg != last_fg) { + last_fg = fg; + data[pos++] = 0; + data[pos++] = fg == 0 ? LINE_CMD_COLOR0 : fg; + } + if (bg != last_bg) { + last_bg = bg; + data[pos++] = 0; + data[pos++] = bg; + } + + if ((flags & GUI_PRINT_FLAG_UNDERLINE) != (last_flags & GUI_PRINT_FLAG_UNDERLINE)) { + data[pos++] = 0; + data[pos++] = LINE_CMD_UNDERLINE; + } + if ((flags & GUI_PRINT_FLAG_REVERSE) != (last_flags & GUI_PRINT_FLAG_REVERSE)) { + data[pos++] = 0; + data[pos++] = LINE_CMD_REVERSE; + } + if (flags & GUI_PRINT_FLAG_INDENT) { + data[pos++] = 0; + data[pos++] = LINE_CMD_INDENT; + } + + if (pos > 0) + *line = textbuffer_insert(buffer, *line, data, pos, NULL); + + last_flags = flags; +} + LINE_REC *textbuffer_append(TEXT_BUFFER_REC *buffer, const unsigned char *data, int len, LINE_INFO_REC *info) @@ -296,6 +343,12 @@ LINE_REC *textbuffer_insert(TEXT_BUFFER_REC *buffer, LINE_REC *insert_after, buffer->last_eol = len >= 2 && data[len-2] == 0 && data[len-1] == LINE_CMD_EOL; + if (buffer->last_eol) { + last_fg = LINE_COLOR_DEFAULT; + last_bg = LINE_COLOR_DEFAULT | LINE_COLOR_BG; + last_flags = 0; + } + return line; } @@ -533,6 +586,8 @@ GList *textbuffer_find_text(TEXT_BUFFER_REC *buffer, LINE_REC *startline, void textbuffer_init(void) { + last_fg = LINE_COLOR_DEFAULT; + last_bg = LINE_COLOR_DEFAULT | LINE_COLOR_BG; buffer_chunk = g_mem_chunk_new("text buffer chunk", sizeof(TEXT_BUFFER_REC), sizeof(TEXT_BUFFER_REC)*32, G_ALLOC_AND_FREE); diff --git a/src/fe-text/textbuffer.h b/src/fe-text/textbuffer.h index adea3604..cb1ef591 100644 --- a/src/fe-text/textbuffer.h +++ b/src/fe-text/textbuffer.h @@ -79,6 +79,9 @@ void textbuffer_line_unref_list(TEXT_BUFFER_REC *buffer, GList *list); LINE_REC *textbuffer_line_last(TEXT_BUFFER_REC *buffer); int textbuffer_line_exists_after(LINE_REC *line, LINE_REC *search); +void textbuffer_line_add_colors(TEXT_BUFFER_REC *buffer, LINE_REC **line, + int fg, int bg, int flags); + /* Append text to buffer. When \0 is found at the END OF DATA, a new line is created. You must send the EOL command before you can do anything else with the buffer. */