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
This commit is contained in:
Emanuele Giaquinta 2008-03-10 12:05:43 +00:00 committed by exg
commit da232b18c1
3 changed files with 59 additions and 56 deletions

View file

@ -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);