summaryrefslogtreecommitdiff
path: root/src/fe-text/textbuffer.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/fe-text/textbuffer.c')
-rw-r--r--src/fe-text/textbuffer.c55
1 files changed, 55 insertions, 0 deletions
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);