diff options
Diffstat (limited to 'src/fe-text/textbuffer.h')
-rw-r--r-- | src/fe-text/textbuffer.h | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/src/fe-text/textbuffer.h b/src/fe-text/textbuffer.h new file mode 100644 index 0000000..6c72a56 --- /dev/null +++ b/src/fe-text/textbuffer.h @@ -0,0 +1,106 @@ +#ifndef IRSSI_FE_TEXT_TEXTBUFFER_H +#define IRSSI_FE_TEXT_TEXTBUFFER_H + +/* Make sure TEXT_CHUNK_REC is not slightly more than a page, as that + wastes a lot of memory. */ +#define LINE_TEXT_CHUNK_SIZE (16384 - 16) + +#define LINE_INFO_FORMAT_SET (void *) 0x1 + +enum { + LINE_CMD_EOL=0x80, /* line ends here */ +}; + +enum { + COLORING_STRIP = 0, + COLORING_EXPAND = 1, + COLORING_UNEXPAND = 2, + COLORING_RAW = 3, +}; + +struct _TEXT_BUFFER_FORMAT_REC; + +typedef struct { + int level; + time_t time; + char *text; + struct _LINE_INFO_META_REC *meta; + struct _TEXT_BUFFER_FORMAT_REC *format; +} LINE_INFO_REC; + +typedef struct _LINE_REC { + struct _LINE_REC *prev, *next; + /* Text in the line. \0 means that the next char will be a + color or command. + + If the 7th bit is set, the lowest 7 bits are the command + (see LINE_CMD_xxxx). Otherwise they specify a color change: + + Bit: + 5 - Setting a background color + 4 - Use "default terminal color" + 0-3 - Color + + DO NOT ADD BLACK WITH \0\0 - this will break things. Use + LINE_CMD_COLOR0 instead. */ + LINE_INFO_REC info; +} LINE_REC; + +typedef struct { + unsigned char buffer[LINE_TEXT_CHUNK_SIZE]; + int pos; + int refcount; +} TEXT_CHUNK_REC; + +typedef struct { + WINDOW_REC *window; + + LINE_REC *first_line; + int lines_count; + + LINE_REC *cur_line; + GString *cur_text; + GSList *cur_info; + + int last_fg; + int last_bg; + int last_flags; + unsigned int last_eol:1; +} TEXT_BUFFER_REC; + +/* Create new buffer */ +TEXT_BUFFER_REC *textbuffer_create(WINDOW_REC *window); +/* Destroy the buffer */ +void textbuffer_destroy(TEXT_BUFFER_REC *buffer); + +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<EOL> 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. */ +LINE_REC *textbuffer_append(TEXT_BUFFER_REC *buffer, + const unsigned char *data, int len, + LINE_INFO_REC *info); +LINE_REC *textbuffer_insert(TEXT_BUFFER_REC *buffer, LINE_REC *insert_after, + const unsigned char *data, int len, + LINE_INFO_REC *info); + +void textbuffer_remove(TEXT_BUFFER_REC *buffer, LINE_REC *line); +/* Removes all lines from buffer, ignoring reference counters */ +void textbuffer_remove_all_lines(TEXT_BUFFER_REC *buffer); +void textbuffer_line_info_free1(LINE_INFO_REC *info); + +void textbuffer_line2text(TEXT_BUFFER_REC *buffer, LINE_REC *line, int coloring, GString *str); +GList *textbuffer_find_text(TEXT_BUFFER_REC *buffer, LINE_REC *startline, + int level, int nolevel, const char *text, + int before, int after, + int regexp, int fullword, int case_sensitive); + +void textbuffer_init(void); +void textbuffer_deinit(void); + +#endif |