summaryrefslogtreecommitdiff
path: root/buffer.c
diff options
context:
space:
mode:
Diffstat (limited to 'buffer.c')
-rw-r--r--buffer.c19
1 files changed, 16 insertions, 3 deletions
diff --git a/buffer.c b/buffer.c
index 41c5d09..6f1b607 100644
--- a/buffer.c
+++ b/buffer.c
@@ -132,6 +132,8 @@ static bool buffer_pos_valid(TextBuffer *buffer, BufferPos p) {
// are there any unsaved changes?
bool buffer_unsaved_changes(TextBuffer *buffer) {
+ if (streq(buffer->filename, TED_UNTITLED) && buffer_empty(buffer))
+ return false; // don't worry about empty untitled buffers
return buffer->modified;
}
@@ -1969,13 +1971,21 @@ void buffer_render(TextBuffer *buffer, Rect r) {
// scroll <= sel - scrolloff
text_state.y -= (float)(buffer->scroll_y - start_line) * char_height;
- gl_color_rgba(colors[COLOR_TEXT]);
+ SyntaxState syntax_state = {0};
+ // dynamic array of character types, to be filled by syntax_highlight
+ SyntaxCharType *char_types = NULL;
for (u32 line_idx = start_line; line_idx < nlines; ++line_idx) {
Line *line = &lines[line_idx];
- for (char32_t *p = line->str, *end = p + line->len; p != end; ++p) {
- char32_t c = *p;
+ if (arr_len(char_types) < line->len) {
+ arr_set_len(char_types, line->len);
+ }
+ syntax_highlight(&syntax_state, LANG_C, line->str, line->len, char_types);
+ for (u32 i = 0; i < line->len; ++i) {
+ char32_t c = line->str[i];
+ SyntaxCharType type = char_types[i];
+ gl_color_rgba(colors[syntax_char_type_to_color(type)]);
switch (c) {
case '\n': assert(0); break;
case '\r': break; // for CRLF line endings
@@ -2003,6 +2013,9 @@ void buffer_render(TextBuffer *buffer, Rect r) {
column = 0;
}
+ arr_free(char_types);
+
+
text_chars_end(font);