From da232b18c1da6b6c7d2f993bba881ef323ecb41f Mon Sep 17 00:00:00 2001 From: Emanuele Giaquinta Date: Mon, 10 Mar 2008 12:05:43 +0000 Subject: 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/textbuffer.c | 55 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) (limited to 'src/fe-text/textbuffer.c') 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); -- cgit v1.2.3